私は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
複数の事、私は理解していない:
- なぜいくつかの変数が使用されていない、私はそれをロードすると、私はエラーを取得しますか?私は条件付きでそれらのすべてを使用します...
- なぜ関数呼び出しが違法ですか?関数の中から関数を呼び出せない場合は、どうすれば関数を作成できますか?
私が3番目の機能をコメントアウトすると、エラーなしで読み込まれます(これは間違いです)。
条件付きの構文を複数回チェックしていますが、間違いを見つけることはできません。
このコードを修正するにはどうすればよいですか?
可能な複製http://stackoverflow.com/questions/16002497/lisp-illegal-function-call? –
標準では、数字と文字を比較するために 'eq'を使って警告します:http://clhs.lisp.se/Body/f_eq.htm代わりに演算子' eql'を使うべきです。数値を比較すると、 '='が一般的です。 –
@StanislavKondratyevありがとう、それを知らなかった。何とか '= '演算子がないと思った。 – Zelphir