sbcl 非法函数调用

sbcl illegal function call

我决定读一点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

很多事情我不明白:

  1. 为什么有些变量没有使用?我在有条件的情况下使用了所有这些......
  2. 为什么函数调用是非法的?如果无法从函数内部调用函数,我该如何组合函数? (我应该可以,但我做错了吗?)

当我注释掉第三个函数时,它加载没有错误。

我已经多次检查条件语法,找不到错误。

如何更正此代码?

去掉多余的左括号。

(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 将求得的任何值(与括号内的所有第一项一样)。没有括号,它知道函数的结果是 cond 的计算结果。

此外,一般性警告:SICP 使用方案,因此您会发现本书与强迫您使用的常见 lisp 宏之间存在一些细微差别。