这是'我有一个功能。
(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函数中是否仍然存在?不确定那个错误意味着什么。
答案 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)
let
形式的变量绑定之外的双开括号,你可能做错了。if
的第一个分支中,您可能需要使用progn
。if
的第二个分支中,(+ n 1)
位于错误的位置。而是将(char line n)
更改为(char line (+ n 1))
。因此:
(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))
说完这个,我不知道你的功能是怎么做的,所以上面只是最好的猜测。 ; - )