Software Engineering Lecture 6/6

Software Engineering Lecture 6/6



defstruct

defstructを使ったプログラム

副作用を持つプログラミング

副作用を持つプログラミングも以下のように考えれば、入力と 出力の組合せで表された関数と考えることができる。

   入力、関数実行前の変数の値
から
   出力、関数実行後の変数の値
への関数
したがって、副作用を持つ関数を使ったプログラミングでは関数の 実行順序が重要である。例えば、
(f (g a) (h b) (i c))
という関数呼出を考えよう。これを、
(setf z (i c))
(setf y (h b))
(setf x (g a))
(f x y z)
というように実行しても、i,h,g に副作用が無ければ、実行結果に 変わりはない。しかし、i,h,g に副作用がある時は、結果が異なる 場合もある。

もし、遅延実行という技術を使うと、Pure LISPの実行順序を、 極めて自由に設定することができる。例えば上の例で f を 一番先に実行するということも可能になる。この性質を並列 計算機に応用したり、計算可能な範囲を理論的に広げたり する研究が行なわれている。(が、あまり実用化は進んでいない)

ただし、以下のような技術がCommon LispやCでも重要である。

残念ながら副作用のあるプログラムをこれらの技術と組み合わせる ことはそれほど簡単ではない。

一般的に、副作用が無いプログラムの方が安全なプログラムだという ことはできる。しかし、副作用の無いプログラムは実は長い引数 を持つ関数を必要とすることが多く、複雑なプログラム技術を 必要とすることも多い。

副作用のあるプログラムは、実行順序ごとに分けて細かく プログラムされることが多い。defstruct などのサポート があることもあり、Common Lispではこちらのプログラミング が中心である。しかし、defstruct を多用するとプログラム 自身は複雑になることが多い。



実行順序を変更する



同じような動作をするプログラム

Prev Next Kono's home page