1

以下のコードは、次のエラーをスローし続けます。

 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)))
4

2 に答える 2

5

((setf second (pop solution))- 開き括弧が 2 つ? なんで?IFelse フォームの構文は次のとおりです。

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

フォームは 2 つの括弧で始めることはできません。例外は((lambda (x) (+ x 1)) 2).

複数の式をグループ化したい場合は、 のようなものを使用します(progn a b c ... z)

于 2013-04-14T18:10:22.477 に答える
0

実際、複数のフォームをグループ化するには、特殊な演算子を使用しますprogn

さらに一歩進んで、一連のsetf呼び出しをまとめてグループ化できます。

(setf second (pop solution)
      first  (pop solution))
于 2013-04-15T09:10:39.447 に答える