2009年9月3日木曜日

schemeメモ - appendの最後の引数

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 件のコメント:

コメントを投稿