Upgrade to Pro — share decks privately, control downloads, hide ads and more …

M4でBrainfuckを動かす話

MakKi
October 12, 2017

 M4でBrainfuckを動かす話

MakKi

October 12, 2017
Tweet

More Decks by MakKi

Other Decks in Technology

Transcript

  1. M4 is 何? “m4 は、ブライアン・カーニハンとデニス・リッチー が設計した汎用マクロプロセッサである。その 名称は、"macro" の "m" と、AP-3ミニコンピュータ

    でデニス・リッチーがそれ以前に書いたマクロプロ セッサ "m3" の次、というところから来ている。 出展:wikipedia http://ja.wikipedia.org/wiki/M4_(プログラミング言語)
  2. Brainfuckの命令 • > : ポインタのインクリメント • < : ポインタのデクリメント •

    + : ポインタの指す値のインクリメント • - : ポインタの指す値のデクリメント • [ : ループ始点 • ] : ループ終点 (ポインタの指す値が0以外なら対応する[へジャンプ) • . : ポインタの指す値を出力 • , : 入力をポインタの指す場所に書き込む
  3. 対応するマクロ • > : ip • < : dp •

    + : ic • - : dc • [ : bn • ] : ed • . : pr • , : ???
  4. 変換 define(`token', `changequote({,})ifelse( {$1}, {>}, {`'ip}, {$1}, {<}, {`'dp}, {$1},

    {+}, {`'ic}, {$1}, {-}, {`'dc}, {$1}, {.}, {`'pr}, {$1}, {[}, {`'bn(`}, {$1}, {]}, {')`'ed}){}changequote') define(`parse', `ifelse( eval(len(`$*')>0), 1, `token(substr(`$*',0,1))`'parse(substr(`$*',1))')') define(`internal', parse(include(`/dev/stdin')))
  5. ループの実装 define(`bn', `pushdef(`s', `ifelse(eval(cv>0), 1, `$1`'s')')') 次のようなマクロ s を定義 cvの値が0以上のとき

    引数の文字列をまるごと展開 s自身を再帰呼出し define(`ed', `s`'popdef(`s')') bnで定義された s を展開