[SML 7883] 継続(continuation)というスタイル
AOKI Atsushi
atsushi @ cc.kyoto-su.ac.jp
2010年 12月 17日 (金) 11:47:14 JST
青木@京都上賀茂です。
学生たちとのペアプログラミングで、プログラム制御構造スタイル
の総当たり(お復習い)しているところです。階乗計算を例にして
少しだけ皆さんにご披露いたします。
------------------------------------------------------------
【反復】IS (Iteration Style)
| factorial |
factorial :=
[:n |
| a |
(n isInteger not or: [n negative]) ifTrue: [^self error: 'boo!'].
a := 1.
(1 to: n) do: [:i | a := a * i].
a yourself].
factorial value: 10
------------------------------------------------------------
【再帰】RS (Recursion Style)
| factorial |
factorial :=
[:n |
| a |
(n isInteger not or: [n negative]) ifTrue: [^self error: 'boo!'].
n = 0 ifTrue: [a := 1] ifFalse: [a := (factorial value: n - 1) * n].
a yourself].
factorial value: 10
------------------------------------------------------------
【継続】CPS (Continuation Passing Style)
| factorial |
factorial :=
[:n :continuation |
(n isInteger not or: [n negative]) ifTrue: [^self error: 'boo!'].
n = 0
ifTrue: [continuation value: 1]
ifFalse: [factorial value: n - 1 value: [:a | continuation value: a * n]].
n halt].
factorial value: 10 value: [:a | ^a]
階乗ブロック(クロージャ)の最後の「n halt」は実行されること
はない。一切のリターン(応答)が無用(不要)になっている。
------------------------------------------------------------
AOKI Atsushi http://www.cc.kyoto-su.ac.jp/~atsushi/
SML メーリングリストの案内