2016-05-15 7 views
2

私はSICPを使い始めました。私はSchemeを初めて使っています。私はこのコードをデバッグしようとしましたが、同様のソリューションと比較しました。Schemeでバインドされていない変数エラーの原因は何ですか?

(def (myFunc x y z) 
    (cond ((and (<= x y) (<= x z)) (+ (* y y) (* z z))) 
      ((and (<= y x) (<= y z)) (+ (* x x) (* z z))) 
      (else (+ (* x x) (* y y))))) 

この関数は、2つの最大値の2乗の和を返します。

私がこれを実行すると、インタプリタは "; Unbound variable:y"を出します。このエラーの原因を説明してください。

ヘルプは大歓迎です:)

答えて

5

を関数定義スキームにおけるプリミティブがdefineと呼ばれている、ではないdef

そのまま、(def ...)の発現はdefの関数呼び出しとして扱われた。したがって、その議論の価値を見いだす必要があった。最初の引数(myFunc x y z)は関数呼び出しであるため、その引数値を見つける必要があります。明らかに、あなたの実装はyの値を最初に見つけたいと思っていました。

The R5RS standard says "オペレータとオペランドの式は(指定されていない順序で)評価され、結果のプロシージャに結果の引数が渡されます。

それはあなたの実装がyその右端の位置で、(なぜならcondand特殊形式を評価する特別な規則の)最初に評価されている(<= x y)につながる、最初の一番右の引数を選択する可能性があります。

+0

ありがとうございます。それは私の問題を解決しました。私はそれを逃してはいけません。私のコードはなぜ「Unbound variable:y」を出したのですか? –

関連する問題