lisp中未定义的函数

lisp中未定义的函数,lisp,common-lisp,undefined-function,Lisp,Common Lisp,Undefined Function,我正在编写一个lisp函数,当我试图从函数返回x的值时,我不断得到EVAL-undefined函数x (defun p+ (x y) (recurcollect (gluelist x y) '())) (defun isinlist (x y) (if (car y) (if (equal (cdr x) (cdar y)) t (if (cdr y) (isinlist(x (c

我正在编写一个lisp函数,当我试图从函数返回x的值时,我不断得到EVAL-undefined函数x

(defun p+ (x y)
    (recurcollect (gluelist x y) '()))

(defun isinlist (x y)
    (if (car y)
        (if (equal (cdr x) (cdar y))
            t
            (if (cdr y)
                (isinlist(x (cdr y))) 
                NIL))
        NIL))

(defun collectvalue (x y) ;takes an expression and a list and returns the sum of all like expressions from the list
    (if (equal x NIL)
        (print '(x is NIL))
        (if (equal (cdr x) (cdar y)) 
             (if (cdr y)
                (collectvalue (list (+ (car x) (caar y)) (cdr x)) (cdr y))
                (list (+ (car x) (caar y)) (cdr x)))
        (if (cdr y)
            (collectvalue x (cdr y))
            x))))

(defun recurcollect (x y) ;returns a flat list of collected expressions
    (if (isinlist (car x) y)
        (recurcollect (cdr x) y)
        (if (cdr x)
            (recurcollect x (cons y (collectvalue (car x) (cdr x))))
            (cons y (car x)))))

(defun gluelist (x y)
    (if (cdr x)
        (cons (car x) (gluelist (cdr x) y))
        (cons (car x) y)))

(print (p+ '(2 0 1) '(4 0 1)))  ;(6 0 1)

我相信这个错误是由函数末尾的x引起的,但我不明白为什么,因为我能告诉你我的括号是正确配对的,我也不明白为什么它试图将x作为一个函数来计算。

问题在于
isinlist
,它被递归地称为
(isinlist(x(cdr y))
(defun p+ (x y)
    (recurcollect (gluelist x y) '()))

(defun isinlist (x y)
    (if (car y)
        (if (equal (cdr x) (cdar y))
            t
            (if (cdr y)
                (isinlist(x (cdr y))) 
                NIL))
        NIL))

(defun collectvalue (x y) ;takes an expression and a list and returns the sum of all like expressions from the list
    (if (equal x NIL)
        (print '(x is NIL))
        (if (equal (cdr x) (cdar y)) 
             (if (cdr y)
                (collectvalue (list (+ (car x) (caar y)) (cdr x)) (cdr y))
                (list (+ (car x) (caar y)) (cdr x)))
        (if (cdr y)
            (collectvalue x (cdr y))
            x))))

(defun recurcollect (x y) ;returns a flat list of collected expressions
    (if (isinlist (car x) y)
        (recurcollect (cdr x) y)
        (if (cdr x)
            (recurcollect x (cons y (collectvalue (car x) (cdr x))))
            (cons y (car x)))))

(defun gluelist (x y)
    (if (cdr x)
        (cons (car x) (gluelist (cdr x) y))
        (cons (car x) y)))

(print (p+ '(2 0 1) '(4 0 1)))  ;(6 0 1)
(x…
被解释为函数
x
的函数调用。 您可能需要
(isinlist x(cdr y))


顺便说一句,您可以将
isinlist
替换为(使用
:key#'cdr:test#'equal
)。

问题在于
isinlist
中,它被递归地称为
(isinlist(x(cdr y))
(x…
被解释为函数
x
的函数调用。 您可能需要
(isinlist x(cdr y))


顺便说一句,您可以将
isinlist
替换为(使用
:key#'cdr:test#'equal
)。

问题在于
isinlist
中,它被递归地称为
(isinlist(x(cdr y))
(x…
被解释为函数
x
的函数调用。 您可能需要
(isinlist x(cdr y))


顺便说一句,您可以将
isinlist
替换为(使用
:key#'cdr:test#'equal
)。

问题在于
isinlist
中,它被递归地称为
(isinlist(x(cdr y))
(x…
被解释为函数
x
的函数调用。 您可能需要
(isinlist x(cdr y))



顺便说一句,您可以用(with
:key#'cdr:test#'equal
)替换
isinlist

您在尝试定义函数或尝试运行函数时遇到了这个问题吗?你在REPL上到底在评估什么?@L33tminion我运行它时会发生这种情况。我计算的是多项式,每个值都表示为(系数,第一个变量的幂,第二个变量的幂,等等),所以3x^2是(32)3xy^2是(31)2,依此类推。x是单个项,y是表示多项式的项列表。此函数的目的是收集所有类似的术语。请正确格式化您的代码(emacs将为您这样做),并复制和粘贴完整的交互,即您如何调用函数以及Lisp打印的内容。@sds我无法访问emacs,因为我使用的是公用计算机,你能告诉我我的格式哪些方面需要修改吗?你在REPL上运行的到底是什么?你能复制并粘贴准确的东西吗?你是在尝试定义函数时遇到这个问题,还是在尝试运行它时遇到这个问题?你在REPL上到底在评估什么?@L33tminion我运行它时会发生这种情况。我计算的是多项式,每个值都表示为(系数,第一个变量的幂,第二个变量的幂,等等),所以3x^2是(32)3xy^2是(31)2,依此类推。x是单个项,y是表示多项式的项列表。此函数的目的是收集所有类似的术语。请正确格式化您的代码(emacs将为您这样做),并复制和粘贴完整的交互,即您如何调用函数以及Lisp打印的内容。@sds我无法访问emacs,因为我使用的是公用计算机,你能告诉我我的格式哪些方面需要修改吗?你在REPL上运行的到底是什么?你能复制并粘贴准确的东西吗?你是在尝试定义函数时遇到这个问题,还是在尝试运行它时遇到这个问题?你在REPL上到底在评估什么?@L33tminion我运行它时会发生这种情况。我计算的是多项式,每个值都表示为(系数,第一个变量的幂,第二个变量的幂,等等),所以3x^2是(32)3xy^2是(31)2,依此类推。x是单个项,y是表示多项式的项列表。此函数的目的是收集所有类似的术语。请正确格式化您的代码(emacs将为您这样做),并复制和粘贴完整的交互,即您如何调用函数以及Lisp打印的内容。@sds我无法访问emacs,因为我使用的是公用计算机,你能告诉我我的格式哪些方面需要修改吗?你在REPL上运行的到底是什么?你能复制并粘贴准确的东西吗?你是在尝试定义函数时遇到这个问题,还是在尝试运行它时遇到这个问题?你在REPL上到底在评估什么?@L33tminion我运行它时会发生这种情况。我计算的是多项式,每个值都表示为(系数,第一个变量的幂,第二个变量的幂,等等),所以3x^2是(32)3xy^2是(31)2,依此类推。x是单个项,y是表示多项式的项列表。此函数的目的是收集所有类似的术语。请正确格式化您的代码(emacs将为您这样做),并复制和粘贴完整的交互,即您如何调用函数以及Lisp打印的内容。@sds我无法访问emacs,因为我使用的是公用计算机,你能告诉我我的格式哪些方面需要修改吗?你在REPL上运行的到底是什么?你能复制并粘贴准确的东西吗?我想你可能是对的,但由于输入的性质,成员无法工作,它只需要测试cdr的平等性。我添加了建议的
member
关键字arg。我认为你可能是对的,但由于输入的性质,成员无法工作,它只需要测试cdr的平等性。我添加了建议的
成员
关键字arg。我认为您可能是对的,但由于输入的性质,成员无法工作,它只需要测试cdr的平等性。我添加了建议的
成员
关键字arg。我认为您可能是对的,但由于输入的性质,成员无法工作,它只需要测试cdr的相等性