append の最後の引数はコピーされない!
R5RS
の append の説明には、
The resulting list is always newly allocated, except that it shares
structure with the last list argument.
と書いてある。荒っぽく訳すと、
appendは、いつも新規にアロケートしたリストを結果として返す。
ただし例外があり、最後の引数は構造を共有する。
ということは、(append list ... listN) の listN はコピーされないということか。
今までこんなことも知らずにコードを書いていたとは..... (^^;
実験してみた
> (define lst '(a b c)) > (eq? lst (cdr (append '(a) lst))) ==> #t
確かに、最後の引数(a b c) は共有され、新規のアロケートはされていない。
もちろんこれもアロケートされない
> (eq? lst (append lst)) ==> #t
とにかく最後の引数に () を置けば、みんなアロケートされる
> (eq? lst (cdr (append '(a) lst ()))) ==> #f
単なるリストのコピーをしたければ
> (eq? lst (append lst ())) ==> #f > (equal? lst (append lst ())) ==> #t
0 件のコメント:
コメントを投稿