sbcl非法函数调用

时间:2016-08-08 18:29:54

标签: syntax-error lisp common-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

我不理解的多件事:

  1. 为什么没有使用某些变量?我在条件中使用了所有这些...
  2. 为什么函数调用非法?如果我不能从函数内部调用函数,我该如何编写函数? (我可能可以,但我做错了?)
  3. 当我注释掉第三个函数时,它会加载而没有错误。

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

    如何更正此代码?

1 个答案:

答案 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宏之间的一些细微差别。