Lisp 删除不需要的变量

Lisp 删除不需要的变量,lisp,common-lisp,Lisp,Common Lisp,嗨,我正在尝试从列表中删除不需要的变量。 这是我的职责: (defun remove-vars (list) (loop for x in list do (print x)))) 我想通过这个(获取vars'(A(不是B)C)) 并打印出来 A B C 但我却在打印 A (NOT B) C Nil 有没有办法从列表中删除括号和not?如果列表中有一个b c d较大,我希望删除所有not和括号的实例,请提供任何指导。我猜什么样的伪代码可以循环检查“()”是否存在于x中

嗨,我正在尝试从列表中删除不需要的变量。 这是我的职责:

(defun remove-vars (list)
  (loop for x in list do
         (print x))))
我想通过这个
(获取vars'(A(不是B)C))
并打印出来

A
B
C
但我却在打印

A
(NOT B)
C
Nil

有没有办法从列表中删除括号和not?如果列表中有一个b c d较大,我希望删除所有not和括号的实例,请提供任何指导。我猜什么样的伪代码可以循环检查“()”是否存在于x中,然后从列表中删除它们

您当前的代码无条件地循环并打印列表中的每个元素

当您传递它时,它将打印每个元素,其中一个元素是列表
(不是B)
,循环将打印该列表。括号由打印机输出,表示正在打印的元素是一个列表


您需要一些逻辑来检查每个元素是否是您不希望打印的元素,如符号
not
或nil,并在看到需要进一步检查的元素时向下递归,如列表。

一个简单的解决方案是展平列表并删除not,如下所示:

(defun flatten (var-list)
  (cond ((null var-list) nil)
        ((atom var-list) (list var-list))
        (t (mapcan #'flatten var-list))))

(defun get-vars (var-list)
  (remove 'NOT (flatten var-list)))

(get-vars '(A (NOT B) C))

希望能有所帮助

引号不是数据结构的一部分<代码>'(abc)不是列表,
(abc)
是列表。引用仅用于阻止评估。我理解,我键入它就像在REPL中键入一样,主要是出于习惯。谢谢你的编辑和评论。我还想我应该更清楚地说明括号不是列表的一部分,而是由打印机打印的,所以我现在就这么做。括号不能删除。它们只是打印列表的产物。如果有一个列表,Lisp需要用括号括起来<代码>非,
A
B
。。。不是列表中的变量,而是符号。