[amazonjs asin=”4274067890″ locale=”JP” title=”プログラミングClojure”]
本屋で見かけたのでついうっかりと。Scalaの本は迷った挙句にやめたのに……大きさが手頃だからかも。
で,第1章 Getting Started と第2章 Clojureひとめぐり だけ読んでみた。以下メモ。
- JVMの上で動くLisp リ・ローデッド。
 - カッコはやや少ない。
 - 関数型。
 - Javaのクラスが利用できる。
 - 並行プログラミングが簡単。
 - 動的型。
 - 一般にデータは変更不可能だけど,リファレンスは状態を持つことができる。
 
user=> #{}
#{}
- リファレンスを更新するのはトランザクションの中で。
 
user=> (def visitors (ref #{}))
#'user/visitors
user=> (dosync (alter visitors conj "Stu"))
#{"Stu"}
- マクロとリーダマクロがある(どうちがう?)
 - マップ
 
user=> {:Lisp "McCarty", :Clojure "Hickey"}
{:Lisp "McCarty", :Clojure "Hickey"}
- :(コロン)出始まってるのはキーワード。Ruby の Symbol のようなもの。
 - マップは関数としても働く。引数としてキーを与えると対応する値が返る。
 
user=> ({:Lisp "McCarty", :Clojure "Hickey"} :Clojure)
"Hickey"
- キーも関数として働く。引数としてマップを与えるとキーに対応する値が返る。
 
user=> (:Clojure {:Lisp "McCarty", :Clojure "Hickey"})
"Hickey"
- 関数を定義するには defn。もちろん無名関数もあり。
 - 分配束縛。
 - 副作用を扱うには,do を使う。この do は Haskell のとはべつもの。
 
user=> (defn is-small? [number] (if (< number 100) "yes" (do (println "Saw a big number" number) "no"))) #'user/is-small? user=> (is-small? 101) Saw a big number 101 "no"
- メタデータ。