マクロツイーター

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

grassator パッケージ: シンプルな Grass 開発環境

前回少し紹介した grassator パッケージ*1であるが、これは以下の 3 つのファイルからなる。

前回示したような「謎言語」(“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)]()
ZR「めでたしめでたし」
*「え〜〜っ!? 最終目標は Grass じゃなくて『ほむほむ』だったんじゃないんですかー?(1TeX の記事のコメントを参照)あと、そもそも…」
ZR「わかってる!」

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)を参照してほしい。)

ところで、この「ほむほむ」という言語に関しては大きな問題があるのだが、その話はまた後ほど。

*1:「パッケージ」というと何か TeX っぽいが、無論 TeX とは無関係である。……今の所は。

*2:何だ、結局 1 時間かかっているじゃないか。