中西先生のM式


早逝な秀才

和田英一先生の「中西流プログラミングを読み解く」より

引用開始
私は週に1度慶應病院に通っている状態で,ふ だんは酒も飲めるようになっております(食べる ことだけがちょっと不自由ですが). メールは 家内のアドレスを通して交換できるようにして おります. また中西を思い出していただければ 幸いです. こういう悲しいメイルを残し, 中西君はわれわれの前から去っていった。
引用終わり

中西先生は1943年のお生まれです。2000年、ご病気により57歳の若さで惜しまれつつもお亡くなりになりました。先生は日本のLisp黎明期においてLispの研究、教育に尽力されました。「Lisp入門 -システムとプログラミング-」が有名です。また、「やさしいコンパイラの作り方」「6502アセンブリプログラミング」にもお世話になりました。

はじめてのLisp

中西先生は日本にまだLispの処理系が存在していない頃にLisp処理系を作ったそうです。参考にした文献は90ページほどの「LISP1.5 Programmer's Manual」だけだったそうです。

以下bit1997年1月号「バグを出さない」(中西正和)より引用します。

引用開始
 ともかく、Lispは完成した。ここからが面白い作業である。Lisp言語は、思想としてS式(私はS表現と呼ぶが)で書くべきものであり、その必然性は十分に理解できるのだが、プログラムが書きにくい。括弧の多さは筆舌に尽くしがたい。そして何よりも関数と引数の書き方が伝統的な数学の書法やプログラミング言語と異なるのが恐ろしい。
 私が参考にした前出の文献(補注Lisp1.5のマニュアルのこと)は、説明にはS式ではなく伝統的な数学の表記に近いM式というもので書かれていた。なぜM式で書かれていたかを想像するに、多くの人に理解してもらいたかったから、というのが真実だろう。私も、Lispを日本で流布させるには、S式ばかりでなくM式でもLispのプログラミングを書くことができなければいけないのではないか、と考えた。コンパイラをたくさん作っていた私にはこのくらいの変換系を作るのはやさしいことだった。
引用終わり

中西流M言語

手元にある「Lisp入門」は第2版で1981年のものです。M言語に近い形で入力・評価させる、という例として次のようなコードが掲載されていました。

以下、「Lisp入門」より引用

PREM[X]
  <= [NULL[CDR[X]] -> LIST[X];
      T -> MAPCON[PERM[CDR[X]];
                  QUOTE[LAMBDA[Y};INSERT[NIL;CAR[X];CAR[Y]]]]
           ]
     ]
.

INSERT[X;A;Y]
  <= [NULL[Y] -> LIST[APPEND[X;CONS[A;Y]]];
      T -> CONS[APPEND[X;CONS[A;Y]];
                INSERT[NCONC[X;LIST[CAR[Y}]];CDR[Y]]
           ]
      ]
.

このコードはおそらくAPPLE-LISPあるいはKLISPで動かした例ではないかと思います。M言語に近い言語を受け付けるLispとしては他にもGorgia Tech LISPという処理系もあったとのことです。

M言語は小文字を原則としているのですが、大文字になっています。おそらく当時の端末が大文字しか扱えなかったからだろうと思います。M式のなかでのS表現には先頭に’を付けることとなっていました。cond節はM言語では矢印 → を使うのですが、->と書きます。関数の定義には <= を使います。

fn[x1;...;xn] <= e

時代の変遷

「Lisp入門」は1977年に出版され、M言語を使ってLispプログラムを説明していました。1981年の第二版ではS式が取り入れられています。以下第2版の序文より引用します。

引用開始
本書は、1977年に著したものを改訂したものであるが、大きく変わった点としては、M言語ばかりでなく、コンピューターに入力できるS表現のプログラムをいくつか入れたことがあげられる。S表現のプログラムのほうが読みやすいという読者がいることを考えたためである。
引用終わり

TECOエディタを基にしたEmacsは1970年代より開発が開始されました。1981年頃にはEmacsによるS式サポートが普及し始めていたのかもしれません。しかし、当時のパソコンは初代PC-9801が登場したばかりでした。当時のパソコンではEmacsは動かなかったはずで、メインフレームで利用されていたのだろうと思います。

M言語の後継者たち(?)

Lispハッカー、竹内郁雄先生は下記の記事で次のようにおっしゃっています。
http://www.atmarkit.co.jp/ait/articles/0807/23/news141.html

引用
竹内氏によると、Lispはすべての言語の原点なのだという。「いまRubyがブームだが、Rubyは要するにカッコのないLisp。XMLもぶ厚いカッコのあるLisp。いろいろなプログラミング技法を見ますが、『Lispにあった』ということが多いです」(竹内氏)
引用終わり

M言語はその後、姿形を変えつつも現代のプログラミング言語の中に密かに隠れているのではないかと私は思っています。それは例えば まつもとさんのRubyです。そして、Mathematicaもひょとしたらそうかもしれません。あれは中身はLispのようです。エンジンバラPrologもそうかもしれません。Lisp的な考え方をする各種言語には伝統的な数学表記に近いM言語風の表記が与えられています。それらには中西先生の思いが詰まっているように私には思えてなりません。