懐かしのM式
かなり古い本である「LISPの構造」JHON ALLEN著を読み直してました。今でも読みごたえがあります。理論と実装の両面で書かれています。そしてそのLispコードはM式なのです。
M式はLispの黎明期に使われたものの、その後S式が主流になり、今ではM式でLispを書くなんてことは、まずありません。しかし、現代においてもM式には存在意義があると私は思っています。そんなことをつらつらと綴ってみたいと思います。
見かけも大切
私が小学生の頃に「妖怪人間ベム」というアニメがありました。ちょっと怖い雰囲気。人間の見かけとは大きくかけ離れた獣のような見てくれのベムたち。彼らは見た目はともかくそのハートは人間以上に人間なのでした。「早く人間になりたい!」とベムは悲痛に叫ぶのでした。最近では亀梨和也さん主演の実写ドラマでご覧になった方も多いだろうと思います。
さて、彼らは普段は人間の恰好をして人間世界に紛れ込んでいます。しかし、戦闘場面になるとその能力を出し切るためにその本来の姿に戻ります。およそ人間とはかけ離れたその姿は一般人にはモンスターに見えてしまいます。
で、こじつけっぽいのですが、なんかS式のlispとシチュエーションが似てませんか? 昔ならFortran、今ならPython、Rubyとは大きくかけ離れたそのS式の見かけ。これで敬遠されちゃったんじゃLispも可哀そうというものです。妖怪人間ベロは人間風の恰好をするとカワイイのです。男と女の恋愛においても初対面の印象というのは極めて重要です。ここで相手のハートをつかめないとその後の展開はありません。見かけで損をしないためにはM式の仮面をかぶってPython風を装うという戦略もあるとおもうのですね。
M式でRuby風を装う
というわけで自作のLispインタプリタコンパイラであるEasy-ISLispにmexpというライブラリが用意してります。あの古風なM式を読み込みS式にして実行するというものです。実行例をご覧ください。
Easy-ISLisp Ver2.65
> (import "mexp")
T
> (mexp)
Meta expression translator
M> load["example/foo.m"]
T
M> fact[10]
3628800
M> fib[20]
6765
M>
example/foo.m
;; M-expression samples
foo[x] <= x+1
fact[n] <=
[n=0->1;t->n*fact[n-1]]
fib[n] <=
[n=0->0;
n=1->1;
t->fib[n-1]+fib[n-2]]
古いLispをご存知の方にとってはあの懐かしいM式です。まったく知らない若い世代の人にとってはRubyに見えるかもしれません。そう見えたなら作戦成功です。とりあえずカワイイベロちゃんなのです。本性は隠しておきます。
S式とお友達
さて、ファーストインプレッションで合格点を得た後にじわりじわりとその本来のパワーを見せつけることにします。戦闘モードです。
sexp[fn] でS式に変換してファイルに書き出します。
M> sexp["example/foo.m"]
T
M>
これによりfoo,lspというファイルが生成されます。ここにはM式から変換されたS式が書き込まれています。フォーマッタで整形すればインデントありのS式のできあがりです。
(DEFUN FOO (X) (+ X 1))
(DEFUN FACT (N) (COND ((= N 0) 1) (T (* N (FACT (- N 1))))))
(DEFUN FIB (N) (COND ((= N 0) 0) ((= N 1) 1) (T (+ (FIB (- N 1)) (FIB (- N 2))))))
> (import "formatter")
T
> (formatter "example/foo.lsp")
T
>
(DEFUN FOO (X) (+ X 1))
(DEFUN FACT (N) (COND ((= N 0) 1) (T (* N (FACT (- N 1))))))
(DEFUN FIB
(N)
(COND ((= N 0) 0)
((= N 1) 1)
(T (+ (FIB (- N 1)) (FIB (- N 2))))))
大文字になってるのはご愛嬌。
へ~、M式ってこんな風にS式になるんだね、と思ってもらえたらシメタものです。あとはマクロをぶちかますとか、戦闘モードならではの実力を見せつけます。さあ、これでLisp遣いの誕生、なんてことにならないかな。
ソース
Easy-ISLispはOSSです。コードはここにおいてあります。