ホーム   最近   SikiWiki   編集   新規 

[SikiLanguage] [式鬼言語航海日誌] 2007-09-15

2007/09/15_000000




今日は条件分岐──if文ですね。

「といっても、まともな実装じゃないンだろうねぇ」

まあ、せっかくForthベースにしていますからね。式鬼言語の条件分岐は、

  • 三項演算子による表記
  • メッセージで実行されるメソッド

という特徴があります。

三項演算子はCとかで使われているアレですね。こんな感じの記載になります。

true ? 'true' ! 'false' true ? 'true' # 肯定のみ実行 false ?! 'false' # 否定のみ実行 'test' ? 'true' # 普通のCellはtrueと同じ挙動

'true'、'false'の部分は1つの塊である必要があります。ブロックか条件分岐かということですね。

条件分岐の連結にも対応しています。

true ? true ? 'tt' ! 'ft' ! true ? 'ft' ! 'ff' # 'tt'になる

「こうなるとさすがに判り辛いな」

で、条件分岐の挙動についてですけど、これは実際の挙動を見てもらった方が早いですね。

# true ? 'true' ! 'false' Root::body true ?! (肯定時の命令列を持っているCell) (否定時の命令列を持っているCell) Root::tail Root

Root::body ?! (肯定時の命令列を持っているCell) (否定時の命令列を持っているCell) Root::tail true Root

Root::body (肯定時の命令列を持っているCell) (否定時の命令列を持っているCell) Root::tail (true <- ?!) # tailの一番上に積まれたCellに?!というメッセージを飛ばす Root

Root::body 'true' # 肯定時の命令列を持っているCellの中身を展開 # 否定時の命令列を持っているCellを削除 Root::tail Root

実行する前の命令列を直接弄ることのできるForth系の特性を活かした実装ですね。Lispなんかですとマクロとかで実装するのですけど、Forthではそんなことする必要ありません。

「Forthでも暗黒魔法扱いされたりするけどねぇ」

否定条件を実行するときは、falseというCellに?!を飛ばします。

falseは?!のメッセージに反応して、通常のCellとは反対の

  • 否定時の命令列を持っているCellの中身を展開
  • 肯定時の命令列を持っているCellを削除

という動作をします。

# false ? 'true' ! 'false' Root::body false ?! (肯定時の命令列を持っているCell) (否定時の命令列を持っているCell) Root::tail Root

Root::body ?! (肯定時の命令列を持っているCell) (否定時の命令列を持っているCell) Root::tail false Root

Root::body (肯定時の命令列を持っているCell) (否定時の命令列を持っているCell) Root::tail (false <- ?!) # tailの一番上に積まれたCellに?!というメッセージを飛ばす Root

Root::body 'false' # 否定時の命令列を持っているCellの中身を展開 # 肯定時の命令列を持っているCellを削除 Root::tail Root

といった感じですね。

「しかし、妙に重いねぇ。条件が複雑になると途端にダメダメになるね」

そうですね──パーザーが悪いのかな? ちょっと効率化してみよう……





制作・著作: 野分(nowake) at fiercewinds.net (Creative Commons 表示-継承 2.1 日本)