(SETF L(展平L))应为lambda表达式错误
因此,我试图编写一个通用的lisp函数,该函数使用一个预定义的函数flatten(我已经测试过了)获取一个列表,并返回一个没有重复项的平坦列表。但是,我一直遇到此错误:%EXPAND-FORM:(SETF L(flatte L))应该是lambda表达式 我也不知道如何修复它(SETF L(展平L))应为lambda表达式错误,lambda,lisp,common-lisp,Lambda,Lisp,Common Lisp,因此,我试图编写一个通用的lisp函数,该函数使用一个预定义的函数flatten(我已经测试过了)获取一个列表,并返回一个没有重复项的平坦列表。但是,我一直遇到此错误:%EXPAND-FORM:(SETF L(flatte L))应该是lambda表达式 我也不知道如何修复它 (defun eliminateDuplicates (L) ((setf L (flatten L)) (cond ((null L) L) ((member (car L) (cdr
(defun eliminateDuplicates (L)
((setf L (flatten L))
(cond ((null L) L)
((member (car L) (cdr L))
(eliminateDuplicates (cdr L)))
(t (cons (car L) (eliminateDuplicates (cdr L)))))))
括号太多:
((setf ... ...) ...)
当表单在正常评估上下文(例如,非绑定)中看起来像这样时:
如果F
不是宏,那么F
应该是一个函数,或者是一个命名现有函数的符号,或者是一个lambda表达式,(lambda(y)…
)。这里,F
不是lambda表达式,因为它是(setf…)
还请注意,由于递归调用函数,因此将继续对列表的每个子列表调用flatten
。您可能希望将函数拆分为两个,一个用于删除展开列表中的重复项,另一个用于在(展开L)
上调用第一个函数。例如,您可以将其重写如下(请注意符号是如何用破折号(不是大写字母)分隔的,以及代码的格式):
还要注意的是,在if
的两个分支中,您递归调用消除重复
函数。您还可以在if
之外计算它,并将其绑定到某个变量。结果列表的元素数相同或更少。在该列表上调用成员
可能更有效,因为它可能更短
(defun eliminate-duplicates (list)
(when list
(let ((rest (eliminate-duplicates (rest list))))
(if (member head rest) rest (cons head rest)))))
(您也可以使用
哈希表
,但这可能超出了您的需要范围)括号太多:
((setf ... ...) ...)
当表单在正常评估上下文(例如,非绑定)中看起来像这样时:
如果F
不是宏,那么F
应该是一个函数,或者是一个命名现有函数的符号,或者是一个lambda表达式,(lambda(y)…
)。这里,F
不是lambda表达式,因为它是(setf…)
还请注意,由于递归调用函数,因此将继续对列表的每个子列表调用flatten
。您可能希望将函数拆分为两个,一个用于删除展开列表中的重复项,另一个用于在(展开L)
上调用第一个函数。例如,您可以将其重写如下(请注意符号是如何用破折号(不是大写字母)分隔的,以及代码的格式):
还要注意的是,在if
的两个分支中,您递归调用消除重复
函数。您还可以在if
之外计算它,并将其绑定到某个变量。结果列表的元素数相同或更少。在该列表上调用成员
可能更有效,因为它可能更短
(defun eliminate-duplicates (list)
(when list
(let ((rest (eliminate-duplicates (rest list))))
(if (member head rest) rest (cons head rest)))))
(您也可以使用哈希表
,但这可能超出了您的需要范围)