(SETF L(展平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

因此,我试图编写一个通用的lisp函数,该函数使用一个预定义的函数flatten(我已经测试过了)获取一个列表,并返回一个没有重复项的平坦列表。但是,我一直遇到此错误:%EXPAND-FORM:(SETF L(flatte L))应该是lambda表达式 我也不知道如何修复它

(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)))))
(您也可以使用
哈希表
,但这可能超出了您的需要范围)