Clojureの学習でSICPは使えるかと問われ、Rich曰く、

最初の文章のまま載せていますので、コメント欄のshiroさんの添削と合わせてどうぞ:

一概には言えないが、2点だけ。


僕は、SICPプログラミング言語の本じゃなくて、あれはプログラミングの本なんだと思ってる。本の中でSchemeを使っているのは、アトミックなプログラミング言語だからなんだ。ラムダ計算、末尾再帰、継続を使った抽象制御、抽象構文(マクロ)、可変状態など。軽量で、かつ十分だ。


SICPでは、プログラミングをする上での課題を扱っている。モジュラリティ、抽象、状態、データ構造、並列処理など。generic dispatchやオブジェクト、並列処理、遅延リスト、(可変な)データ構造、「タギング」なんかの、明確な課題設定に対する実装例と解説が書いてある。


Clojureはアトミックなプログラミング言語じゃない。僕はもう、アトミックにプログラミングするのは古くて遅くて飽きた。Clojureでプロダクトとして実装されているのは、generic dispatch、連想マップ、メタデータ、並列処理基盤、データ構造の永続化、遅延シーケンス、多態ライブラリなどなど。SICPで実装するだろうものは、Clojureでは既に用意されている。


そう、SICPの価値はプログラミングの概念を学習するところにあるんだ。もし、既に理解しているとしたら、これは私見だが、Clojureを使ってロバストで価値を生むプログラムを素早く書けるだろうと思っている。それに、Schemeと比べて、Clojureのコア部分は極端に大きいとは思っていない。Schemerはどう思う?


私としては、ClojureよりもLispを学習する利点は、関数型プログラミングやリストを学ぶための良い道筋になると思っている。高次で簡潔なデータ構造を学習すると、急ぎの割にコロコロ変わる要件をこなすような、実務でのプログラミングで役に立つ*1Lispが劣っている点としては、プロセス内並列処理が広まる以前に設計されたものだったり、高パフォーマンスな多態ディスパッチ(例えば仮想関数)がライブラリ化される価値が理解される以前のものだったりすることだ。Lispのライブラリは明らかに制限のある多態性しか持てない。


Stuart Hallowayが書いた「Proguramming Clojure」は、e-bookで出版されてて、もうすぐ紙媒体も発売する予定だ。もちろん、Scheme標準よりも拡張して、(必要となりそうな)より多くの機能を用意しているが、そのあたりは本には書かれていない。どちらの場合のドキュメント*2


SchemeCommon Lispを学習して、Clojureを理解する方法はよいことだ。直訳できない仕様は幾つかある(Schemeと比べてTCOはなく、false, nil, ()は違うし、継続はない。CLやLisp-1と比べてsymbol, var dichotomy がない)。しかし、私個人としては、SICPClojureを学習するには、あまりマッチしないと思っている。


※効果は人によって異なります。


Clojure for Scheme Programmers | Clojure Programming/Tutorials and Tips
http://en.wikibooks.org/wiki/Clojure_Programming/Tutorials_and_Tips#Clojure_for_Scheme_Programmers

以上、勝手訳*3。Rich HickeyClojureの作者。

ところどころ怪しいが、要するに、Clojureを使うための教科書としては、SICPはアトミックすぎるということですかね。

逆をする分には問題ないという感じか。

*1:この辺は自信がない

*2:??

*3:この文章のライセンスは原文に従い、 http://creativecommons.org/licenses/by-sa/3.0/deed.ja です。