前回少し紹介した grassator パッケージ*1であるが、これは以下の 3 つのファイルからなる。
- planter.lua: Grass コード生成器のライブラリ。
- bushfire.lua: Grass コードインタプリタのライブラリ。
- grassator.lua: 上の 2 つを利用した実行可能スクリプト。
前回示したような「謎言語」(“seed 形式”と呼ぶ)を介して Grass のプログラムを書く場合は、seed 形式のコード(function 〜
と end
の間に書かれているもの)のみを書いたファイル(nabeazz.sd とする;パッケージ内の sample\nabeazz.sd に同じものがある)を用意して次のコマンドを実行すると Grass のソースファイル nabeazz.www が得られる。
lua grassator.lua -t grass nabeazz.sd nabeazz.www
(ただし Lua のインタプリタのコマンド名が lua
であるとする。((例によって、shebang 等を利用して grassator
のコマンド名で起動できるようにすると便利かもしれない。)))
また次のコマンドで Grass のプログラムを実行できる。
lua grassator.lua nabeazz.www
実は次のようにして seed 形式のまま実行することもできる。(もはや草植え関係ないwww)
lua grassator.lua -f seed nabeazz.sd
このツールを使うと、例えば「1 行の入力に対して逆順にした文字列を出力する」というプログラムがサクサクと 60 分位で作ることができる。*2
-------------------- Prepare a newline character _2 = _.s.z (s(s(z))) _3 = _.s.z (s(s(s(z)))) GetNL = _.w [c121 < _2(Succ)(w)] [_8 < _3(_2)] [_64 < _2(_8)] [c185 < _64(Succ)(c121)] [_81 < _2(_2)(_3)] [cNL < _81(Succ)(c185)]() cNL = _(GetNL(w)) -------------------- Read characters Cons = _.a.b.f (f(a)(b)) C = _.f.x.y (f(y)(x)) False = _.x.y () True = _(C(False)); K = True ReadOne = _.stor [cin < In(cNL)] [quit < cin(cNL)] [nstor < (quit)(stor)(Cons(cin)(stor))] [Cons(quit)(nstor)]() ReadStep = _.self.stor [I < False(w)] [CI < C(I)] [Car < CI(True)] [Cdr < CI(False)] [res < ReadOne(stor)] [quit < Car(res)] [nstor < Cdr(res)] [(quit)(I)(self(self))(nstor)]() -------------------- Write characters WriteStep = _.self.stor [I < False(w)] [CI < C(I)] [Car < CI(True)] [Cdr < CI(False)] [c < Car(stor)] [Out(c)] [quit < c(cNL)] [(quit)(K(I))(self(self))(Cdr(stor))]() -------------------- Main procedure Main = _.self [stor0 < Cons(cNL)(False)] [stor < ReadStep(ReadStep)(stor0)] [WriteStep(WriteStep)(stor)]()
grassator では「ほむほむ」もサポートしている。以下のコマンドで「Grass → ほむほむ」の変換ができる。
lua grassator.lua -f grass -t homuhomu nabeazz.www nabeazz.homu
出力された「ほむほむ」のプログラム。ほむ 4591 回、28155 バイト(UTF-8、改行 LF)。
「ほむほむ」のプログラムを実行することも可能。
# lua grassator.lua -f homuhomu nabeazz.homu 100 1 2 {\AhoFont 3} 4 5 {\AhoFont 6} 7 8 {\AhoFont 9} 10 11 {\AhoFont 12} {\AhoFont 13} 14 {\AhoFont 15} 16 17 {\AhoFont 18} 19 20 {\AhoFont 21} 22 {\AhoFont 23} { \AhoFont 24} 25 26 {\AhoFont 27} 28 29 {\AhoFont 30} {\AhoFont 31} {\AhoFont 32} {\AhoFont 33} {\AhoFont 34} {\AhoFont 35} {\AhoFont 36} {\AhoFont 37} {\AhoFont 38} {\AhoFont 39} 40 41 {\AhoFont 42} {\AhoFont 43} 44 {\AhoFont 45} 46 47 {\Ah oFont 48} 49 50 {\AhoFont 51} 52 {\AhoFont 53} {\AhoFont 54} 55 56 {\AhoFont 57} 58 59 {\AhoFont 60} 61 62 {\AhoFont 63} 64 65 {\AhoFont 66} 67 68 {\AhoFont 69} 70 71 {\AhoFont 72} {\AhoFont 73} 74 {\AhoFont 75} 76 77 {\AhoFont 78} 79 80 {\ AhoFont 81} 82 {\AhoFont 83} {\AhoFont 84} 85 86 {\AhoFont 87} 88 89 {\AhoFont 90} 91 92 {\AhoFont 93} 94 95 {\AhoFont 96} 97 98 {\AhoFont 99} 100
(コマンドラインオプションの全容についてはヘルプ画面(lua grassator.lua --help
)を参照してほしい。)
ところで、この「ほむほむ」という言語に関しては大きな問題があるのだが、その話はまた後ほど。