lisp函数中的错误
这里有一个函数lisp函数中的错误,lisp,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=
(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函数中是否仍然存在n?我不太清楚那个错误是什么意思
let
表单的变量绑定外有两个打开的括号,你可能做错了什么if
的第一个分支中,您可能需要使用progn
if
的第二个分支中,(+n1)
位于错误的位置。相反,将(字符行n)
更改为(字符行(+n1))
let
表单的变量绑定外有两个打开的括号,你可能做错了什么if
的第一个分支中,您可能需要使用progn
if
的第二个分支中,(+n1)
位于错误的位置。相反,将(字符行n)
更改为(字符行(+n1))
话虽如此,我不知道你的函数想做什么,所以以上只是一个最好的猜测 之所以会出现错误,是因为列表中第一个被计算的位置应该是函数名。例如,在else分支中:
((incf n) (vector-push-extend (char line n) temp-word))
(incf n)
应该是合法的函数名,但显然不是。如果要将表达式序列放在只允许一个表达式的位置,通常的解决方案是progn
。因此,您的else分支将成为:
(progn
(incf n)
(vector-push-extend (char line n) temp-word))
尽管在这种情况下,您可以利用(incf n)
返回n
的新值这一事实,因此您也可以编写:
(vector-push-extend (char line (incf n)) temp-word)
then分支也应该需要一个程序
编辑:整个功能的替代实现
在我写了上面的答案之后,我在一条评论中阅读了您的解释,该函数应该做什么。这样实施怎么样
(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))
之所以出现此错误,是因为列表中第一个被求值的位置应该是函数名。例如,在else分支中:
((incf n) (vector-push-extend (char line n) temp-word))
(incf n)
应该是合法的函数名,但显然不是。如果要将表达式序列放在只允许一个表达式的位置,通常的解决方案是progn
。因此,您的else分支将成为:
(progn
(incf n)
(vector-push-extend (char line n) temp-word))
尽管在这种情况下,您可以利用(incf n)
返回n
的新值这一事实,因此您也可以编写:
(vector-push-extend (char line (incf n)) temp-word)
then分支也应该需要一个程序
编辑:整个功能的替代实现
在我写了上面的答案之后,我在一条评论中阅读了您的解释,该函数应该做什么。这样实施怎么样
(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))
我实际上是指(incfn),其中(+n1)是。我把它改在上面了。不过,我也遇到了同样的错误。该函数一次从一行(字符串)中提取一个字符的单词,然后将它们添加到word-array-2数组中。该行可能包含多个单词,因此一旦到达空格或换行符,我将返回该行的索引。我不想读整行,因为我正在根据其他标准从行中提取其他字符串。好的,reincf
。然后您也必须在那里使用progn
。(如果您想在If
中使用多个表达式,则必须使用progn
)我还没有阅读您的第二个解释,我会继续讲下去。:-)我实际上是指(incfn),其中(+n1)是。我把它改在上面了。不过,我也遇到了同样的错误。该函数一次从一行(字符串)中提取一个字符的单词,然后将它们添加到word-array-2数组中。该行可能包含多个单词,因此一旦到达空格或换行符,我将返回该行的索引。我不想读整行,因为我正在根据其他标准从行中提取其他字符串。好的,reincf
。然后您也必须在那里使用progn
。(如果您想在If
中使用多个表达式,则必须使用progn
)我还没有阅读您的第二个解释,我会继续讲下去。:-)目前,我无法理解底部的功能。在理解它之前,我必须学习更多。这是为了上课,我不想抄袭任何人的作业:)。好吧,你不想只抄袭你的作业就好了!尽管如此,还是需要一点解释来帮助您理解:我的答案末尾的函数的思想不是一个接一个地复制字符,而是找到下一个空格或换行符的位置(如果
,则使用位置),然后立即获取整个子字符串(使用subseq
)。底部的函数我无法理解,目前。在理解它之前,我必须学习更多。这是为了上课,我不想抄袭任何人的作业:)。好吧,你不想只抄袭你的作业就好了!尽管如此,还是需要一点解释来帮助您理解:我的答案末尾的函数的思想不是一个接一个地复制字符,而是找到下一个空格或换行符的位置(使用position if
),然后立即获取整个子字符串(使用subseq
)。