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
很多事情我不明白:
- 为什么有些变量没有使用?我在有条件的情况下使用了所有这些......
- 为什么函数调用是非法的?如果无法从函数内部调用函数,我该如何组合函数? (我应该可以,但我做错了吗?)
当我注释掉第三个函数时,它加载没有错误。
我已经多次检查条件语法,找不到错误。
如何更正此代码?
去掉多余的左括号。
(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 宏之间存在一些细微差别。
我决定读一点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
很多事情我不明白:
- 为什么有些变量没有使用?我在有条件的情况下使用了所有这些......
- 为什么函数调用是非法的?如果无法从函数内部调用函数,我该如何组合函数? (我应该可以,但我做错了吗?)
当我注释掉第三个函数时,它加载没有错误。
我已经多次检查条件语法,找不到错误。
如何更正此代码?
去掉多余的左括号。
(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 宏之间存在一些细微差别。