lisp函数中的错误

时间:2011-12-07 23:25:32

标签: lisp

这是'我有一个功能。

(defun add-word-2 (n line)
    (let ((temp-word (make-array 0 :element-type 'character
                 :fill-pointer 0
                 :adjustable t)))
      (vector-push-extend (char line n) temp-word)
      (loop 

        (if (or (char= #\newline (char line (+ n 1)))
                (char= #\space (char line (+ n 1))))
            ((vector-push-extend temp-word *word-array-2*)(return-from add-word-2 n)) 
            ((incf n)(vector-push-extend (char line n) temp-word))))))

我认为在评估为false之后,它会在if函数内部进入底部。我得到的错误是:

Error: Illegal function object: (INCF N).
[condition type: TYPE-ERROR]

这是一个范围问题,在let函数中是否仍然存在?不确定那个错误意味着什么。

2 个答案:

答案 0 :(得分:3)

您收到错误,因为要评估的列表中的第一个位置应该是函数名称。例如在你的else分支中:

((incf n) (vector-push-extend (char line n) temp-word))

(incf n)应该是一个合法的函数名称,但显然不是。如果要将一系列表达式放在只允许一个表达式的情况下,通常的解决方案是progn。所以你的其他分支将成为:

(progn
  (incf n)
  (vector-push-extend (char line n) temp-word))

虽然在这种情况下,你可以利用(incf n)返回n的新值的事实,所以你也可以写:

(vector-push-extend (char line (incf n)) temp-word)

then分支也需要progn

编辑:整个功能的替代实现

在我写完上面的答案后,我在评论中阅读了你的解释,该函数应该做什么。如何实现这样的呢?

(defun add-word-3 (start line)
  (let ((end (position-if (lambda (char) (member char '(#\Newline #\Space)))
                          line
                          :start start)))
    (vector-push-extend (subseq line start end) *word-array-2*)
    end))

答案 1 :(得分:1)

  1. 在Lisp中,每组括号都很重要。 你不能毫不犹豫地添加额外的括号。特别是,如果你看到let形式的变量绑定之外的双开括号,你可能做错了。
  2. if的第一个分支中,您可能需要使用progn
  3. if的第二个分支中,(+ n 1)位于错误的位置。而是将(char line n)更改为(char line (+ n 1))
  4. 因此:

    (if (or ...)
        (progn
         (vector-push-extend temp-word *word-array-2*)
         (return-from add-word-2 n))
        (vector-push-extend (char line (+ n 1)) temp-word))
    

    说完这个,我不知道你的功能是怎么做的,所以上面只是最好的猜测。 ; - )