我写了一个代码来递归地反转列表及其所有子列表:
(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 :(得分: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))