TL;DR
- Clojure のコードは同図像性を持ち、リーダがプログラムをフォーム単位で読み込んで Clojure のデータ構造に変換する。
- シンボルは様々なものに名前を付ける。
falseとnil以外は真と評価され、述語の名前には?を付ける。
内容
同図像性(Homoiconicity)
Clojure のコードは同図像性を持つので、Clojure のコードは Clojure のデータによって組み立てられている。
フォーム
Clojure プログラムを起動するときには、まず Clojure 内のリーダと呼ばれる部分が、プログラムをフォームと呼ばれる単位ごとに読み込んで、Clojure のデータ構造へと変換する。それから、そのデータ構造をコンパイルして実行する。
Clojure のフォームの一覧は次のとおり。
| フォーム | 例 |
|---|---|
| 真偽値 | true, false |
| 文字 | \a |
| キーワード | :tag, :doc |
| リスト | (1 2 3), (println “foo”) |
| マップ | {:name “Bill” :age 42} |
| Nil | nil |
| 数値 | 1, 4.2 |
| 集合 | #{:snap :crackle :pop} |
| シンボル | user/foo, java.lang.String |
| ベクタ | [1 2 3] |
シンボル
+, concat, java.lang.String といったフォームはシンボルと呼ばれ、様々なものに名前を付けるために使う。
strやconcatといった関数+や-といった演算子(Clojure ではこれらも単なる関数)java.lang.Stringやjava.util.Randomのような Java クラスclojure.coreのような名前空間、java.langのような Java パッケージ- データ構造やリファレンスなど
シンボルは数字から始められない。使える文字は英数字と +, -, *, /, !, ?, ., _ である。ただし、/ と . は名前空間をサポートするために特別扱いされる。
文字と文字列
Clojure の str 関数は nil を無視する。この挙動は Java の toUpperCase と異なる。
(str 1 2 nil 3) ; "123"Clojure の文字は Java の文字そのものである。リテラル表記は \{letter} で、{letter} は文字そのものか、文字の名前(backspace, formfeed, newline, return, space, tab)である。
(str \h \e \y \space \y \o \u) ; "hey you"真偽値と nil
Clojure の真偽値のルールは単純である。
trueが真、falseが偽falseの他に、nilも真偽値が必要とされる箇所では偽と評価されるfalseとnil以外は、真偽値が必要とされる箇所では真と評価される
true か false を返す関数を述語(predicate)と呼ぶ。慣習的に、Clojure では述語の名前の最後に ? を付ける。
(true? true) ; true
(true? "foo") ; false
(zero? 0.0) ; true
(zero? (/ 22 7)) ; falseClojure のすべての述語関数を確認するには、次を実行すればよい。
(find-doc #"\?$")