Getting Clojure 1-4章まで
1章: 基本
インデントはタブでなくスペースでやるのがClojureでは一般らしい、2文字スペース
Clojureをファイルで書くときは上から順に読まれるので、関数の呼び出しある時は呼ばれるより上で書くこと
再帰の時とかはdeclareで事前に定義しておいて、ってやるよ、goとかと一緒だね
2章: vectorとlist
vector => [ ]
どの型も一緒にまとめれる
内部的には配列(array)
list => ( )
内部的に連結リスト
宣言するときは、区別のためにシングルクォートをつけてね '(1 2 3)
first, nth, restといった関数がcollectionに対して実行できるよ、これらの関数は元のcollectionは変えずに新しいの作るよ
Clojureはほとんど不変性からできてるよ
Clojure新エンジニアが懸念するのは、ここでのパフォーマンス
内部的には、木構造で配列を管理しており多くのデータを再利用することで、コピーされるデータは必要最低限に抑えられるよ
vectorに新しい要素を追加するには
後ろに追加 conj
conjはlistだと前に突っ込まれる
前に追加 cons
clojureではpersistentを「非常に高速なコピー作成を可能にする不変データ構造」として扱う
IT業界だとDBに保存されてるデータとかをpersistentと言うことが多いよね
Clojure界では圧倒的にVectorの方がListより使われてるよ
3章: HashMapとKeywordsとSet
HashMapは{ }にペアの値を突っ込むことで作れるよ
Hash MapのKeyに多くのClojureエンジニアはKeyword, :aaaを使うよ
stringはデータみたいなもので、keywordsはコードみたいなもの
多言語でいうシンボルやenumみたいだね
keywordsでHashMapのkeyを作ると
(:key map)
(map :key)
どちらでも呼び出せるようになる、また前者の方が一般的によく使われるよ
新しい要素の追加はassoc, 削除はdissoc
元のhashmapは不変というのはvectorとかと一緒だよ
HashMapはkeyの順序保持しないよ、保持するsortedmapがあるよ
(keys map) は順序保持せずにkey一覧を出す
でも(vals map)と(keys map)のセットでの順序は保証されてるよ
mapでkey-valのセットごとにコンマを入れるのは意見が分かれているらしい
setは#{ }
4章: 条件処理とか
If, Cond, Case
(if condition true節) , 多くのclojureプログラマーは1ラインで書くことが多いらしい
not equalは!=じゃなくてnot=なので気をつけよう
Boolean以外の型でのcondition判定
多言語みたいにIntegerの1はTrue, 0はFalseでないから気をつけよう
nil, false以外は全てtrueになる
ifので条件がtrue or falseの場合に複数操作を実施したい場合はdoで操作を包んであげればいい
ifは3項演算子っぽく使われることが多い
ifに似たのでwhenがある
whenはtrue時の挙動だけを記述する、条件がflaseの場合はnilを返す
Clojureでif-elseみたいなの書きたい場合はcondを使ってね(ifだけでやるとネストがどんどん深くなる。。)
code: cond.clj
(cond
a 0.0
(< b 50.0) 5.0
(< b 100.0) 10.0
; それ以外は:elseを指定してね, これはあくまで慣習、clojureは前述通りnil, false以外全てtrueなので
; :elseというシンボルもtrueになるよ
; 別に:default, true, "whatever"だろうとなんだっていい
:else (* 0.1 b)))
caseもあるよ
code: case.clj
(case a
:aaa "aは:aaaでした"
:bbb "aは:bbbでした"
"defaultですよ"))
例外処理
try, catchがあるよ
code: try-catch.clj
user=> (try
#_=> (catch ArithmeticException e (println "Math problem."))) Math problem.
nil
throwで例外も作れるよ
code: throw.clj
user=> (throw
#_=> (ex-info "this is error message" {:book "fooo"})) Execution error (ExceptionInfo) at user/eval2014 (REPL:2).
this is error message
ex-infoは埋め込み関数で、エラーメッセージとhashmap(より詳細なエラー情報を持たせる)を受け取って実行できるよ)