マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

LaTeX 上で色々と実装してみる話(ナベアツ編-8)

前回で「Grass 言語でナベアツ」を紹介して、これで無事に「ナベアツ編」は完結して次の課題に進める、と考えていたが、やはり一つ心残りなことがある。このブログの愛読者であれば容易に想像が付くと思われるが、それは、

Brainfuck でナベアツ」をやっていない

ことである。

このまま放ってしまうと後々に後悔する羽目になる……というわけで、ナベアツを作ってみた。

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

あとは、ネットで適当に「Brainfuck on TeX」の実装を見つけて、それで実行させれば OK!

……と思ったら、ここにきて困った事態が発生した。TeX 言語による Brainfuck 処理系の実装(で、LaTeX(や plain TeX)を破壊しないもの*1が、

全く存在しない

のである。Brainfuck といえば、Turing 完全な言語の中で処理系の実装が最も容易だと言われている。TeX 上で LISP が動く現在において、最も基本の Brainfuck の処理系実装がないとは、世の TeX 芸人達は余りにも迂闊ではないか……!

嘆いていても仕方がないので、作ってみた。

パッケージのインタフェースは bxgrassatorixgrassator パッケージと同様のものにしている。ただし Brainfuck のプログラムソースは LaTeX特殊文字を含まないので、verbatim 扱いの環境ではなくて命令の形式を用いた。(Brainfuck ソースを表す引数は完全展開されてから解釈される。)

  • \execbf{<Brainfuckソース>} : 引数に書かれたプログラムを入力(標準入力から読み込まれるバイト列)を空として実行する。出力(標準出力へ書き出されるバイト列)はそのまま LaTeX への入力(LaTeX ソース)として実行される。
  • \execbfwithinput{<入力>}{<Brainfuckソース>} : 入力を引数として指定する他は \execbf 命令と同じ。
  • \procbf{\制御綴}{<Brainfuckソース>} : 「内容のプログラムを実行する」という命令を \制御綴 として定義する。つまり、後で \制御綴{<入力>} を実行するとプログラムが実行される。
  • \execbf*{<Brainfuckソース>}
  • \execbfwithinput*{<入力>}{<Brainfuckソース>}
  • \procbf*{\制御綴}{<Brainfuckソース>} : verbatim 版。* なしの命令と同様だが、出力は LaTeX ソースではなく単なる文字列と解釈されそのまま出力される。

これを使って先に示したプログラムを実行してみる。

[nabeazz-bf.tex]
\documentclass[a4paper]{article}
\usepackage{bxbluf}
\usepackage{type1cm}
\newcommand*\AhoFont[1]{{\usefont{OT1}{cmfr}{m}{it}\LARGE #1}}
%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! BEGIN BF code
\procbf{\NabeAzz}{
>>>+>>>>>+[->>>>,+>+<[->-]>[->]<+<[---------->-]>[
->]<+<[++<++++++++[->-----<<<+<++++++>>>]<<+>>>>>>
+++>+<<<-]>[->]>>]<<<<<+++>>++++++++++++++++[->++>
++++++>++++>++++++>+++++++>++++>+++++++>+++++++>++
+++++>++++++++>++++++++<<<<<<<<<<<]>>---->+>++++++
++>->++++++>->-->++++>----->---<<<<<<<<<<<<<<<<<<<
+[-<<+>[-<-]<[->+++++++++<<<<<<<+>>>>>]<<<<<]>>>[>
>>>>>>>]>+[<<<<+[->[-]+<<<<+<[-<+>>-]>[-<+++++++++
<---------<<<+>>>>>>]>>+>>[-<<-]<<[->>+++++++++<<<
<]<<<<<<]>>>[>>>>>>>>]>>>->+<[<+<<<[<<<<<<<<]<<<<[
>>>>>[>>>>>>>>]>>-<<<<<<<]<<<[>>>>>>>>]>>>>-]>[-<+
++<+>>>]<<<[->>+>>>.>.>.>.>.>.>.>.>.<<<<<<<<<<<<<]
<<<<[<<<<<<<<]>>[.>>>>>>>>]>>>>[->>>>>>>>>>>>.<<<<
<<<<<<<<]>>.<<<<<<<<<+[-<<[->>>>>[>>>>>>>>]>-<<<<<
+<]+>[-<-]<[->+++++++++<<<<<<<+>>>>>]<<<<<]>>>[>>>
>>>>>]>]
}%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! END BF code
\begin{document}
\NabeAzz{40}
\end{document}

というわけで、「LISP や Grass 言語はちょっと苦手…」という人も、もはや悩む事は無用である。

*1:TeX への入力に出力する機能をもつ」という条件も付く。もちろん、「LaTeX を破壊しておいてその後で平然と LaTeX の処理を続けさせる」という妙なことをしてはいけない。