2012-05-12 2 views
0

Я пытаюсь написать программу схемы, которая является самым коротким алгоритмом Дейкстры. В процедуре, когда я расслабляя ребра я получаю ошибку, чтоСхема неправильной формы формы

, некорректные специальную форму (пусть (...)())

Кодекс моей процедуры,

(define relax-over-edge 
    (lambda (distlist edge min-pair) 
    (if (null? distlist) 
     () 
     (if (equal? (cadr edge) (caar distlist)) 
      (if (> (cdar distlist) (+(cdr min-pair) (cddr edge))) 
       (let (((cdar distlist) (+ (cdr min-pair) (cddr edge))))()) 
       () 
      ) 
      (relax-over-edge (cdr distlist) edge min-pair) 
     ) 
    ) 
    ) 
) 

спасибо, что уже сделали.

ответ

5

Конечно это плохо сформированным let:

(let (((cdar distlist) 
     (+ (cdr min-pair) (cddr edge)))) 
    '()) 

Что вы пытаетесь сделать? присвоение выражения (+ (cdr min-pair) (cddr edge)) элементу в позиции (cdar distlist)? это определенно не то, как списки работают в схеме (по крайней мере, не неизменяемых списков), вы не можете присвоить значение такой позиции. Кроме того, только переменные могут быть объявлены в левой части привязки в выражении let, а не в других выражениях (например, в вашем коде).

Вам придется пересмотреть свой алгоритм, либо использовать vector (который делает поддержка на месте модификации элемента в заданном положении), или проверить документацию интерпретатора Scheme, который вы используете, чтобы посмотрите, что он говорит о изменяемых парах и списках.

1

Вы получаете ошибку, потому что тело вашей формы let равно (), что не является допустимым выражением, которое можно оценить. Цитируя guile руководство:

синтаксис: (пусть привязок тела) привязок имеет вид

 ((VARIABLE1 INIT1) ...) 

that is zero or more two-element lists of a variable and an 
arbitrary expression each. All VARIABLE names must be distinct. 

...

* The expressions in BODY are evaluated in order, and the value 
     of the last expression is returned as the value of the `let' 
     expression. 
Смежные вопросы