實施反向和重新啟動

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 ,它是 reverseappend 的組合。從概念上講,它會反轉列表並將其附加到某個尾部:

(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)