MTDDC Hokkaido : テンプレートタグでBrainf*ckを作ってみた

3,231
-1

Published on

MTDDC Hokkaido(2010/12/18)でライトニングトークした時のスライドです。

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
3,231
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
2
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

MTDDC Hokkaido : テンプレートタグでBrainf*ckを作ってみた

  1. 1. テンプレートタグでBrainf*ckを 作ってみた MTDDC Hokkaido 2010/12/18 えんどうかつひろ
  2. 2. 自己紹介● えんどうかつひろ ● @ka2hiro● フリーランスのプログラマ● MT歴 ● 4年ほど(2006年頃から) ● プラグイン書いたり、MTベースのWeb App書いた り● 好きなテンプレートタグ ● mt:setVarTemplate と mt:date
  3. 3. 今日お話すること● Brainf*ckを書いていて、はまったこと
  4. 4. きっかけ?● 単なる思いつき● テンプレートタグって、プログラミング言語だ よね。 ● 変数あるし ● 四則演算できるし ● 条件分岐できるし ● ループもできるし ● 配列もハッシュもあるし
  5. 5. それに...● MT、テンプレートタグ、Brainfuckで、軽くぐ ぐってみたけど、全然ヒットしない。● ってことは、これは...
  6. 6. ということでBrainf*ckのインタープリタを 書いてみた。
  7. 7. ところでBrainf*ckって何?
  8. 8. “Brainfuck(ブレインファック)は難解プログラミング言語のひとつ。 なお名称に卑語が含まれるた め、Brainf*ckなどと表記されるこ とがある。” wikipediaより
  9. 9. 使える命令はこの↓8文字 ><+-.,[] だけ。
  10. 10.
  11. 11. +++++++++[>++++++++>+++++++++++>+++++<<<-]>.>++. +++++++..+++.>-.------------.<+++++ +++.--------.++ +.------.--------.>+.
  12. 12. これを実行すると
  13. 13. Hello World!
  14. 14. と表示するプログラミング言語。
  15. 15. で、書いてみたら、書けた。でも、けっこうはまった。
  16. 16. ここからが今日の本題。
  17. 17. はまったその1文字列中の任意の場所から1文字 だけ読み込む。
  18. 18. <mt:setvarblock name=”hoge”>The quick brown fox jumps over the lazy...</mt:setvarblock> ”Q”を表示するのに、<mt:var name=”hoge” substr=”4,1” setvar=”c”/> と書けると思っていたら、 substrモディファイア なんてなかった。
  19. 19. 仕方がないので、困った時の 「正規表現」 にお願いしてみた。
  20. 20. 正規表現 /(?:.{<mt:var name="pos" />})(.)(?:.*)/● posは、取得したい文字の位置(最初の文字は0番目)● 1つ目のかっこは読み飛ばす部分● 2つ目のかっこが取得したい文字● 3つ目のかっこは残りの文字(必要ないかも)● posが3の場合、/(?:.{3})(.)(?:.*)/ となる● $1で1文字取得できる
  21. 21. まとめるとこうなる。<mt:setvartemplate name="getchar"><mt:setvarblock name="pattern">/(?:.{<mt:var name="pos" />})(.)(?:.*)/</mt:setvarblock><mt:var name="code" regex_replace="$pattern","1" setvar="c"/></mt:setvartemplate>
  22. 22. これで1文字ずつ読み込めるようになった。
  23. 23. はまったその2無限ループを作れない。
  24. 24. <mt:loop>は、配列の要素をたど ることしかできないし、<mt:for>はto=”N”で指定した回 数しかループできないし、 どうしよう...
  25. 25. ちょっとかっこ悪いけど、<mt:for var=”i” from=”0” to=”1000”>大きめの数値を終了条件にして、 ごまかした。
  26. 26. はまったその3ループから脱出できない!
  27. 27. <mt:for var=”i” from=”0” to=”1000”> <mt:if name=”i” eq=”5”> <mt:setvar name=”i” value=”1000” /> ループ変数に終了条件を満たす値を 設定しても脱出できない! </mt:if></mt:for>
  28. 28. どうやらループ内では、ループ変数の参照はできるが、変更は反映されないようだ。
  29. 29. 仕方がないので、<mt:for var=”i” from=”0” to=”1000”> <mt:if name=”done” ne=”1”> 必要な処理を実施し、 終了条件を満たしたらdoneに1をセット    </mt:if></mt:for> とした。でもこれだと...
  30. 30. 10回目で終了条件を満たすと、 残り990回は、 無駄に空回り。┐(´-`)┌
  31. 31. はまったその4 完成したテンプレートを 編集画面に貼付け、プレビューしても真っ白け。
  32. 32. テンプレートのコンパイル結果を dumpして見ると、<mt:elseif name=”c” eq=”>”> どうもこのあたりから変。意図しない所でタグが閉じたり、 開いたり...
  33. 33. あっ、> と < は使えないのか。
  34. 34. ということで、8つの命令のうち、 >を#に <を*に に置換えた。
  35. 35. もっと早く気付けよ>自分
  36. 36. まとめ● いろいろあったけど、なんとかなったし、けっ こう楽しめた。● みなさんもぜひ挑戦してみてください。● 今回書いたテンプレートは、githubにありま す。 ● http://github.com/ka2hiro/brainfuck● 次回はマンデルブロー集合の予定です(笑)
  37. 37. おまけ● 無限ループ/ループ脱出不可が悔しかったの で、WhileTagというプラグインを書いてみた。 ● http://github.com/ka2hiro/WhileTag● <mt:if>と同じ構文のブロックタグ ● <mt:while name=”done” ne=”1”> </mt:while>● ループ内からループ変数を操作可能
  38. 38. ご清聴ありがとうございました。

×