2012-05-12 3 views
0

Dijkstraの最短アルゴリズムであるスキームプログラムを作成しようとしています。私の手順の()...(みましょう())スキームが形成されない特別なフォームlet

コード、

です:病気に形成された特殊な形;私は

がいることを私はエラーを取得するエッジをリラックスしていた手順で

(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)))) 
    '()) 

あなたがする何をしようとしていましたか? (cdar distlist)位置の要素に(+ (cdr min-pair) (cddr edge))式を割り当てますか?それは間違いなくであり、では、少なくともの不変のリストではなく、そのような位置に値を割り当てることはできません。また、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. 
を持っています
関連する問題