home ホーム search 検索 -  login ログイン  | reload edit datainfo version cmd icon diff delete  | help ヘルプ

読書メモ/"Practical Common Lisp"(邦訳:「実践Common Lisp」)

読書メモ/"Practical Common Lisp"(邦訳:「実践Common Lisp」)

読書メモ / "Practical Common Lisp"(邦訳:「実践Common Lisp」)
id: 907 所有者: msakamoto-sf    作成日: 2011-01-28 14:43:37
カテゴリ: hacks 読書 

例によって原著の方を購入してしまったので、そちらの読書メモになります。
「実践Common Lisp」が出る前に買ってしまったのですが、実に3年近く本棚で眠っていた事になります。

LISP本と来ればLISTの解説や理論重視っぽくて、現実世界で活用できる印象が薄い。そんなイメージを良い意味で壊してくれる一冊です。
Common Lispの柔軟かつ強力な言語機能を幅広く、かつ詳細に紹介してくれています。
「実践(Practical)」と冠する通り、マクロ展開であったりLOOP処理であったり、現実のプログラミングで遭遇することの多いトピックを重点的に攻めています。
他のLISP本やScheme本、Web記事を読んでみたけど、イマイチ現実で使える感じがしない。そんな方に、やり直しの一冊としてオススメできると思います。


書籍では"LispBox"なるオリジナルの実行環境一式を公式サイトよりDLして云々とあります。しかし2011年現在、さすがにアップデートが追いつかないのか、www.gigamonkeys.com上にはDLリンクがありません。
http://www.gigamonkeys.com/lispbox/
プロジェクト自体は継続しており、"Lispbox project"へのリンクもありますが、そちらで提供されているのも"test"バージョンのビルドです。

2011年現在、EmacsしかりCommonLisp処理系しかり、いずれも各メジャーOSで安定して利用できますので、各自で揃えちゃいましょう。

Emacs + SLIME:

CL処理系色々:

CLドキュメント:

変化球としてはEclipseプラグインという手もあるようです。

Ubuntu8.10にEmacs, SLIME, SBCLをインストールする記事。「実践CommonLisp」関連の話題も交えています。

自分はWindows7上で Emacs + SLIME + Clozure CL で整えました。インストーラ不要でアーカイブ展開するだけで使えますので、レジストリを汚す心配はありません。

Emacsのカスタマイズファイルを見つけるのに少し手間取りました。

%AppData%\.emacs.d/init.el
Windows7 -> C:\Users\(ユーザ名)\AppData\Roaming\.emacs.d

".emacs.d"ディレクトリはEmacs起動時に作成されます。"init.el"は自分で作成します。

SLIMEでClozure CLを使うための設定:

(set-language-environment "utf-8")
(add-to-list 'load-path "C:/.../slime-2011-01-24/")  ; your SLIME directory
(setq inferior-lisp-program "C:/.../ccl-1.6-windowsx86/wx86cl.exe -K utf-8") ; your Lisp system
(require 'slime)
(setq slime-net-coding-system 'utf-8-unix)
(slime-setup '(slime-fancy))
(show-paren-mode)
(setq transient-mark-mode t)

以下、ネガティブな評価です。

Amazonレビューやその他の読書レビュー的なBlogでも概ね好評な本書ですが、個人的に不満が残る点もありました。読むときの注意点として頭の片隅にでも置いといてください。

細かすぎて初心者・入門者には冗長すぎる文章

文章も丁寧で細かいところまで解説してくれているのですが、逆に「これから始めてみよう」という初心者・入門者レベルには冗長すぎるように感じます。日本語版の正誤表から一部引用させてもらいますが、文章としてはこんな調子が多いです。
http://pcl.lispuser.net/wiliki.cgi?%E6%AD%A3%E8%AA%A4%E8%A1%A8


その1:

コンディション通知関数にはWARNという関数もある。この関数によって、コンディションシステムの上に違う種類の手続きを構築することができる。 WARNはERRORと同じく、SIGNALを呼んでコンディションを通知する。しかしWARNはSIGNALが戻ってきてもデバッガを起動しない。コンディションを*ERROR-OUTPUT*に印字してNILを戻し、呼び出し元が処理を続けられるようにする。WARNはSIGNALを呼ぶ際に、 MUFFLE-WARNINGという名前の再起動も確立する。これをコンディションハンドラから呼び出せば、WARNは何も印字せずにNILを返す。再起動関数MUFFLE-WARNINGは、MUFFLE-WARNINGという名前の再起動を探して呼び出す。対応する再起動が存在しない場合は CONTROL-ERRORを通知する。もちろんWARNで通知されたコンディションを処理する方法はほかにもいくつかあり、まるでエラーであるかのように処理すれば、コンディションハンドラで警告をエラーに「昇格」させることもできる。


その2:

ほとんどのフォームはトップレベルフォームでも非トップレベルフォームでも同じものにコンパイされるが、EVAL-WHENのセマンティクスはトップレベルフォームとしてコンパイルされるか非トップレベルフォームとしてコンパイルされるか、もしくは単純に評価されるかに加えて、situationに列挙された状況との組み合わせによって決まる。


まるで物理や数学の教科書を読んでいるみたいで、さっぱり頭に入ってきませんでした。
「日本語訳がダメなんじゃないの?」と思われるでしょうが、原文もこんな調子です(T_T)。
このレベルの詳細な「仕様ドキュメント」は、必要に応じて原点を当たれば良く、中級者以上が対象になると思います。
初心者・入門者向けであれば「とりあえずこれだけ知っていればLispプログラミングを楽しめるよ」と必要最低限をシンプルに示してくれたほうが親切です。

文章量に比べて図やサンプルが少ない点

関数やマクロが丁寧な、細かすぎる解説でたくさん紹介されているのですが、それを動作確認できるお手頃なサンプルコードが不足しています。
図らしい図も、6章で変数のスコープを図示しているのと、12,13章でのリストのイメージ図位です。
19章の例外処理や21章のパッケージとシンボルの話題など、図を使って説明してくれていればもっと分かりやすかったと思います。
長い文章を丹念に読み込み、自分でイメージを作らないといけません。

「実践(Practical)」の意味

私見ですが、「過去のLISP本に比べたら」実践的という程度で捉える必要があります。

Webアプリケーションや業務アプリケーションの世界では、WebAPIで外部サイトと連携するのが当たり前、HTMLのデザイナとロジックを組むプログラマが分業するのが当たり前。RDBやKVSと連携できるのが当たり前。UTF-8とUnicodeが普及し、外部システムとのやりとりで文字コードを変換したり文字コードをチェックするのが当たり前。OSの提供するGUIウィジェットを使ったGUIアプリを構築するのが当たり前。

そういう観点では、まだまだこの本は「実践的」には程遠いと言わざるを得ません。

この本は、「LISPが如何に柔軟で強力な機能を有するか」という事は示してくれています。
しかしそんなことは分かりきっています。熱狂的なファンが存在し、実際にLISPで開発されたアプリケーションやシステムが有ることも噂に聞いています。柔軟で強力、故に実践的で有ることは分かりきっているのです。

問題は「LISPを覚えることで、LISPの外部とどんなインタラクションが出来るの?」その一点です。
既存のプログラミング言語と同様に、RDBと上手く連携できるのか?
Webサーバに組み込んでスマートなWebアプリケーションを構築できるのか?HTMLとロジックは上手く分離できるのか?分離されたHTMLはデザイナが触れる内容になっているのか?
GUIアプリケーションは構築できるのか?そのためのフレームワークは用意されているのか?
xUnitツールは存在するのか?
文字コードの取り扱いはどうなっているのか?既存の言語と同様かそれ以上に柔軟な運用が可能か?
外部ライブラリやパッケージのインストールはどうすれば良いのか?統一されたパッケージ管理のインフラは存在するのか?
システムのデーモンとしてバックグラウンド処理を行うにはどうすれば良いのか?
システムのコマンドライン機能を使って外部プログラムと対話するにはどうすれば良いのか?

外部との様々な連携を「そつなく」こなせること、それこそがWeb開発者や業務アプリ開発者が気にする「実践的かそうでないか」のポイントだと思います。

このギャップを象徴しているかのように、本書では正規表現が登場しません。昨今のスクリプト言語やJava, C++(Boost)でも提供されている、まさに切実に現場で使われる重要なこのトピックを取り扱わずに「実践的(Practical)」と冠されていても拍子抜けしてしまいます。実際、Common Lispには正規表現ライブラリが含まれておらず、外部ライブラリとして提供されているようです。

"LISPプログラミング"で「楽しめる」か?

プログラミングを始める動機の一つに「楽しさ」があるのは間違いありません。
しかし、何が楽しいのかについては各人に寄ってくると思います。
グラフィック機能を活用してアニメーションや画像処理をするのが「楽しい」という人。
難しい数学パズルを解くためのアルゴリズムを考え、実際にプログラムを使って解かせるのが「楽しい」という人。
Webアプリを作るのが「楽しい」という人。
インタラクティブなビデオゲームを作るのが「楽しい」という人。
「楽しさ」の動機が異なると、プログラミングの指す内容も異なっていきます。

私見ですがLISPが未だにマイナーな存在であるのは、こうした「楽しさ」を実感させるためにクリアしなければならないハードルがあまりにも高いせいではないでしょうか。
アニメーションを、ビデオゲームを、Webアプリを作るために、わざわざリスト処理やマクロや非破壊的な処理・破壊的処理の違いだの、アトムだのシンボルだの、これっぽっちも勉強したくないのです。
非力でも融通がきかなくても良いので、手っ取り早くプログラムとインタラクションしたいわけです。

「いや、Lispでも十分そうしたプログラミングは楽しめる」というのであれば、それを見せて欲しい。
言語機能の柔軟さであるとかマクロの強力さであるとか、そんなものは「コンピュータとインタラクションする楽しさ」には殆ど影響しません。でなければ、誰がBASICでビデオゲームを作るのに夢中になるでしょうか?


以上がネガティブ評価になります。
とはいえ、買って損になる類の本ではありません。いずれ本当にCommon Lispが必要になったときのために、本棚に揃えておいても元は取れるでしょう。



プレーンテキスト形式でダウンロード
現在のバージョン : 1
更新者: msakamoto-sf
更新日: 2011-01-28 14:44:11
md5:019017252751f2c98f55979d126b734d
sha1:e33f5c5a14bef976b8fcb70a5f65889d919c0205
コメント
コメントを投稿するにはログインして下さい。