2010-10-04(月) [長年日記]
■ Clojure勉強中(1)
小田急線や横浜線で『プログラミングClojure』を開いたまま寝こけている人がいたら、それはワタシです。
いやまぁ、寝こけていることがあるのは事実ながら、数年前にSchemeにチャレンジしてすぐに挫折したのに比べると、ずいぶん理解してる感じはする。Clojureの構文がSchemeに比べて慣れ親しんだものに近いというのはあるが(といってもカッコ乱発のList属には違いないけど)、それ以上についこのあいだ『メタプログラミングRuby』を読んだことが効いてる。
読みながら「これをRubyで書いたらどうなるだろう」と思い浮かべると、その答えがあるていど頭に浮かぶから、理解が早い。プログラミングを初めて学ぶ初学者ならまだしも、あるていど経験があって頭の固くなった大人にとって、知っている知識を足場にできるかどうかは学習スピードに相当な違いが出るものだ。Lisp属の教科書にも、他言語と比較しながら学べる『はじめてのRuby』みたいな本があればいいのにね。
で、実際にREPLに対してポチポチとサンプルコードを打ち込みながら学習を進めているわけです。簡潔に書ける言語だからと言って、本の説明までずいぶん簡潔だったりするものだから、動かしてみないと何が書いてあるのかさっぱり理解できなかったりするので(唐突に登場したマクロの説明が50ページもあとに登場したりするし)。うっかり「(iterate inc 0)」とか打ち込んで「ギャッ」とか言ったりするわけです。ま、ひさしぶりに新しい言語を学ぶのは楽しいな。
もっとも、JavaVM上で動作する、Javaのクラスライブラリを直接呼び出せるLisp属言語ということで、けっこう妙なところがあるのだけど。特にメソッドチェインのシンタックスシュガーはなかなかキモい。あと、末尾再帰最適化ができないと知って「えっ」と思ったところ。大丈夫でしょうか……。
Lisp達人の人から、「括弧は見えなくなるものだ」と聞きましたw
末尾再帰の最適化がダメなのは、JVMの仕様から発生する制限らしいです。
代わりに recur を明示的に使ってやると良いとか。
http://sites.google.com/site/closertoclojure/hackers/loop
達人になる前に挫けなければいいんですけどw
末尾再帰最適化の件がJVMの制約だという話は他のページで登場しました。でもなんか、recurはちょっとカッコ悪いですねー。