我正在编写一个lisp函数,当我尝试从函数返回x的值时,我继续得到EVAL - 未定义的函数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作为函数
答案 0 :(得分:3)
问题出在isinlist
,它被称为递归(isinlist(x (cdr y)))
。
(x ...)
被解释为函数x
的函数调用。
您可能需要(isinlist x (cdr y))
。
顺便提一下,您可以将isinlist
替换为member
(:key #'cdr :test #'equal
)。