SlideShare a Scribd company logo
テンプレートタグでBrainf*ckを
     作ってみた


     MTDDC Hokkaido

       2010/12/18

     えんどうかつひろ
自己紹介
●
    えんどうかつひろ
    ●
        @ka2hiro
●
    フリーランスのプログラマ
●
    MT歴
    ●
        4年ほど(2006年頃から)
    ●
        プラグイン書いたり、MTベースのWeb App書いた
        り
●
    好きなテンプレートタグ
    ●
        mt:setVarTemplate と mt:date
今日お話すること
●
    Brainf*ckを書いていて、はまったこと
きっかけ?
●
    単なる思いつき
●
    テンプレートタグって、プログラミング言語だ
    よね。
    ●
      変数あるし
    ●
      四則演算できるし
    ●
      条件分岐できるし
    ●
      ループもできるし
    ●
      配列もハッシュもあるし
それに...
●
    MT、テンプレートタグ、Brainfuckで、軽くぐ
    ぐってみたけど、全然ヒットしない。
●
    ってことは、これは...
MTDDC Hokkaido : テンプレートタグでBrainf*ckを作ってみた
ということで

Brainf*ckのインタープリタを

    書いてみた。
ところでBrainf*ckって何?
“Brainfuck(ブレインファック)は
難解プログラミング言語のひとつ。
   なお名称に卑語が含まれるた
 め、Brainf*ckなどと表記されるこ
          とがある。”
                wikipediaより
使える命令はこの↓8文字


 ><+-.,[]
    だけ。
例
+++++++++[>++++++++>++++
+++++++>+++++<<<-]>.>++.
       +++++++..++
+.>-.------------.<+++++
     +++.--------.++
  +.------.--------.>+.
これを実行すると
Hello World!
と表示するプログラミング言語。
で、書いてみたら、書けた。

でも、けっこうはまった。
ここからが今日の本題。
はまったその1

文字列中の任意の場所から1文字
    だけ読み込む。
<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モディファイア
        なんてなかった。
仕方がないので、困った時の

   「正規表現」

  にお願いしてみた。
正規表現
    /(?:.{<mt:var name="pos" />})(.)(?:.*)/

●
    posは、取得したい文字の位置(最初の文字は0番目)
●
    1つ目のかっこは読み飛ばす部分
●
    2つ目のかっこが取得したい文字
●
    3つ目のかっこは残りの文字(必要ないかも)
●   posが3の場合、/(?:.{3})(.)(?:.*)/ となる
●
    $1で1文字取得できる
まとめるとこうなる。
<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>
これで1文字ずつ
読み込めるようになった。
はまったその2

無限ループを作れない。
<mt:loop>は、配列の要素をたど
    ることしかできないし、

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

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

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

ループから脱出できない!
<mt:for var=”i” from=”0” to=”1000”>
  <mt:if name=”i” eq=”5”>
  <mt:setvar name=”i” value=”1000” />
    ループ変数に終了条件を満たす値を
    設定しても脱出できない!
  </mt:if>
</mt:for>
どうやらループ内では、
ループ変数の参照はできるが、
変更は反映されないようだ。
仕方がないので、
<mt:for var=”i” from=”0” to=”1000”>
    <mt:if name=”done” ne=”1”>
     必要な処理を実施し、
     終了条件を満たしたらdoneに1をセット
    </mt:if>
</mt:for>

      とした。でもこれだと...
10回目で終了条件を満たすと、

   残り990回は、

 無駄に空回り。┐(´-`)┌
はまったその4

 完成したテンプレートを
  編集画面に貼付け、
プレビューしても真っ白け。
テンプレートのコンパイル結果を
   dumpして見ると、
<mt:elseif name=”c” eq=”>”>

  どうもこのあたりから変。

意図しない所でタグが閉じたり、
     開いたり...
あっ、
> と < は使えないのか。
ということで、8つの命令のうち、

     >を#に
     <を*に

    に置換えた。
もっと早く気付けよ>自分
まとめ
●
    いろいろあったけど、なんとかなったし、けっ
    こう楽しめた。
●
    みなさんもぜひ挑戦してみてください。
●
    今回書いたテンプレートは、githubにありま
    す。
    ●
        http://github.com/ka2hiro/brainfuck
●
    次回はマンデルブロー集合の予定です(笑)
おまけ
●
    無限ループ/ループ脱出不可が悔しかったの
    で、WhileTagというプラグインを書いてみた。
    ●
        http://github.com/ka2hiro/WhileTag
●
    <mt:if>と同じ構文のブロックタグ
    ●   <mt:while name=”done” ne=”1”>
        </mt:while>
●
    ループ内からループ変数を操作可能
ご清聴ありがとうございました。

More Related Content

PDF
C++の黒魔術
PDF
闇魔術を触ってみた
PDF
君はまだ,本当のプリプロセスを知らない
PDF
Define and expansion of cpp macro
PDF
プログラムの処方箋~健康なコードと病んだコード
PDF
Template Meta Programming入門から応用まで
PDF
Should we write such like plugin or not?
PDF
C++勉強会in広島プレゼン資料
C++の黒魔術
闇魔術を触ってみた
君はまだ,本当のプリプロセスを知らない
Define and expansion of cpp macro
プログラムの処方箋~健康なコードと病んだコード
Template Meta Programming入門から応用まで
Should we write such like plugin or not?
C++勉強会in広島プレゼン資料

What's hot (14)

PDF
マスター・オブ・Reflectパッケージ
PDF
インタフェースの実装パターン
PDF
MarkdownをBacklogのwikiに変換するPWA
PDF
今日からはじめるHTML5 ver.2012
PDF
良い?悪い?コードコメントの書き方
PPT
メタプログラミングって何だろう
PDF
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会2
PPT
ユニットテスト 1日目
PPT
C++でぼくが忘れがちなこと
PDF
エキスパートGo
PPTX
ふるたに流プログラミング学習法
PDF
Goで言語処理系(の途中まで)を作ろう
PDF
Goroutineと channelから はじめるgo言語
PDF
[第2版]Python機械学習プログラミング 第8章
マスター・オブ・Reflectパッケージ
インタフェースの実装パターン
MarkdownをBacklogのwikiに変換するPWA
今日からはじめるHTML5 ver.2012
良い?悪い?コードコメントの書き方
メタプログラミングって何だろう
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会2
ユニットテスト 1日目
C++でぼくが忘れがちなこと
エキスパートGo
ふるたに流プログラミング学習法
Goで言語処理系(の途中まで)を作ろう
Goroutineと channelから はじめるgo言語
[第2版]Python機械学習プログラミング 第8章
Ad

Viewers also liked (11)

PDF
Learn you a Brainfuck for great good!
KEY
Functional Pearl + Brainfuck
PDF
brainfuckであそぼう #lldiver LT資料
PDF
Brainfuck interpreter 分析新竹碼農0307
PDF
Rubyで作る奇妙なプログラミング言語
PDF
「魔法少女志向プログラミングのススメ」 プロ生勉強会 第10回@品川
PDF
実用Brainf*ckプログラミング入門編
PDF
実用Brainf*ckプログラミング
ODP
ライフゲームでプログラミング
PDF
CTF for ビギナーズ ネットワーク講習資料
Learn you a Brainfuck for great good!
Functional Pearl + Brainfuck
brainfuckであそぼう #lldiver LT資料
Brainfuck interpreter 分析新竹碼農0307
Rubyで作る奇妙なプログラミング言語
「魔法少女志向プログラミングのススメ」 プロ生勉強会 第10回@品川
実用Brainf*ckプログラミング入門編
実用Brainf*ckプログラミング
ライフゲームでプログラミング
CTF for ビギナーズ ネットワーク講習資料
Ad

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

PDF
20190920 hannaripython20
PDF
Janog31 bof-pattern-sasaki-01
PDF
TDD を自分の道具にしよう
PDF
Rpn and forth 超入門
PDF
connpass特徴と開発の流れ
PDF
わんくま同盟大阪勉強会#61
PDF
2014年を振り返る 今年の技術トレンドとDockerについて
PDF
20120706-readablecode
PDF
C++コミュニティーの中心でC++をDISる
PDF
MTプラグイン入門以前
ODP
Dtrace in netbsd
PDF
競技プログラミングにおけるコードの書き方とその利便性
PDF
TripleO Deep Dive
PPT
タダで始めるテストファースト入門 ~ C# Express + NUnit
PDF
【メタサーベイ】基盤モデル / Foundation Models
PPTX
(ゲームじゃない方の)switchで遊びたい話
PDF
死闘!Og mailinglist
PDF
C・C++用のコードカバレッジツールを自作してみた話
PDF
ng-mtg#6 AngularJS ディレクティブ・パターン
KEY
GrowthForecastことはじめ
20190920 hannaripython20
Janog31 bof-pattern-sasaki-01
TDD を自分の道具にしよう
Rpn and forth 超入門
connpass特徴と開発の流れ
わんくま同盟大阪勉強会#61
2014年を振り返る 今年の技術トレンドとDockerについて
20120706-readablecode
C++コミュニティーの中心でC++をDISる
MTプラグイン入門以前
Dtrace in netbsd
競技プログラミングにおけるコードの書き方とその利便性
TripleO Deep Dive
タダで始めるテストファースト入門 ~ C# Express + NUnit
【メタサーベイ】基盤モデル / Foundation Models
(ゲームじゃない方の)switchで遊びたい話
死闘!Og mailinglist
C・C++用のコードカバレッジツールを自作してみた話
ng-mtg#6 AngularJS ディレクティブ・パターン
GrowthForecastことはじめ

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