npt-japanese

% Function REVAPPEND, NRECONC

UP


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)

影響

なし。

例外

なし。

参考

reverse, nreverse, nconc

備考

下記の機能の等号式は真ですが、 良い実装は、通常同じ効果が得られるより速いアルゴリズムを使用しているでしょう。

(revappend list tail) ==  (nconc (reverse list) tail)
(nreconc list tail) ==  (nconc (nreverse list) tail)

TOP, Github