• 締切済み

Lispのリストの破壊

Lispではリストの破壊を行う関数と非破壊的関数がありますがどのようなときにそれらを使い分ければいいのでしょうか? それぞれについてプログラムを行う上でどうゆう利点、欠点があるか知りたいです。

みんなの回答

  • hpsk
  • ベストアンサー率40% (48/119)
回答No.3

破壊関数のほうが効率が良いのは既出の通り. 欠点は,リストが文字通り破壊されてしまうのでそのリストが別の場所から参照されていた場合,思わぬバグを招くことがあること. 使い分けの方針としては,とりあえず非破壊関数で動くものを書いておいて,後から性能上重要なところかつ置き換えても安全だと確信できるところを破壊関数に置き換えていく,というのがよいです. なおNo.2の方の > (setq a (nconc a '(x)) もしくは (nconc a '(x)) というのは,(setq a (nconc a '(x))の代わりに(nconc a '(x))とだけ書くのでもOKという意味ではありません.念のため.

  • notnot
  • ベストアンサー率47% (4901/10362)
回答No.2

動作が異なるので、どちらを使っても同じ結果にケースは限定されます。 (setq a '(a b c)) (setq b a) としたとき、 (setq a (append a '(x)) と (setq a (nconc a '(x)) もしくは (nconc a '(x)) では、b の値が違ってきます。 同じ結果になるケースでは、破壊のほうが効率がいいです。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

非破壊的関数の利点はちょっと考えればわかるはずなので省略. 破壊的関数の利点として重要なのは, (破壊的操作が許されるのなら) メモリが節約できることです.