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