2016-08-08 14 views
1

私はSICPを少し読んだだけで、それはすべてについてです(私はMITの学生ではなく、実際にはすでに勉強しています、これは宿題ではありませんが、コンテンツは誰かの宿題かもしれません。 )。私はsbclをインストールしているので、本と比較して構文を少し変更する必要があります。sbcl不正な関数呼び出し

(defun square (x) (* x x)) 

(defun sum-of-squares (x y) 
    (+ (square x) (square y))) 

(defun sum-of-squares-two-max (x y z) (
    (cond 
     ((eq (min x y z) x) (sum-of-squares y z)) 
     ((eq (min x y z) y) (sum-of-squares x z)) 
     (t (sum-of-squares x y)) 
    ))) 

これをロードするには、私はsbcl --load exercise-1.3.lispを実行します。1.3を行使するために私の解決策が機能しない理由しかし、私は理解していません。

; file: /home/xiaolong/development/LISP/SICP/exercise-1.3.lisp 
; in: DEFUN SUM-OF-SQUARES-TWO-MAX 
;  ((COND ((EQ (MIN X Y Z) X) (SUM-OF-SQUARES Y Z)) 
;   ((EQ (MIN X Y Z) Y) (SUM-OF-SQUARES X Z)) (T (SUM-OF-SQUARES X Y)))) 
; 
; caught ERROR: 
; illegal function call 

;  (DEFUN SUM-OF-SQUARES-TWO-MAX (X Y Z) 
;  ((COND ((EQ # X) (SUM-OF-SQUARES Y Z)) ((EQ # Y) (SUM-OF-SQUARES X Z)) 
;    (T (SUM-OF-SQUARES X Y))))) 
; 
; caught STYLE-WARNING: 
; The variable X is defined but never used. 
; 
; caught STYLE-WARNING: 
; The variable Y is defined but never used. 
; 
; caught STYLE-WARNING: 
; The variable Z is defined but never used. 
; 
; compilation unit finished 
; caught 1 ERROR condition 
; caught 3 STYLE-WARNING conditions 

複数の事、私は理解していない:

  1. なぜいくつかの変数が使用されていない、私はそれをロードすると、私はエラーを取得しますか?私は条件付きでそれらのすべてを使用します...
  2. なぜ関数呼び出しが違法ですか?関数の中から関数を呼び出せない場合は、どうすれば関数を作成できますか?

私が3番目の機能をコメントアウトすると、エラーなしで読み込まれます(これは間違いです)。

条件付きの構文を複数回チェックしていますが、間違いを見つけることはできません。

このコードを修正するにはどうすればよいですか?

+0

可能な複製http://stackoverflow.com/questions/16002497/lisp-illegal-function-call? –

+0

標準では、数字と文字を比較するために 'eq'を使って警告します:http://clhs.lisp.se/Body/f_eq.htm代わりに演算子' eql'を使うべきです。数値を比較すると、 '='が一般的です。 –

+0

@StanislavKondratyevありがとう、それを知らなかった。何とか '= '演算子がないと思った。 – Zelphir

答えて

3

余分なオープンパンを取り除く。

(defun sum-of-squares-two-max (x y z) 
    (cond 
     ((eq (min x y z) x) (sum-of-squares y z)) 
     ((eq (min x y z) y) (sum-of-squares x z)) 
     (t (sum-of-squares x y)))) 

問題は括弧で、コードがあなたのcondは(括弧内のすべての最初のアイテムのように)と評価されます何でも呼ぶ、ということです。 parenがなければ、関数の結果はcondと評価されます。

また、一般的な警告:SICPはスキームを使用しているので、この本と、一般的なLispマクロがあなたを強制するものとの間にいくつかの小さな違いがあります。

+0

「かっこの失明」と呼ばれるものがありますか?もしそうなら、私はそれを持っていた!はい、私はSchemeを使ってそれについて知っています:)Common LISPは今日のソフトウェアではより関連性があり、すでにそれを試してみるためにいくつかのWeb開発チュートリアルを探しました。私の印象は間違っている? – Zelphir

+1

@Zelphirあなたの印象についてのあなたの印象は間違いないでしょう、私はあなたにさらに混乱を免れるよう警告していました。また、虹色の括弧を調べて、括弧を簡単に一致させるようにします(ほとんどのエディタには、これらのプラグインベースのサポートがあります)。 –

+2

"呼び出し可能なものに評価する"。申し訳ありませんが、ありません。リストの最初の要素は、標準的な評価規則の中で*評価されません。名前または文字のラムダのいずれかでなければなりません。 – coredump

関連する問題