使用引号的奇怪结果,递归地反转包含所有子列表的列表

时间:2016-12-18 10:23:17

标签: list recursion lisp common-lisp quote

我写了一个代码来递归地反转列表及其所有子列表:

(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),而我不明白为什么。有谁能解释我的问题在哪里?

1 个答案:

答案 0 :(得分: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))