2016-12-18 2 views
0

Я написал код, чтобы отменить список и все его подсписки рекурсивно:странных результаты, используя цитаты, реверсивный список со всеми подсписками рекурсивны

(defun rev1(list final) 
    (if (eq list()) 
     final 
     (if (atom (car list)) 
      (rev1(cdr list) (cons (car list) final)) 
      (rev1(cdr list) (cons (rev1(car list)()) final))))) 

(defun rev(list) 
    (rev1 list())) 

Проблема заключается в том, что если я вызываю функцию с: (rev '(1 2 '(3 2 1) 3)) ожидаемыми вывод должен быть (3 (1 2 3) 2 1), но вместо этого я получаю: (3 ((1 2 3) QUOTE) 2 1), и я не понимаю, почему. Может ли кто-нибудь объяснить мне, где проблема?

+0

http://dept-info.labri.u-bordeaux.fr/~idurand/enseignement/PFS/Common/Strandh- Tutorial/indentation.html – coredump

+0

Возможный дубликат [Когда использовать цитату в Lisp] (http://stackoverflow.com/questions/134887/when-to-use-quote-in-lisp) – sds

ответ

3

Символ ' - это считывающий макрос, то есть считыватель Lisp расширит его до вызова quote. CLHS entry on quote дает следующие примеры оценки:

'a => A 
''a => (QUOTE A) 

Следовательно:

(rev (list 'a)) =>  (A) 
(rev (list ''a)) =>  ((A QUOTE)) 
(rev ''a)  =>  (A QUOTE) 
(rev '(a))  =>  (A) 
(rev '('a))  =>  ((A QUOTE)) 
Смежные вопросы