[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"
- メタデータ。