[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 メーリングリストの案内