Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

3,718 views

Published on

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

  • Be the first to comment

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. ご清聴ありがとうございました。

×