删除不需要的变量

时间:2016-03-17 05:51:54

标签: lisp common-lisp

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

(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

有没有办法从列表中删除括号和not?如果列表更大,并且b c d我想删除所有not和括号的实例,那么任何指导都会受到赞赏。我想是什么伪代码将循环检查“x”中是否存在“()”然后从列表中删除

2 个答案:

答案 0 :(得分:2)

一个简单的解决方案是将列表展平并删除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))

希望有所帮助

答案 1 :(得分:1)

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

当你传递(A (NOT B) C)时,它会打印每个元素,其中一个是列表(NOT B),循环正在打印该列表。打印机输出括号,表示正在打印的元素是列表。

你需要一些逻辑来检查每个元素是否是你想要不打印的东西,比如符号NOT或者nil,当你看到你想要进一步检查的东西时,你需要进行递归,例如作为清单。