ぽんぽこ日記

プログラミング、読書、日々の生活

私とLisp

Lispはいいぞ

先日、現在関わっているプロジェクトのチャットで、メンバーの一人が

Lispが良いと聞いたので興味ある

とつぶやいていたので、

Lisp良いですよー。Emacsを使っているので今でも現役です。

と返しておきました

お、身近なところに。意外といるんだ

との返答でしたが、現代の世の中にLispを学ぶ意味はあるのだろうかとも考えました。

Lispとの出会い

私がLispとであったのは、1990年、新卒で入社した会社の最初のプロジェクトでした。 そのプロジェクトは某電機メーカーが政府の研究機関から委託されたもので、手が足りないので当時の会社に再委託というかたちで受注したものでした。

テーマは「Lispのオブジェクト指向拡張を検討する」というものでした。当時、1990年という年はまだバブル経済がはじける前で、比較的納期にも余裕があり、それほどきっちりした成果物の定義がなかったように記憶しています。レポート+検証用ソースコード一式と言ったものを納品した記憶があります。

当時のLispの先進性を説明するには、1990年前半のIT業界の状況を簡単に説明しておく必要があります。 まず実務に使われる主要なプログラミング言語は - COBOL - FORTRAN が主流で、C言語はPC(Windowsはまだ普及しておらず、MS-DOSがメイン)アプリ用のプログラミング言語として使われ始めたくらいで、まだホビー・学術的な用途が多かったように思います*1。

また、大学などでプログラミング教育で用いられるのはBASICかPASCALが一般的でした。私は大学の授業でPASCALを学び、統計学や心理学の実験レポート作成のため、PASCAL(Turbo PASCALというIDEプロダクトがありました)でプログラムを書いたりしていました。

C++については、マイクロソフト社が初のC++処理系「Visual C++ 1.0」をリリースするのが1993年で、1990年当時はオブジェクト指向という考え方が話題にはなっていたものの、まだオブジェクト指向を実装した言語は一般には普及していませんでした。

Objective-Cについてはスティーブ・ジョブズがAppleを退社して作ったNeXT社のプロダクト、1988年に発売された「Next Cube」以降の環境では使えました。 オブジェクト指向についてはNextの環境が先頭を走っている状況でしたが、個人が手を出せるものではありませんでした。

ちなみにJava言語がデビューするのは、β版が1995年、正式リリースが1996年です。今にして思えば、1990年代前半というのはインターネットの普及などでプログラミング環境が一気に多様化する直前の時代だったと言えるかもしれません。

そんな状況なので、SmalltalkやObjective-Cの文法を文献などで参照して、CommonLispの処理系の一つである、Kyoto Common Lisp(KCL)という国産のオープンソースのCommonLispの処理系を手に入れ、CommonLispの機能にふくまれるマクロとクロージャをつかってオブジェクト指向の特徴の一つであるカプセル化を実現しました。

継承についてもメタプログラミング的な機能を用いて実現しました。いまでいうとMixInに近いものだったような気がします。

このプロジェクトを進めるにあたり、まずはLispそのものを学ぶ必要があるわけで、筆者はKCLの作者のかたが直々に記した下記の本で勉強しました。

読み進むにつれ、上記の既存の言語にはない新しい概念がどんどん出てきて刺激的ではあったものの難渋しました。

主なものを挙げると、 - リスト構造 - 再帰 - 例外(非局所的脱出) - レキシカルスコープ(クロージャ) - 高階関数 - 無名(λ)関数 等々。

今では割と一般的な概念が多いと思いますが、繰り返すようですが当時の主流言語には全くなかったものばかりです*2。

これらの概念はその後普及し始めた言語に段階的に取り入れられていきました。

もうおわかりと思いますが、筆者はLispを学んだことで、こうした先進的な概念を体得することができ、その後のエンジニアのキャリアにとても役だったのです。

先進的な言語を学ぶということ

当時はLispを学ぶことで、そうした先進的な概念をまとめて学ぶことができたのである意味効率的であったと言えます。

現代においてLispを学ぶことは当時のような圧倒的アドバンテージはないかもしれません。

ただ、現在も計算機科学の業績や知見を実装した先進的な言語から、数年後、十数年後にそうした新しい概念が実用的な言語に導入されるという流れは続いています。

たとえば、Swiftには関数型言語から導入された概念があります。

Swift Monads, Functors and Applicatives with examples | Medium

Monad, Functor and Applicatives in Swift | by Steven Curtis | Medium

直接就職や仕事に繋がらなくても、先進的な言語を学ぶ意味はこうしたことではないかと思います。

ちなみに最近は学術色・実験性の強い言語から実用的な言語への概念が導入されること、これを便宜的に垂直的と呼ぶとすると、たとえばReactiveXの考え方が、C#のオリジナルからJSやSwiftなど他の言語に伝播したように、実用的な言語の間でこうした新しい考え方が相互に普及していくケース、いわば水平的な展開も増えているように思います。現代では他分野の言語のパラダイムに目配りしておくことも重要なってきていますね。

Lispの良いところ

では現代においてLispを学ぶ価値はないのでしょうか?そんなことはありません。

文法がシンプル

Lispはすべてがカッコ()で囲まれているので初見はとっつきにくいですが、文法と呼べるほどのものがありません。ちょっと何言っているかわからないかもしれませんが、乱暴な言い方をすると、AST*3をそのまま書けばプログラムとして成立するのです。

たとえば、演算子の優先順位を覚える必要はありません。

通常の言語では、1と2を足したものを3倍する処理を書こうとしたつもりが、

1 + 2 * 3 

と書いてしまい、意図した結果と異なる動きをしてしまうとことがあります。まあ加減乗除の優先順位を間違える人は少ないと思いますが、言語特有の演算子とかだと結構間違えることが有ると思います。

Lispでは一番内側のカッコの中から評価するので、

(* (+ 1 2) 3)

となり一目瞭然です。

文法がシンプルであることは処理系の実装が容易であることでもあります、プログラミング言語を作る上で挫折しがちなパーサ(yaccが生成する部分に相当)を書く必要がないので、Lispのサブセットを書くことは他の言語に比べてはるかに用意です。

名著がおおい

Lispは長年、コンピュータ科学の研究におけるPoC・プロトタイピングに用いられてきたためか、コンピュータ科学の入門書にはLispを用いて説明された本が少なくありません。最も代表的なものとしてはSICPの略称でも知られるこの本です。

ほかにも、「オイラーの贈り物」で有名な数学本の著者、吉田武さんがかかれた「素数夜曲」なども、大著ではありますが面白い本です。

おまけ

今ほど分厚くはなかったけど、この本もお世話になりました

COMMON LISP 第2版

COMMON LISP 第2版

Amazon

*1:ゲーム業界ではフルアセンブラが普通で、すこしづつC言語が採用されていったと聞いたことがあります

*2:非局所的脱出については、C言語のライブラリ関数でsetjmp/longjmpというものがあるにはありました。また、再帰はC言語も使えます

*3:Abstract Syntax Tree: ja.wikipedia.org