zick pages

2022年を振り返る

そろそろ2022年も終わりそうなので今年やったことを少し振り返ろうと思う。

今年作ったLISP処理系

今年はWebAssemblyとGoogleスプレッドシートでLISPを作った。より細かく言うと、 WebAssemblyのテキスト表現とやらで LISP 1.5のインタプリタを作り、そのインタプリタの上で LISP 1.5のコンパイラを書いた。 Googleスプレッドシートは 名前付き関数を使ったLISPインタプリタと、 純粋にセルだけを使ったLISPインタプリタの2種類を作った。

WebAssemblyは多少癖はあるものの、慣れたらそこまで苦労せず書けた。 ごみ集めのデバッグは辛かったが、これは言語を問わず辛いだろう。 それよりも、何らかの仕様に(ほぼ)準拠したLISPを書くというのが初めての経験で、 あらかじめ予想していたが、かなり面倒だった。 特にインタプリタが十分に動くようになったあとに組み込み関数を実装するのが面倒で 「この関数はべつにいらないだろ」 と思いながらコードを書くのはあまり楽しくはなかった。達成感はあったけど。

実のところ、私はLISPコンパイラを書いた経験はあまりない。 過去にSchemeからCへのコンパイラ を書いたくらいだろう。 バイナリを吐き出すLISPコンパイラを書いたのは今回が初めてだ。 色々と考えることが多くて楽しかった。 変数のスコープ周りでLISP 1.5の仕様にはない気の利いたことをやろうとしたら、 そのあたりにバグが集中して、おまけにデバッグが大変だったのは辛かったが、 なんとかコンパイラ自身をコンパイルすることができたのでよしとする。

Googleスプレッドシートで動くLISPというのは何年も温めていたネタだ。 温めていたといっても何か実装のアイディアがあったわけではなく、 単にいつかやりたいと思っていただけなのだが。 思い切って、あまり考えず実装を始めてみたものの、見事に失敗。 S式をreadするだけでとんでもないコードになってしまい、 そのままの方針でevalを書くのは不可能という結論が出てしまった。

そこで、まずは「名前付き関数」という機能を使って実装することにした。 これは一言で言えば機能の少ない関数型言語みたいなもので、 こんなものを使えばLISPインタプリタを書けるのは自明だ。 とはいえ、少ない機能でLISPを実現するには色々と頭を使う必要がある。 名前付き関数用のエディタがとんでもなく使いにくいのも相まって、 なかなかに苦労した。

名前付き関数を使ったLISPインタプリタを実装したら頭の中が整理されて、 名前付き関数を使わずに純粋にセルだけでLISPを実装する方法が思いついた。 説明はこの記事に譲るが、 必要な道具をしっかりと準備するのが大事だった。 この「名前付き関数を使わないGoogleスプレッドシート」は、 私が今までにLISPインタプリタ書いた50を超える言語のなかで一番難しかった といっても過言ではないのだが、残念ながら世間的にはまったく注目されず、 それほど難しくない「名前付き関数を使ったGoogleスプレッドシート」の方が 注目されたのは正直言ってすこし悲しかった。 まあ、外面が似たようなものを2つ公開しても違いを気にする人はあまりいないだろう。 名前付き関数を使ったほうを先に公開してしまった私が悪い。

今年書いたプログラム

LISP処理系を除くと今年はあまりまとまったプログラムを書かなかった。 すこし面白いにはEVALQUOTE 形式のプログラムを書いたことだろう。 WebAssemblyでLISP 1.5の処理系を書いたことで、 50年以上前のプログラムがそのまま動くというのはなかなかに楽しい。 以前は古臭くて読みにくいと思っていたプログラムも 自分で書いた処理系で動くと愛着が湧いてくるようになった。 世間の人々が新しいプログラミング言語を学んでいる中、 なぜ私は大昔のプログラミング言語を学んでいるのだろうという気もするが、 楽しければ問題ないということにしておきたい。

今年読んだ本

今年は共立出版のbitをそれなりに読んだ。 去年の12月から今年の1月にかけてはLISPが出てくる記事をすべて読み、 その後は目についた気になった記事を読み、 そしてそれが終わったら、創刊号から順番に読み始めた。 1970年ごろのコンピュータやプログラミング言語はなかなかに面白い。 今も使われている技術の元ネタのようなものがゴロゴロ転がっている。 ただ、数学の記事が多いのは算数のできない私には辛い。

bitを読んでいるときに 数理情報学入門―スコット・プログラム理論 という本を知ったのだがこれが非常に面白かった。 とんでもなく面白いので超おすすめ。みんな読もう。

LISP 1.5を実装したときは LISP 1.5 Programmer’s Manual には何度も目を通した。 それから中西先生のLisp入門も かなり参考にした。 どちらも過去に読んだことがあったが、読み返すたびに新しい発見があり、 私が普段いかにいい加減に本を読んでいるかがよく分かった。

ほかにも何冊か技術書を読んだとは思うのだが、 心に強く残るようなものはなかったはず。多分。

今年の目標

今年はクォリティは問わないので毎月何らかの記事を書こうと考えていたのだが、 この記事をもって無事目標を達成できた。よかった。

2022-12-17