* lisp : 破壊とか非破壊とかの話
[[SANOさんとこ:http://snmsts.dreamhosters.com/wiki/?%C6%FC%B5%AD%A4%C3%A4%DD%A4%AF%2F2007-08-11#i7f0cca5]]の補足のつもり。(だけど補足になれているかどうかは不明)
整理し切れていないので箇条書きで。
update : 2007-08-11 (Sat) 11:07:53
整理し切れていないので箇条書きで。
- Common Lispのオペレータには関数・マクロ・スペシャルフォームがあるけど、この件が関係するのは関数のみ。
- 純粋な意味での「関数」はいくつかの引数をとり、結果を返すということだけをするもの。(数学における意味での「関数」に近い)
- 「関数」が結果を返すこと以外に他へ影響を与えることを副作用という。引数の破壊は副作用の一種。
- 純粋な意味での「関数」として使っていれば、引数の破壊が起こっていてもいなくても同じ結果が得られる。
- それなのにわざわざ副作用をもつ破壊的な関数を用意するのは効率のため。
- 破壊的な関数は同等の非破壊関数で置き換えられる。置き換えられない使い方は間違い。
- 非破壊関数を同等の破壊的な関数で置き換えられるかどうかは、状況次第。
- どっちを使ったら良いか分からないときは非破壊関数を使うべし。効率が悪いかもしれないけれどxyzzyで使う程度の処理で差が出るなんてことはほとんど無いと思う。
- 副作用が目的の関数(vector-popとかvector-pushとか)は引数が変更されても破壊的と称さないっぽい。
update : 2007-08-11 (Sat) 11:07:53