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?我不太清楚那个错误是什么意思

  • 在Lisp中,每一组括号都很重要你不能随意添加额外的括号。特别是,如果你看到
    let
    表单的变量绑定外有两个打开的括号,你可能做错了什么
  • if
    的第一个分支中,您可能需要使用
    progn
  • if
    的第二个分支中,
    (+n1)
    位于错误的位置。相反,将
    (字符行n)
    更改为
    (字符行(+n1))
  • 因此:

    话虽如此,我不知道你的函数想做什么,所以以上只是一个最好的猜测

  • 在Lisp中,每一组括号都很重要你不能随意添加额外的括号。特别是,如果你看到
    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数组中。该行可能包含多个单词,因此一旦到达空格或换行符,我将返回该行的索引。我不想读整行,因为我正在根据其他标准从行中提取其他字符串。好的,re
    incf
    。然后您也必须在那里使用
    progn
    。(如果您想在
    If
    中使用多个表达式,则必须使用
    progn
    )我还没有阅读您的第二个解释,我会继续讲下去。:-)我实际上是指(incfn),其中(+n1)是。我把它改在上面了。不过,我也遇到了同样的错误。该函数一次从一行(字符串)中提取一个字符的单词,然后将它们添加到word-array-2数组中。该行可能包含多个单词,因此一旦到达空格或换行符,我将返回该行的索引。我不想读整行,因为我正在根据其他标准从行中提取其他字符串。好的,re
    incf
    。然后您也必须在那里使用
    progn
    。(如果您想在
    If
    中使用多个表达式,则必须使用
    progn
    )我还没有阅读您的第二个解释,我会继续讲下去。:-)目前,我无法理解底部的功能。在理解它之前,我必须学习更多。这是为了上课,我不想抄袭任何人的作业:)。好吧,你不想只抄袭你的作业就好了!尽管如此,还是需要一点解释来帮助您理解:我的答案末尾的函数的思想不是一个接一个地复制字符,而是找到下一个空格或换行符的位置(如果
    ,则使用
    位置),然后立即获取整个子字符串(使用
    subseq
    )。底部的函数我无法理解,目前。在理解它之前,我必须学习更多。这是为了上课,我不想抄袭任何人的作业:)。好吧,你不想只抄袭你的作业就好了!尽管如此,还是需要一点解释来帮助您理解:我的答案末尾的函数的思想不是一个接一个地复制字符,而是找到下一个空格或换行符的位置(使用
    position if
    ),然后立即获取整个子字符串(使用
    subseq
    )。