mtddc hokkaido : テンプレートタグでbrainf*ckを作ってみた

39
テンプレートタグでBrainf*ckを 作ってみた MTDDC Hokkaido 2010/12/18 えんどうかつひろ

Upload: katsuhiro-endo

Post on 07-Dec-2014

3.490 views

Category:

Self Improvement


5 download

DESCRIPTION

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

TRANSCRIPT

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

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

MTDDC Hokkaido2010/12/18

えんどうかつひろ

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

自己紹介● えんどうかつひろ

● @ka2hiro● フリーランスのプログラマ● MT歴

● 4年ほど(2006年頃から)● プラグイン書いたり、MTベースのWeb App書いた

り● 好きなテンプレートタグ

● mt:setVarTemplate と mt:date

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

今日お話すること● Brainf*ckを書いていて、はまったこと

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

きっかけ?● 単なる思いつき● テンプレートタグって、プログラミング言語だ

よね。● 変数あるし● 四則演算できるし● 条件分岐できるし● ループもできるし● 配列もハッシュもあるし

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

それに...● MT、テンプレートタグ、Brainfuckで、軽くぐ

ぐってみたけど、全然ヒットしない。● ってことは、これは...

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

ということでBrainf*ckのインタープリタを

書いてみた。

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

ところでBrainf*ckって何?

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

“Brainfuck(ブレインファック)は難解プログラミング言語のひとつ。

なお名称に卑語が含まれるため、Brainf*ckなどと表記されるこ

とがある。”wikipediaより

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

使える命令はこの↓8文字

> < + - . , [ ]だけ。

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

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

+++++++++[>++++++++>+++++++++++>+++++<<<-]>.>++.

+++++++..+++.>-.------------.<+++++

+++.--------.+++.------.--------.>+.

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

これを実行すると

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

Hello World!

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

と表示するプログラミング言語。

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

で、書いてみたら、書けた。でも、けっこうはまった。

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

ここからが今日の本題。

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

はまったその1文字列中の任意の場所から1文字

だけ読み込む。

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

<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モディファイア

なんてなかった。

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

仕方がないので、困った時の「正規表現」

にお願いしてみた。

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

正規表現/(?:.{<mt:var name="pos" />})(.)(?:.*)/

● posは、取得したい文字の位置(最初の文字は0番目)● 1つ目のかっこは読み飛ばす部分● 2つ目のかっこが取得したい文字● 3つ目のかっこは残りの文字(必要ないかも)● posが3の場合、/(?:.{3})(.)(?:.*)/ となる● $1で1文字取得できる

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

まとめるとこうなる。<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>

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

これで1文字ずつ読み込めるようになった。

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

はまったその2無限ループを作れない。

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

<mt:loop>は、配列の要素をたどることしかできないし、

<mt:for>はto=”N”で指定した回数しかループできないし、

どうしよう...

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

ちょっとかっこ悪いけど、<mt:for var=”i” from=”0” to=”1000”>

大きめの数値を終了条件にして、ごまかした。

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

はまったその3ループから脱出できない!

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

<mt:for var=”i” from=”0” to=”1000”> <mt:if name=”i” eq=”5”> <mt:setvar name=”i” value=”1000” /> ループ変数に終了条件を満たす値を 設定しても脱出できない! </mt:if></mt:for>

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

どうやらループ内では、ループ変数の参照はできるが、変更は反映されないようだ。

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

仕方がないので、<mt:for var=”i”� from=”0” to=”1000”> <mt:if name=”done” ne=”1”> 必要な処理を実施し、 終了条件を満たしたらdoneに1をセット    </mt:if></mt:for>

とした。でもこれだと...

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

10回目で終了条件を満たすと、残り990回は、

無駄に空回り。┐(´-`)┌

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

はまったその4完成したテンプレートを編集画面に貼付け、

プレビューしても真っ白け。

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

テンプレートのコンパイル結果をdumpして見ると、

<mt:elseif name=”c” eq=”>”>

どうもこのあたりから変。意図しない所でタグが閉じたり、

開いたり...

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

あっ、> と < は使えないのか。

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

ということで、8つの命令のうち、> を # に< を * に

に置換えた。

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

もっと早く気付けよ>自分

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

まとめ● いろいろあったけど、なんとかなったし、けっ

こう楽しめた。● みなさんもぜひ挑戦してみてください。● 今回書いたテンプレートは、githubにありま

す。● http://github.com/ka2hiro/brainfuck

● 次回はマンデルブロー集合の予定です(笑)

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

おまけ● 無限ループ/ループ脱出不可が悔しかったの

で、WhileTagというプラグインを書いてみた。● http://github.com/ka2hiro/WhileTag

● <mt:if>と同じ構文のブロックタグ● <mt:while name=”done” ne=”1”></mt:while>

● ループ内からループ変数を操作可能

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

ご清聴ありがとうございました。