Lisp非法函数调用,

时间:2013-04-14 18:07:16

标签: compiler-errors lisp common-lisp

以下代码不断引发以下错误:

 caught ERROR:

illegal function call

     (LET ((SOLUTION 'NIL) (FIRST 0) (SECOND 0))
       (DOLIST (EL LST)
         (IF (NUMBERP EL)
             (PUSH EL SOLUTION)
             ((SETF #) (SETF #) (PUSH # SOLUTION))))
       (CAR SOLUTION))

谁能明白为什么?从语法上来说,我看不出它有什么问题。 注意:我正在使用sbcl。

我的代码:

(defun evalpostfix (lst)
  (let ((solution '())
        (first 0)
        (second 0))
    (dolist (el lst)
      (if (numberp el) ;if
          (push el solution) ;then
          ((setf second (pop solution)) ;else
             (setf first (pop solution))
             (push (funcall el first second) solution))))
    (car solution)))

2 个答案:

答案 0 :(得分:5)

((setf second (pop solution)) - 两个开头的括号?为什么?带有else表单的IF语法为:

(if test-form then-form else-form)

表单不能以两个括号开头 - 只有一个例外:((lambda (x) (+ x 1)) 2)

如果要对多个表达式进行分组,请使用(progn a b c ... z)

之类的内容

答案 1 :(得分:0)

实际上,为了将多个表单组合在一起,请使用特殊运算符progn

您可以更进一步,将一致的setf电话组合在一起:

(setf second (pop solution)
      first  (pop solution))