我写了一段代码来递归地反转一个列表及其所有子列表:
(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)
我不明白为什么。谁能告诉我问题出在哪里?
最佳答案
'
字符是阅读器宏,即 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))
关于list - 使用引号的奇怪结果,递归地反转包含所有子列表的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41207410/