本買った

本屋で見かけたのでついうっかりと。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"
  • メタデータ。