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

标签 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) 我不明白为什么。谁能告诉我问题出在哪里?

最佳答案

' 字符是阅读器宏,即 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/

相关文章:

lisp - 如何使用双 float ?

c++ - 如何使用迭代器计算列表的值?

java - 异步原子数组

list - 在Scheme中的列表中添加元素

java - 我如何在 Java 中优化这两个相互递归的函数?

Lisp:找到与 fset 等效的 setf 方法

Lisp:为什么引入词法作用域后 `eval` 失宠了?

r - 如何从 get_friends 函数返回的 tibbles 列表中删除空的 tibbles?

c++ - gcc 4.7 和递归 constexpr 函数

c - 在 C 中使用递归函数测试回文