% Function REVAPPEND, NRECONC
Function REVAPPEND, NRECONC
revappend list tail => result-list
nreconc list tail => result-list
list - 通常のリスト
tail - オブジェクト
result-list - オブジェクト
revappendは、listの各要素を逆順でコピーします。
そして、逆順のリストにtailを(nconcのように)追加し、
その結果を返却します。
nreconcは、listの要素を(nreverseのように)反転させます。
そして、逆順のリストにtailを(nconcのように)追加し、
その結果を返却します。
結果のリストは、tailとリスト構造を共有します。
(let ((list-1 (list 1 2 3))
(list-2 (list 'a 'b 'c)))
(print (revappend list-1 list-2))
(print (equal list-1 '(1 2 3)))
(print (equal list-2 '(a b c))))
>> (3 2 1 A B C)
>> T
>> T
=> T
(revappend '(1 2 3) '()) => (3 2 1)
(revappend '(1 2 3) '(a . b)) => (3 2 1 A . B)
(revappend '() '(a b c)) => (A B C)
(revappend '(1 2 3) 'a) => (3 2 1 . A)
(revappend '() 'a) => A ;degenerate case
(let ((list-1 '(1 2 3))
(list-2 '(a b c)))
(print (nreconc list-1 list-2))
(print (equal list-1 '(1 2 3)))
(print (equal list-2 '(a b c))))
>> (3 2 1 A B C)
>> NIL
>> T
=> T
revappendは、どんな引数も修正しません。
nreconcは、listの修正を許可しますが、tailはそうではありません。
違った実装になるかもしれませんが、
nreconcは、下記の動作と同等の副作用を持つように制限されています。
(nconc (nreverse list) tail)
なし。
なし。
下記の機能の等号式は真ですが、 良い実装は、通常同じ効果が得られるより速いアルゴリズムを使用しているでしょう。
(revappend list tail) == (nconc (reverse list) tail)
(nreconc list tail) == (nconc (nreverse list) tail)