本買った
[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"
- メタデータ。
