2016-03-17 3 views
-1

Привет Я пытаюсь удалить нежелательные переменные из своего списка. Это моя функция:Удаление нежелательных переменных

(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 

есть способ, чтобы удалить скобки и не из списка? Любое руководство было бы оценено, если бы список был больше с b c d i, я хотел бы удалить все экземпляры нет и круглые скобки. Я предполагаю, что псевдокод будет проходить через проверку, если «() или не существует в x», а затем удалить их из списка

+1

скобка не может быть удалена. Это всего лишь артефакт печати списка. Если есть список, Lisp нуждается в круглых скобках вокруг них. 'NOT',' A', 'B', ... не являются переменными в списке, они являются символами. –

ответ

1

Ваш текущий код прокручивает и печатает каждый элемент списка без каких-либо условий.

Когда вы передаете его (A (NOT B) C), он печатает каждый элемент, одним из которых является список (NOT B), и цикл печатает этот список. Скобки выводятся принтером для представления того, что напечатанный элемент является списком.

Вам нужна логика для проверки того, что каждый элемент является тем, что вы хотели бы напечатать, например, символ NOT или ноль, и отложите его, когда вы увидите что-то, что вы хотите изучить дальше, например список.

+2

Цитаты не являются частью структур данных. ''(a b c)' не является списком, '(a b c)' является списком. Цитата используется только для предотвращения оценки. –

+0

Я так понимаю, я печатал его, когда я набирал его в REPL, в основном по привычке. Спасибо за редактирование и комментарий. Я также думал, что, возможно, я должен уточнить, что круглые скобки не являются частью списка, но печатаются принтером, поэтому я просто сделаю это сейчас. –

2

Простое решения выравниваться список и удалите НЕ как это:

(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)) 

Надеется, что это помогает

Смежные вопросы