我决定稍微阅读SICP,只是为了看看它是什么(我不是麻省理工学院的学生,实际上已经差不多完成了学习,这不是功课,但内容可能是某人的功课。)。因为我已经安装了sbcl,所以与本书相比,我必须稍微改变语法。但是,我不明白为什么我的练习1.3的解决方案无效:
(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
。当我加载它时,我收到错误:
; 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
我不理解的多件事:
当我注释掉第三个函数时,它会加载而没有错误。
我已经多次检查了条件的语法,找不到错误。
如何更正此代码?
答案 0 :(得分:3)
摆脱额外开放的paren。
(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))))
问题在于,对于paren,代码将调用您cond
将评估的任何内容(与parens中的所有第一项一样)。没有paren,它知道函数的结果是cond
评估的结果。
另外,一般警告:SICP使用方案,因此您会看到本书与常见的lisp宏之间的一些细微差别。