实施反向和重新启动
Common Lisp 已经具有反向功能,但如果没有,则可以使用 reduce 轻松实现。给出一个列表
(1 2 3) === (cons 1 (cons 2 (cons 3 '())))
颠倒的清单是
(cons 3 (cons 2 (cons 1 '()))) === (3 2 1)
这可能不是减少的明显用法,但如果我们有一个逆向缺点功能,比如 xcons ,那么
(xcons 1 2) === (2 . 1)
然后
(xcons (xcons (xcons () 1) 2) 3)
这是减少。
(reduce (lambda (x y)
(cons y x))
'(1 2 3 4)
:initial-value '())
;=> (4 3 2 1)
Common Lisp 有另一个有用的函数, revappend ,它是 reverse 和 append 的组合。从概念上讲,它会反转列表并将其附加到某个尾部:
(revappend '(3 2 1) '(4 5 6))
;;=> (1 2 3 4 5 6)
这也可以通过 reduce 实现。事实上,它与上面的反向实现相同,只是初始值需要 (4 5 6) 而不是空列表。
(reduce (lambda (x y)
(cons y x))
'(3 2 1)
:initial-value '(4 5 6))
;=> (1 2 3 4 5 6)