見出し画像

Retro-gaming and so on

これがLISPだ!

ポール・グレアムのエッセイを読んで「じゃあLispやってみっか」と思った僕。
早速AmazonでANSI Common Lisp関連の書籍をサーチしたんだけど、ポール・グレアム自身が書いた書籍、「ANSI Common Lisp」と言う本は、正直言うとあまり評判が良くなかった(※1)。書評的には「非常に難解である」って書かれてたのが殆どだったんだよな。
まぁ、今ならその意味は分かる。「ANSI Common Lisp」って言う本は、どっちかっつーと「ANSI Common LispのK&R」を目指してたトコがあって(※2)、「薄く仕様書を纏めました」と言うのが基本路線で、簡易リファレンスとしては役立っても「これを使ってプログラミングを一から学ぶ」には適さない本なのだ。練習問題が付いてても解答もねぇしな(逆に言うと、だから、商用ANSI Common Lisp処理系のAllegro CLに「オマケとして」付けるには適切な本ではある)。
とまぁ、書評を読む限り「いや、これは最初に買っちゃダメな本だろ」ってぇんで、他に良い本ねぇかな?と思って検索してて引っかかったのがこの本「これがLISPだ!」だった。

いや、ぶっちゃけ当時、検索かけるとLispの本は結構あったんだよ。ただし、ニュアンスで言うとPrologに近いんだよな(笑)。過去(主に80年代)、人工知能ブームでそれなりに本が出版されてた実績はあるんだけど、現行の仕様には合わん、っつーか。要するに「今入手可能なLispでは」動かせないコードてんこ盛りの本ばっかなんだわ(誰かLisp-81とか知ってるか・笑?)。よっぽどの好事家(要するにLispマニア・笑)じゃないと手が出せない本ばっかなんだわ。殆どコレクターズアイテム、になってる。
そんな状況がバックグラウンドなんだけど、この本、「これがLISPだ!」ってのは題名がダサい割には(笑)、結構良い評価だったのね。「分かりやすい」って言う書評が多くて。
あそう、じゃあ、これにすっか、と。古本で安かったし。
そんなワケで、僕が「自覚的にプログラミングをやってみよう」って思って最初に入手した本がこれです。

当時、エディタの設定も何も分からんかったから、直接DOS窓で走るCLISPのインタプリタに練習問題打ち込んでて、カッコの帳尻合わないで涙目になってたのもいい思い出だよ・・・・・・(遠い目
いや、いい思い出のワケがねぇ(怒


Lispを学び始めた当時、こういう恐ろしい事をやっていた・・・・・・。
我ながら、「何も知らないド素人」って無謀な事をやるんだな・・・と呆れている(苦笑)。

まぁ、程なく、「Schemeやったら如何ですか?」と奨められて、それが縁でPLT Scheme(現Racket)を見つけて、やっとこの「Lispインタプリタで直打ち」と言うアホな行為から解放されたんで、良かったね、にはなったんだけどさ(笑)。


ちなみに、最初に奨められたのがIDE付きのMIT Schemeだったのだが、これはEmacsライクなエディタ込みで、これがサッパリ分からんかったんで、代わりのブツを探したらPLT Schemeが見つかった、と言うオチだったのである。

んで、サイエンス社から出版されたこの本、「これがLISPだ!」。これも原書は洋書で、原題はEssential LISP。オリジナルは1987年出版で。ANSI規格が制定される前のCommon Lispの最初の仕様ができたのが1984年なんで、その3年後に出版されている。んで、その当時はまだ「Common Lisp」って仕様が普及しきってなかったんだよな(※3)。
よって、この本も、古いMacLisp(Emacs Lispの殆ど前身・※4)とかXeroxのInterlispに関する注釈なんかもある。それくらい古い書籍なんで、一部のコードは今のANSI Common Lispじゃあやっぱり動かない(※5)。
そして、この本はCommon Lispの「全機能」は全く解説しない。殆どリストだらけである。

CL-USER> (princ '(こんな 例 ばっか だ!))
(こんな 例 ばっか だ!)
(こんな 例 ばっか だ!)
CL-USER> (princ '(文字列 さえ 殆ど 出てこない!))
(文字列 さえ 殆ど 出てこない!)
(文字列 さえ 殆ど 出てこない!)
CL-USER>

文字列も配列もチラッと紹介されてるだけ。データ型としては数値、アトム、リストの3つしか殆ど出てこなく、そしてほぼ100%リスト操作「だけ」に終始してるような本なのである。

ダメな本だと思う?

いや、違う。実は逆なんだわ。

Lispは初心者が扱うプログラミング言語としては殆ど最適、って程易しいんだが。・・・この本が出版された数年後にPythonが登場するわけだが。
少なくとも当時では、BASICを除くと「ド素人」が立ち上げて、すぐ関数書けちゃうような言語ってLisp以外ほぼ無かったんだよな(BASICでさえ、サブルーチンに進むまでは大変だろ?)。だって、C言語でもPascalでも「自作関数」書くまではそこそこ道のりが長いんだわ。
つまり、Lispには小難しい理屈が要らない。すぐ初心者でも関数が書けてしまう。・・・結果としてどんどん新しい概念を前倒しで学ばないとやることなくなっちまうんだわ。
そう、以前にも指摘したけど、C言語だったら2年くらいかかる内容をLispなら「簡単だから」半年もせずに修了できちまうんだ。これがLisp学習の急勾配の原因だ。「簡単」なのがむしろ仇となっていて、プログラミング初学者に対しては裏目になってしまう(記憶が定着するまでには通常時間もかかるしな)。
ところが、この本、結果、Lisp学習書としては異例の緩やかな勾配の本、なんだよね。何故なら「Common Lispの色々な機能を」全然説明しねぇから(笑)。もうホント、リスト一本槍って言って良い。だから再帰の解説なんかでもスゴいページ数取ってて丁寧に説明してる。
そしてとにかく練習問題が多いんだわ。つまり問題集として見ても非常に良い。分量的にも「多すぎる」って程多いわけじゃないんだよな。解答もキチンと付いてるし、みっちりと取り組めるようになってんだ。

もちろん、欠点が無いわけじゃない。

まずプログラミングスタイルが、敢えて言うと「古い」。その後のポール・グレアムやピーター・ノーヴィック先生みたいな現代的な「関数型プログラミング」にこの本は誘わない。ハッキリ言っちゃえばsetqの嵐である・・・・・・まぁ、実のこと言うと、CLerだとこだわらない「いまだスタンダードな」スタイルだろうけどね(※6)。
そしてトピック、っつーか目標が「人工知能」である事。これは当時のLispブームを考えればしょうがないだろう。そして今なら「人工知能に纏わるプログラミングテクニック」は普遍的でむしろ基礎教養として必要では?と僕自身は「分かってきた」んだけど、一方、プログラミング初学者がいきなり目にするには「何だそれ?」とはなるだろうな(笑)。
もう一つ言うと、「実用Common Lisp」みたいに実際にかつて作られた「人工知能研究」の成果物の何かしらをキチンと実装しましょう、って本でもない。一応最後辺りで「劣化版Prolog」的なプログラムに行き着くようなカンジにはなってるが、殆どのプログラミング初学者にとっては、「何だこれ?」だろうな(笑)。
言い換えると、「実用Common Lisp」ってのは「数学博覧書」みたいな書籍なんだけど、「これがLISPだ!」は高校の数学Iな本なんだよ。意味分かる(笑)?
高校の数学Iってつまらんじゃん。基本的に二年生以降に習う数学の「基礎」やってるワケでもないんだよな。そうじゃなくって二年生以降で習う数学で使う単なる「計算基本テクニック」集が数学Iの正体じゃん。あれ、マトモに考えると「何の為にやってんだか皆目見当が付かない」纏め方なんだよな。二年生以降の数学やってみて初めて「あれはここで使う為のモノだったんだ」とか分かるけど、初見じゃサッパリ意味が分からんでしょ?誰だ、あんなクソつまらん状態に編纂したのは、っていまだ僕は怒りを覚えてるくらいなんだ(笑)。あの「クソつまらん編纂」でどれだけ多くの若人が数学を嫌いになってんだか。
そう、「これがLISPだ!」はそういう数学I的な書物なの。「人工知能で重要になる」データ構造である「木構造」と、「人工知能で重要になる」プログラミングテクニックである「探索」を最終目的に組んでて、確かに書籍中で「人工知能では・・・」って書いてはいるんだけど、そもそも「プログラミングをやってみたい」ってだけの人には魅力的なワードにならないし、「人口無能」レベルでも実際に組むわけでもない。そう、だから数I的に「計算基本テクニック」を読者に最終的には学ばせるだけ、の本なわけ。
振り返ると「それは非常に重要な」アイディアであった事を知るんだけど、初見じゃそこは絶対予測できないんだよ。

ただ、それでも相当コンパクトな本であり、なおかつ「Lispじゃ珍しい」学習勾配が緩やか、ホント緩やかな本だ、ってのは事実なんだ。そして「一回もプログラミングをしたことがない」人にも向いてる、ってのは間違いない。

 かつては Java も、早めに学ぶのによい言語だと推奨していましたが、以下の批判を読んで気が変わりました(この文中の「The Pitfalls of Java as a First Programming Language」(最初のプログラム言語としての Java の落とし穴)を探してください)。ハッカーとしては、かれら流のひどい言い方をすれば、「問題解決に金物屋の配管工事屋のようなアプローチ」をするわけにはいきません (訳注:つまりいろんな新しい道具があってその中からあれこれわけもわからず探し回るようなやり方)。それぞれのコンポーネントが実際に何をするのか、わかっていなくてはなりません。いまでは、たぶん Java より先にまず C や Lisp を学んだほうがいいと思います。

 ここにはもう少し一般的な論点もあるのかもしれません。もしある言語が、あなたにとって役に立ちすぎるのであれば、それは生産ツールとしてはよくても、学習にはよくない言語かもしれません。この問題を抱えているのは言語だけではありません。ウェブアプリケーションフレームワーク、たとえば RubyOnRails, CakePHP, Django などは、あまりに簡単に見かけ上の理解に到達できてしまうため、本当にむずかしい問題に直面したり、簡単なものへのソリューションをデバッグするときでさえ必要になるようなリソースを与えてくれないかもしれません。

この部分が引っかかってる。
一見マトモな事は言ってる。しかし、問題は、彼が問題にしてる部分の多くは実はPythonにも良く当てはまると言う事だ。事実上、Pythonはプログラムを書くためのプログラミング言語ではなく、ツールを組み合わせる為のプログラミング言語になっている
何故、Javaは批判されててPythonは批判されてないんだろう。簡単だ。Javaがプロプライエタリな会社の雄、オラクルに買われたから、である(笑)。Javaは悪の陣営に所属してしまった。だからJavaを批判してるんだ。
一方、Pythonは善の会社(ホントか・笑?)、Googleが推してる言語だ。だからPythonには「物申さない」。
エリック・レイモンドは偉大なハッカーなんだけど、かなりステロタイプなバイアスがかかってる人なんだ。
実際は、前にも書いたけど、Pythonは(かつての)Javaの用途に限りなく近づいていて、プログラミング初心者用には適さない言語になってきてると思う。
エリック・レイモンドの言い方を借りると、「問題解決に金物屋の配管工事屋のようなアプローチ」をする言語になってるんだ。

もちろん、特定の「何か」を作りたい、って欲求がある場合(掲示板とか?)、Pythonを選ぶのは全然悪くないと思う。かつてのPerlのように「物事を凄く早くやり遂げられる」だろう。
ただ、何らかの特定の(作りたいものの)ヴィジョンがない場合、Pythonは適してない。単にそれだけの話だ。「プログラミングHow Toの一般論」はもうPythonでは学べないと思う。importしてバッチ的に繋げれば一丁上がり、だしな。
そして「プログラミングHow Toの一般論」をプログラミング初学者に教える書籍もあんまないんだよ、事実上。殆ど唯一の例外がこの「これがLISPだ!」だと思う。プログラミング初学者にも読めるし。凡百の本みたいにK&Rを下敷きにした「データ型の使い方の解説」にも終始してない(なんせリストしか使わないから、だ・笑)。
だから「何だか分からんけどプログラミングを知りたい」って人には絶好の本だとは思っている。この本はプログラミングに纏わるテクニック、そして「人工知能」って枕詞を省けば、「リストを使ってどうやって自分が望むデータ形式をデザインするのか」その一般的方法論に付いて説いてるのである。
これ程コンピュータ・サイエンス的に見て「基礎を徹底して教える」本はあまりないんじゃないのかな、って思ってる。

惜しむらくは、発行元のサイエンス社がこの本を絶版にしちまった辺りだ。だから古本以外の入手は既に困難になっている。原作のEssential LISPもAddison-Wesleyが絶版にしてるっぽい。
この本の流れで、関数型プログラミングスタイルで、Racketで再構成でもしてくれれば、大変良い、普遍的な初学者向けの「プログラミング入門書」になるのになぁ、と非常に残念なのである。

※1: この本も桐原書店がピアソン・エデュケーションと言う技術書レーベルから発刊してた邦訳本で、桐原書店がピアソンから手を引いた事で絶版になってしまった。

※2: K&Rとは、日本では共立出版から出版されている書籍、「プログラミング言語C」の事を指す。著者がブライアン・カーニハンとデニス・リッチーなので、両者の名字の頭文字からK&Rと言う愛称になっている。
プログラミング関連書籍の歴史的な名著と言われてる。
ただし、性質的にはリファレンスに近く、慣れたプログラマがザーッと調べ直すのに向いてはいるが、それ以上の本ではない。
また、「今からCを学びたい」という人にも薦めない。と言うのも既にCの現行規格とは一致せず、これを使ってCを学ぶのは害悪にしかならないだろう。つまり、「ANSI 規格準拠」と言うのは何の保証にもならず、それは日本では「C言語を学んでる」とは言えないのだ(日本のJISのC言語の公式規格は、それよりも後に制定されたISOのC99がベースの規格になってて、厳密に言うとANSI Cを学んでも日本ではそれはC言語を学んだ事にはならない)。
同じリファレンス紛いの本を買うのなら、今ならエスアイビーアクセスから出版されている「Cリファレンスマニュアル」を買うべきである(こっちも別にプログラミング入門書、にはならんが)。
なお、こっちの本の著者の1人、G.L.スティール.Jr. と言う人が、オリジナルのSchemeの作者の1人であり(今は仕様策定には関わってないが)、Common Lisp第2版の仕様を決めた人である。
そしてビックリする事に、翻訳者の玉井浩氏は、ここで取り上げた「これがLISPだ!」の翻訳者でもある。

※3: 最初にCommon Lispの仕様が公開された時、人々の反応は「フザけんな」だったらしい(笑)。あまりにもデカい仕様で、Algolの悪夢再び、に見えたらしい(Algolも仕様がデカすぎて殆ど誰も実装しようとせず、結果普及しなかった)。
そんな中でゼロからCommon Lispを実装して、人々に「Common Lispって実装できる」と言うのを証明したのが日本の京都大学の人たちで、Kyoto Common Lispと言われる処理系、現在でのGNU Common Lispを作り出した(この時期、既存の処理系、例えばFranz Lisp・・・後のAllegroなんかもCommon Lisp化を企ててたが、元々はCommon Lisp処理系ではなかった)。
この辺が呼び水となって、ATARI STでのCLISP制作等も出てくるのである。

※4: こんな名前だが、Apple Macintoshというコンピュータとは全く関係がない。一方、MacLispとはまた別にApple Macintosh用のANSI Common Lisp実装、Macintosh Common Lisp(通称MCL)ってのがあったんだから紛らわしい。
いずれにせよ、MacLisp ≠ MCLである。
MacLispは後継者Emacs Lispに受け継がれ、MCLはオープンソースとしてフォークしてClozure Common Lisp(通称CCL)になってて、両者は全く関係がないのだ。

※5: 例えば、大昔のLispだと全部関数は内部的にもマジメにリストで表現されてたんで、symbol-functionを使えばその関数定義が「覗けた」んだけど、現行のANSI Common Lispはコンパイラ前提なので、最適化の問題もあり、内部的には既にLispコードとしては存在しない。
従って、「関数定義の内情を調べる」マクロ、なんつーのは今のANSI Common Lispでは書けないのだ。

※6: 特に、ポール・グレアムは根はSchemerだ。彼のエッセイを読むと、言語仕様レベルではむしろANSI Common Lispを嫌っていて、「Common Lispがスタンダードになるとは思わなかった」と語っている。
彼はむしろScheme方言(Schemeそのものじゃない)だったT言語を愛用してたユーザーだったらしい。また、T言語が、その後、グレアムがArcの2個目のプロトタイプを書いたScheme48のルーツでもある。
また、実はピーター・ノーヴィック先生の書くコードもCLer的に言うとCLらしくなく、どっちかと言えばScheme寄りのプログラミングスタイルだろう。
  • Xでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

最近の「プログラミング」カテゴリーもっと見る

最近の記事
バックナンバー
人気記事