今更ながら、「Land of Lisp」を読了しました。
Emacsユーザーである自分にとっては、近くて遠い存在でだったCommon Lispについてフランクに学べるとてもよい一冊でした。 他数々のレビューに「聖典」とまで称されるに相応わしい良書だったと思います。なにより、読みやすいことと、読んでいて楽しいという点が素晴しかったです。
なぜLisp?
特に最初の方に色々と言語の強みについて書かれています。後半写経していくと、実感できるところも沢山あります。
私はLispそのものに魅力を感じている人間なので、この本で主張されているようなLispの利点などについては納得しかないですが、誰にでもあてはまるとは思っていません。
Lispそのものや、Lispを学習するということについて、賛否様々な意見を見かけますが、こういうのは好みの話なのでどちらでもいいんじゃないかなと私は思ってます。 自分の場合は単純にLispが好きなのでやってる感じです。Emacsも好きで使ってますし。
好きだから、とかやりたいから、っていうのは行動原理としてとても本質的なので、すごく大事だと思っていて。 特に年齢を重ねてくるとそういうモチベーションで活動することの大事さをより強く感じる気がします。
あとは、頭の体操にもなると思ってます。 人間というのは怖いもので、一度ロックインされてしまうと、中々他の考え方を受けいれ難くなっていくんですよね。 これも年齢が上がるほどそうなんですけど^^;
でもこれがロックインされている、っていうことに気づくには、それ以外の考え方を知らないとわからないわけで。
プログラミングに限らず、普段触れている物事と違ったものに触れるというのは、自分の思考を柔軟にするのにとてもよい方法のひとつだと思うわけです。 Lispを学ぶということにも、そういった効果もあるのかなと思います。
再帰プログラミング
Common Lispには loop
マクロがあり、Land of Lispでは、その説明に1章使われています。
一方Lispではとても自然な形で再帰がよく利用されます。
Common Lispではないですが、「リスト遊び」 や 「Scheme手習い」 など、再帰プログラミングにフォーカスしている書籍もあります。
「Land of Lisp」の中でも再帰が多用されています。
ゲームを作る中で必要なところで自然と再帰が使われているので、
コード中のどういうシーンで再帰を使っていて、どういうケースは loop
を使っているのかを見るのも勉強になるかもしれません。
Haskellでは反復を表現するのに for
文のようなシンタックスはないので、 loop
マクロの存在はLispの柔軟性の表れなのかもしれないな、とも思ったり。
関数プログラミング
この本で説明されている内容は、実際に関数プログラミングを開発で利用するための説明としては必要十分じゃないかと思いました。
自分が以前Haskellを使って学習していたときは、より制限が強く、また数学的な側面まで触れていましたが、何かをうまく開発するための道具としては率直にtoo muchかなと思っていました。
しかし逆に言うとCommon Lispは言語として関数プログラミングを逸脱していることを警告してくれる仕組みはないということなので、意識して書かないとうまくコーディングできない可能性はあります。 意図しないところに副作用を入れてしまったりとか。
13.5章のマンガでもHaskellを揶揄して、Lispの良さとこの辺のトレードオフに関して主張されてました。こういうコミカルな表現が多分に使われているところが本書の良いところですね。
メタプログラミング
17章の簡単なDSLの開発とマクロの解説を通して、Lisp マクロの強力さと、それによるメタプログラミングの可能性をほんの少しですが体験することができると思います。
ちなみにReact.jsのJSXってJavaScriptの言語拡張なので、JavaScript方言とか言ってもいい気がしますよね。 Reactではbable.jsを使って、ある意味むりやり実現しているわけですが、Lispのマクロはこれと同じようなことを言語の仕組みそのもので実現しているイメージです。
まとめ
「Land of Lisp」を読んで、思ったことをつらつらと書いてみました。
自身がLispを学んでいる理由と、そこから得られると思われるいくつかのプログラミング技法に関する知識について触れてみました。 これらの技法はLispだけでなく、他の多くの言語でも利用できるものであり、中には近年流行しているものもあります。
Lispは非常に古くからある言語ですが、こういった最近の流行の技法と言われているものも、元々利用できる言語だったことが伺えます。 書籍内でもLispで実現されたアイデアが他の言語で使われている、などの記述がありますが、これが「古くて新しい」などの枕詞で紹介されることがある所以だと思います。
ちなみに、本格的にCommon Lispで開発してみたい場合は、開発環境などへの言及はないので、別途情報を収集する必要があるかもしれません。 自分はEmacs/SLIMEでやってました。