hs2bf - Hello World?
case式の変換を実装したので、ようやくHello Worldできます。しかし・・・
動作モデルの変更
G-machineでcaseの評価を行うときにはその式をforceする必要があります。
そこで
から
へ変更しました。特にスタックの仕様を変更をしなくとも、単に要素の数が1つかどうか調べるだけで、その式をE型として実行するべきか分かります。
(もしそうでなければ、事前にpushしておいた続きのコードブロックへのidに飛ぶ)
比較
手書きのBF(112命令,390ステップ,Wikipediaより):
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.
Haskellのコード:
main=outputStr Halt "Hello World!" outputStr k []=k outputStr k (x:xs)=Output x (outputStr k xs)
を
変換した物(124711命令,1051859235ステップ):
- http://www.xanxys.net/public/hs2bf_hello.txt (BFでは最も長いhello worldだと思います)
変換過程:
なぜせっかく作ったbfvprofでの絵がないのかというと、ステップ数を見ていただけると分かるように、絵を描かせるのが結構難しいのです。
しかも実はこの比較はいんちきで、「手書き」の例にある改行がありません。改行があるとヒープに確保するノード数が255個を越えてしまうようです。(GCはまだ実装していません)
さてさて
前にリバーシ(with AI)を作ると言いましたが、早くも暗雲が立ちこめてきたようです。
何か
- まぁまぁ簡単に実装できて
- 劇的に速くなる(100倍くらい)
最適化はないんでしょうかね・・・。