删除不需要的变量

Removing unwanted variables

您好,我正在尝试从列表中删除不需要的变量。 这是我的功能:

(defun remove-vars (list)
  (loop for x in list do
         (print x))))

我要传这个(get-vars '(A (NOT B) C)) 并打印出

A
B
C

但我正在打印出来

A
(NOT B)
C
Nil

有没有办法从列表中删除括号和非?如果列表更大且带有 a b c d 我想删除所有 not 和括号的实例,我们将不胜感激。我猜想循环检查“( ) 或 x 中是否存在”然后从列表中删除它们的伪代码是什么

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

当您传递它 (A (NOT B) C) 时,它会打印每个元素,其中之一是列表 (NOT 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))

希望对您有所帮助