[SikiLanguage] [式鬼言語航海日誌] 2007-09-03
2007/09/03_000000それでは昨日の続きです。
「昨日といっても日付が変わったばかりだけどね」
今回はメソッド適用です。
式鬼言語ではCLOSに倣ってマルチディスパッチになっています。
どのメソッドを呼び出すかは、スタックに積まれたCellが何かによって決まります。
下記が、今のところ唯一実装しているメソッドですけど、
'test1' 'test2' .. append
このように
- 引数となるCellをスタックに積む
- 引数の数を表すトークンを積む
- メソッドを呼ぶトークンを積む
ということを行います。
実際に動かしてみると
Root::body 'test1' 'test2' .. append Root::tail
Root::body (|Trigger|) 'test2' .. append Root::tail 'test1'
(省略)
Root::body (|Trigger|) Root::tail 'test1' 'test2' .. append
Root::body (String::append(スタックのCellを4つ使用)の命令Cell) Root::tail 'test1' 'test2' .. append
Root::body Root::tail 'test1test2'
となります。
ここでのポイントは「..」というトークンで、このトークンによって引数の数が一意に決まります。
「点の数がその後ろの引数の数、つうことだね」
はい、そうです。
あと、appendを実行するときにも色々と工夫がしてあります。
「そりゃなンだい?」
といっても、大したことではないですが……遅延評価用に、tail列からpopするとき、あるいはtail列のCellを参照するときに処理を行うようにしています。いわゆる遅延評価のforceですね。
Root::body (String::append(スタックのCellを4つ使用)の命令Cell) Root::tail 'test1' 'test2' .. append
Root::body Root::tail 'test1' 'test2' .. append # 2つは要らないので捨てる
Root::body Root::tail 'test1' 'test2' # 'test2'をpopするときにforceを実行 --> 'test2'のまま戻す
Root::body Root::tail 'test1' # 'test1'を参照するときにforceを実行 --> 'test1'のまま戻す String::append中 'test2'
Root::body Root::tail 'test1' String::append中 'test2' ('test1') # 2つをマージ
Root::body Root::tail 'test1test2' String::append中 'test2' ('test1test2')
Root::body Root::tail 'test1test2'
といっても、Stringはforceしてもそのままですので、あまり意味はありませんが……
「Lazyとして造ったCellを遅延評価で使うつうわけだね。移譲とかClosureでも使えるかな?」
そうですね。ただ、実装はこれからですけど……
制作・著作: 野分(nowake) at fiercewinds.net (Creative Commons 表示-継承 2.1 日本)