ホーム   最近   SikiWiki   編集   新規 

[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 日本)