Google
ブログ(iiyu.asablo.jpの検索)
ホットコーナー内の検索
 でもASAHIネット(asahi-net.or.jp)全体の検索です。
 検索したい言葉のあとに、空白で区切ってki4s-nkmrを入れるといいかも。
 例 中村(show) ki4s-nkmr

ウェブ全体の検索

Peter Seibel著「Practical Common Lisp」(Apress)2005年09月16日 02時55分19秒

ASAHIネット(http://www.asahi-net.or.jp)のjouwa/salonからホットコーナー(http://www.asahi-net.or.jp/~ki4s-nkmr/ )に転載したものから。
---
http://www.amazon.co.jp/exec/obidos/ASIN/1590592395/showshotcorne-22/ref=nosim
Peter Seibel著「Practical Common Lisp」(Apress)の紹介です。
 夏休みの宿題として、これを読もうと思っていて、8月に入って読み始めた
ら、滅法面白くてハマりました。何より構成と書きっぷりがいい。
 本書を一言で言えば、「Lisp 50年の叡智を、巧みな構成と筆致、実践的な
プログラム例で、おしげもなく詰め込んだ現代的プログラミングの解説書」と
言えます。

 著者のサイト、
http://www.gigamonkeys.com/book/
Practical Common Lisp
に行くと、HTMLで本書の全文が公開されていますが、本のほうが圧倒的に読み
やすいです。ぼくは最初はHTMLを印刷して読んでいましたが、本が来てからは、
やっぱ本はいいなと思います。
 本書の注は面白い。それが本では脚注になっていてすぐ読めますが、HTMLで
は章の最後にあるので行ったり来たりしなければならず読みにくいのです。そ
れから、本は索引があるけど、HTML版にはない。これも読みやすさに大きく影
響します。
 これだけでも本を買う価値は十分ありますが、やはり本という形になってい
ると所有欲も満たせます。

 著者のPeter Seibelさんは、第2世代のLispハッカーと呼ばれる人たちの一
人です。以前は、Perlでウェブサイトを作ったり、WebLogic(いまのBEA
Systems)の初期にもいてJavaでも開発していたけれど、Common Lispに出会っ
てすっかりお気に入りになってしまったそうです。
 でね、Peterさんのお父さんのエピソードがあって、お父さんは1980年代に、
ある会社で破綻しかかったプロジェクトを引き継いで見事成功に導いたそうで
す。当時はLispを使ったAI(人工知能)ブーム。それでお父さんはCMU(カーネギ
ーメロン大学)に行って、Lispのことを聞いて、Lispでそのプロジェクトを立
て直すことを決心して、成功したそうです。
 お父さんがLispに出会ったのが1980年代だもんなあ。その息子さんだもんな
あ。やっぱ、第2世代だよなあと。冒頭のエピソードだけで自分が年をとった
のがよくわかりました(泣)。

 さきほど紹介したPeterさんのサイトに行くと、本書の目次があります。こ
の目次を見るだけでも、Peterさんの本書に込めた願い、意気込みが伝わって
きます。
 それは何か。
 Lispは、John McCarthy先生がLispのアイデアを思いついてから、なんと早
50年、Common Lispの最初の規格ができてから20年、ANSI Common Lispになっ
てからでもすでに10年。広く実用的に使われ続けている言語としては、
FORTRANの次に古い言語です。
 古いゆえに、すでに時代遅れで死んだ言語だという偏見が根強いのです。
 Perlなどが中心的話題になっている今年のオープンソースやスクリプト言語
のカンファレンスでも、LispハッカーのPaul GrahamさんがLispのことを話し
たあとのセッションは、死んだ言語(Dead Language)のセッションで、トップ
がLispだったので大爆笑だったそうです。
 Lispは実際には死んでいません。その優れたアイデアのいくつかが、他のプ
ログラミング言語の中に換骨奪胎されたとはいえ、最近作られた言語でも遠く
及ばない面をいまだにもっている、現代的で先進的な常に進化し続けている言
語です。
 それから、Lispは日々の仕事には使えない言語という偏見も根強い。
 これはこれまでのLisp解説書にも責任があって、出てくるプログラム例は、
高尚な理論やアルゴリズムを記述したり、AI(人工知能)的なプログラム例が多
かったのです。そのため、そういう高尚なものしか書けない敷居の高い言語だ
と思われています。
 これらの偏見に対して、敢然と戦いを挑み、「そうじゃないんだ。Lispはも
のすごいことも書けるけれど、あなたの身近なものも書けるんだ」ということ
を示しているのが、本書です。だから、書名が、「Practical Common Lisp」、
すなわち、「実践的Common Lisp」なのです。

 目次をみてわかるように、既存のLisp本とは構成が大きく異なります。
 Practicalとなっている章は、それまで解説したことを使って、実践的なプ
ログラムを作っている章です。
 第1章で、Lispがいかに面白くて現代的かを述べた後、第2章でLisp環境の
インストールなどの話が終わったら、第3章でさっそくPracticalです。
 これは簡単な音楽データベースを作る例ですが、これが、最終的にはMP3の
ストリーミングサーバを作ることにまでつながっていきます。これから、最終
目標まで解説を交えながら突っ走っていく、本書の構成が見事なのです。
 第4章からは、文法、関数、変数と続きますが、よくあるLisp本では、数や
リストも最初に説明します。しかし、本書は、もっと後に出てきます。
 LispはList Processorの略で、元々、リスト処理言語として使われてきたの
に、そのリストの話なんて、あなた、第12章ですよ(リストといっても、スク
リプト言語などでいう配列のことではなく、ツリーすなわち木構造のこと。
Common Lispでは配列などはシーケンスとして扱います)。

 第5章にマクロをもってきたところが、本書の意気込みです。
 Lispのマクロは、知ってる人はマクロなしのLispなんか要らないとまでいう
代物です。ところが、あまり書籍で詳しく解説してないことが多いのです。本
書は違います。ばっちり丁寧に解説してくれます。
 拙著「電脳騒乱節」のころの原稿にも書いたけれど、マクロといっても、C
のプリプロセッサ程度のものとLispのマクロはモノが違う。違いすぎる。棲ん
でいる宇宙が違うというくらい次元が違う強力なものです。
 Lispはプログラム可能なプログラミング言語といわれたり、Lispでのプログ
ラミングは言語指向プログラミングとも呼ばれます。
 要は、Lispは、新しいプログラミング言語を簡単に作れるメタプログラミン
グ言語なのです。
 だから、先進的なアイデアが出ると、すぐLispで実装するということが行な
われてきました。
 オブジェクト指向もそう、
 Prologに代表される論理型プログラミングもそう。
 最近ではアスペスト指向プログラミング(AOP, Aspect Oriented
Programming, アスペクトがアスベストだったら大騒ぎだね。\(^O^)/)もそ
う。
もっといえば、Semantic WebのOWLの処理系もLispのCLOS(後述のオブジェク
ト指向機能)を使って書いてあるものがあります。
 これを支えているのが、S式という、プログラムにもデータにもなる単純な
構文、そしてマクロです。

 マクロの解説が終わった直後の第9章「Practical: Building a Unit Test
Framework」は、短い章ですが、本書の中でも特に感銘を受けました。あまり
に鮮やかです。
 ユニットテストのプログラムを最初は素直に書き下して、それからマクロを
使ったリファクタリングを繰り返していきます。すると、いつの間にやらフレ
ームワークが出来上がっていきます。
 この章では、Lispハッカーがどういう抽象化をマクロによって成し遂げてい
くのがよくわかります。ちょっと、他の言語では、こういう発想で抽象化を進
めていくことは考えられないのですが、Lispなら当たり前のようにできてしま
う。知らない人が見ると、これは、かなりの衝撃でしょう。

 第16章「Generic Functions」と第17章「Classes」は、Common Lispのオブ
ジェクト指向機能であるCLOS(Common Lisp Object System)の解説です。
 さきほど、Lispはいろんなプログラミングのアイデアをすぐ形にしてきたと
書きましたが、オブジェクト指向もそうです。とはいえ、単に真似るのではな
く、Lisp的な面白いアイデアを盛り込んで作られたのが、CLOSです。
 クラスの話をする第17章の前に、第16章で総称関数(Generic Function, ジェ
ネリックファンクション)を解説しているのが、いかにもLisp, いかにもCLOS
なのです。Lispは関数至上主義なのです。
 通常のオブジェクト指向言語では、メソッド(あるいは関数)は、特定のクラ
スに属していて固定的な関係にありますが、CLOSではそうではありません。ク
ラスとメソッドのむすびつきはもっとゆるやかで、しかも実行時に決まるとい
う動的なものです。
 通常のオブジェクト指向言語では、レシーバー(受け手)としてオブジェクト
があり、そこにメッセージを投げるという枠組みです。これはSmalltalk的な
世界で、JavaやC++でも概念的にはこの枠組みです。
 ところが、CLOSはそんな枠組みを超越しています。実行時に総称関数に渡った
引数の型(クラス)によって、最もそれにふさわしいメソッドが動的に選ばれて
起動されるという枠組みです。スーパークラスのメソッドを組み合わせたりも
できます。
 かつてSymbolicsのLispマシンのウィンドウシステムを書くときに、クラス
の基本的な振る舞いをちょっと修飾するためにFlavors(香り、香り付け)とい
うものが実装されたと記憶していますが、ぼくはそれを取り入れたものだと思
っています。
 Flavorsは、いまではmixin(ミキシン)として知られるものです。このmixin
という単語、RubyやDでも使っていますが、狙いは似ていても実装はLispの世界
とはだいぶ違いますね。
 さらにCLOSの世界で驚くのは、MOP(Meta Object Protocol)といって、オブ
ジェクト指向機能そのものが拡張可能になっていることです。
 Lisp屋は、自由を求めてどこまでも突き進みますね。\(^O^)/
 本書にも書いてありますが、面白いのは、AspectJを作ってAOPを広めた
Gregor Kiczalesさんは、実は、CLOSやMOPの設計者です。だから、本書には、
多くのLisperは、AspectJは、Common LispからJavaへのバックポート(より低
レベルのシステムに、上位レベルのシステムがもつ機能を移植すること)だと
感じていると書いてあります。

 第19章「Beyond Exception Handling: Conditions and Restarts」は、
Common Lispの例外処理機構の解説です。
 恥ずかしながら、コンディションシステムについては、初めて本で詳しい
解説を読みました。これを見てしまうと、JavaやC++など最近の言語で実装されてい
る例外処理機構は、とっても原始的で柔軟性がないものにみえますね。
 恐ろしいわ、Lisp屋の考えることは。

 恐ろしいといえば、第22章「LOOP for Black Belts」で解説されるLOOP構文
です。
 これ、賛否両論の機能で、全然、Lispっぽくなくて英語的な記述でさまざま
な繰り返しを書ける構文です。が、機能が豊富すぎてややこしい。でも、ツボ
にはまるととっても便利という代物。だから、これを使いこなせると章題にあ
るように黒帯、Lispの有段者になれるわけです。
 ところで、LOOP構文は、どうやって実装されているか想像できますか。
 Common Lispを知らない多くの人にとっては、聞いてびっくり、見てびっく
りだと思うのですが、これも実はマクロで書いてあるんです。
 こんなものマクロで書いちゃうんですから、かつ、書けちゃうんですから、
恐ろしいでしょ?
 プログラミング可能なプログラミング言語、言語指向プログラミング言語た
るLispらしいといえば、Lispらしいんですけど、Lisp屋の連中って、こいつら、
何考えてるんだと思いますよね。

 LOOPが、Common Lispの秘境なら、FORMATの書式指定はCommon Lispの魔境で
す。\(^O^)/
 第18章「A Few FORMAT Recipes」は、入出力の書式制御を行なうFORMATの書
式指定の解説ですが、まあ、フツーの目には、どう転んでも、文字化けにしか
見えません。\(^O^)/
 昔、TECOというテキストエディタがあって、初期のEmacsはこれをスクリー
ンエディタに拡張したものです。TECOのプログラムを学生時代見たことがあり
ましたが、いろんな記号1文字がコマンドなので、デタラメにキーボードを叩
いた暗号みたいにみえます。それを思い出します。\(^O^)/
 たとえば、
http://www.catb.org/~esr/jargon/html/T/TECO.html
The New Hacker's DictionaryのTECOの項
には、TECOのプログラム例があるのでみてください。
 しかも、この書式制御のコマンドは、条件実行したり、パラメータをスキッ
プしたり、元に戻ったり、これだけでプログラミング言語。もっといえば、ロ
ーマ数字で出力したり、英語で出力、たとえば、1234を one thousand tow
handred thirty-fourなどと出力する指定があったり、Lisp屋って奴は、ほん
とやり放題です。こういうのはハックバリューであって、MITのAIラボのハッ
カー文化が歴史的遺産として残っている部分ですね。

 第23章以降は、Practicalの章です。最初にスパムフィルタを軽くやっつけ
たら、以後は、ID3のバイナリファイルのパーサを作り、MP3のデータベースを
作り、Franz社のAllegro Common Lispで書かれたウェブサーバAllegroServeを
使って、最終的にはMP3のストリーミングサーバまで全部Lispで書いてしまい
ます。
 第31章と第32章は、HTML生成プログラムを書くんですが、これが、Domain-
Specific Language(特定領域向けの言語)を設計して実装する例にもなってい
ます。たとえば、
(html (:p :style "foo" "FOO"))
と書けば、
<p stype='foo'>Foo</p>
を生成する言語を作るのです。呆れたことに、ご丁寧にもインタープリタとコ
ンパイラの両方を作ります。もう、トドメのトドメ。
 特定領域向けの言語が作りやすいという例で、一般の人にも有名なところだ
と、PS2のゲーム「クラッシュバンデクー」は、GOOLというLispベースのゲー
ム向けオブジェクト指向言語を開発して、その言語で書いてあります。

 最終章である第32章は、まとめとして、Common Lispの情報源やコードの集
積サイトはどこかとか、本書で扱わなかった機能やもっと高度な話題へのとっ
かかりを紹介してあります。
 ぼくが一番気になったのは、「そんなにLispがすごいんなら、なぜ、みんな
が使わないんだ」というよくある質問への秀逸な回答が、"The Wisdom of
Crowds"という本の53ページからに書いてあるということ。
 なぜ、Lisp人口は増えないのか、ずっと昔からほぼ一定という話は、昨年か
な。Franz社のKunze社長と会ったときに出て、あれこれ説があったんだけど、
それを書くのは、別の機会にします。
 本書を読み終わって、いやあ、もう、よくぞ、ここまでやってくれたと、万
歳三唱ですよ。それくらい面白いし、よく書けています。冒頭にも書いたよう
に、構成と書きっぷりが見事。
 Lispに興味があるけど、どう書いていいのかわからない人、プログラミング
におけるものの見方を広げ、別の抽象化の手法を知りたい人には、本書は文句
なく推薦できます。
 Rubyは、ぼくはAlgolシンタックスのLispだと思っていて、それくらいLisp
からアイデアを持ってきたと思えるところがあるので、Rubyな人にもお勧めし
ます。もちろん、PerlやJavaやC++やC#な人にもお勧めします。

 早く、翻訳が出ればいいんだけどなあ。
 そうそう、翻訳といえば、
http://www.amazon.co.jp/exec/obidos/ASIN/0130305529/showshotcorne-22/ref=nosim
Paul Graham著「On Lisp」(Prentice Hall)
を、野田開さんが翻訳したものが、年内に出版される予定ですが、これについ
ては、Paul Grahamさんの他の著書と合わせて、別の機会に紹介したいと思い
ます。

 ところで、Perl以降の最近のプログラミング言語だと、間違いなく正規表現
の話があるはずなのに、本書では話題にしていません。実は、Lispで書いた正
規表現ライブラリは、たとえば、
http://www.weitz.de/cl-ppcre/
CL-PPCRE
やAllegro Common Lisp(ACL) 7,0に川合史朗(Shiro)さんが実装したものなど
があります。それらはCで書いたPerlより速いのです。ACL 7.0の場合、Perlよ
り30%速いといってます。
 ちなみに、Lispハッカーの湯浅太一先生によれば、Perlのソースみたけど、
あれじゃ、速くなるわけがない。連中、速いプログラムの書き方、知らないん
じゃないか、だそうです。\(^O^)/)
 なお、Shiroさんは、Schemeを実践的に拡張したGaucheの作者です。頭のい
い人は、うらやましいよなあ。
http://www.shiro.dreamhost.com/scheme/wiliki/wiliki.cgi?Gauche
Gauche
をどうぞ。
 Shiroさんが書いたACL 7,0の正規表現ライブラリは、昨年、数理システムで
開催されたFranz社のLisp特別セミナーでShiroさん自身による解説がありまし
た。
http://jp.franz.com/base/seminar-2004-06-10.html
2004年6月10日~6月11日開催特別イベントのご案内
に行って、「ACL7.0の新しい正規表現ライブラリ(by 川合史朗、Scheme Arts,
L.L.C.)」をみてください。
 でも、正規表現はLisperにとって主要な関心事とはいえません。
 傑作だったのは、同じ日に、数理システムの黒田さんによる「Lispプログラ
マーは、なぜ正規表現を必要としないのか」という解説があったこと。
 黒田さんの話の主旨は、Lisperだって正規表現も適材適所で使えばいい。
 けれど、Lispは、Perlのように正規表現命の言語じゃないんだから、文字列
パターンマッチしてちぎって喜んでいるだけじゃさびしいでしょうと。リーダ
ーマクロを使って(こういう、これまたものすごいものがCommon Lispにはあり
ます)、入力を読み終えた時点で、もうデータがちゃんとLispオブジェクトに
なっているほうがあとが楽でしょというお話です。

 ほかにいっておくことは、Peterさんのサイトに行くと、
http://www.gigamonkeys.com/book/lispbox/
LispBox

http://www.gigamonkeys.com/book/lispbox/download.html
でダウンロードできるようになっています。行くとわかるように、Franz社も
本書を応援していますね。
 LixpBoxは、Common Lisp処理系とEmacsとSLIME(the Superior Lisp
Interaction Mode for Emacs)というものが一緒になったものです。
 これですぐCommon Lispの学習ができるのですが、ちょっと残念なことは、
ユーザが多いであろうWindows版が、2005/09/15現在、CLISPしかないことです。

 LispBoxは、ACLもWindows版がありませんが、LispBoxと関係なくダウンロー
ド可能なACL 7.0の評価版は、8月中旬くらいから登場して、Windows版もあり
ます。
http://www.franz.com/downloads/trial.lhtml
ACL評価版ダウンロード
をどうぞ。
 以前のバージョンの評価版と同じなら、IDEがついているはずなので、Emacs
なんか使いたくないという人は、ACL 7.0がいいかもしれません。
 ダウンロードして、評価版のライセンスほしいといえば、ライセンスファイ
ルのダウンロード先がメールで送られてきます。期限はついてますが、その間
はフル機能が使えたと思います。

 ということで、やっと終わった、終わった。一体、何日かかったんだ。
 紹介しようと思ってメモを取り始めたら、書きたいことがあれこれ出てきて、
この5倍から10倍くらい書けるメモになっちゃってるんです。\(^O^)/
 時間もないのに、なんで、こんなにあっちこっちの話が湧いてくるんだろう
というくらいキリがないので、とにかく、本書のことだけ書こうと思って、書
きました。
 個人的には夏休みの宿題として、本書を読んで書くつもりだったのが2週間
も遅れちゃいました。
 明日というか、もう今日になっていますが、先日紹介したように、数理シス
テムでFranz社のLispセミナーがあるので、それまでには書かないと申し訳な
いという気持ちでやっと書きました。
 なぜ申し訳ないかといえば、最初PeterさんのサイトからHTMLをダウンロー
ドして読み始めて、これは面白いなと思っていたところに、Franz社の小俣さ
んから別件でメールがあって、「これはいい本ですね。本書の感想をウェブに
書こうと思って読んでいます」と返事したら、あなた。
 一週間経たずに、本書が送られてきたのです。\(^O^)/
 しかもなんと驚いたことに、著者のPeterさんのサイン入り。\(^O^)/
 完璧に、「おんどれ、死んでも書け書け技」を極められました。
 ね、Lisp屋のやることって、速くて効率的で怖いでしょ。

 おいおい、いつの間にやら、午前3時じゃん。
 もう寝るぞ!\(^O^)/