構文
リーダは Clojure のもので、大文字小文字を区別します:Foo と foo は別の変数です。
すべての識別子は低下の際に c% 接頭辞の後ろでマングルされるので、Clojure の名前が核フォーム
やビルトインと衝突することはありません。クオートされたシンボルはマングルから戻るので、
'e2e-foo は e2e-foo と印字されます。
ディスパッチとコメント構文
, は Clojure と同様に空白です。#! は先頭行の shebang コメント、; は行コメント、
#_ は次のフォームのスキップです(閉じ括弧の直前やファイル末尾の #_ も読み飛ばすので、
[1 #_ 2] は [1] です)。#'x は (var x) と読まれ、定義の var になります
(var 参照)。構文クォート(`、~、~@)は
セマンティクスにあります。正規表現リテラル(#"...")はパターン値に読まれます(正規表現 参照)。メタデータ(^、旧表記の #^)も
読まれます。名前やローカルについたものは解析して捨てられ、ベクター・マップ・セットの
リテラルについたものは with-meta と同様に付きます
(セマンティクス参照)。レコードリテラル
(#ns.Name{...}・#ns.Name[...])は、評価しない本体からなるレコードに読まれます
(defrecord 参照)。
文字
文字は文字として読まれます:\a、小文字の newline/space/tab/return/backspace/
formfeed 名、\uXXXX、\oNNN。バックスラッシュ直後の文字は種類を問わずリテラルの
一部なので、pr がそう綴る \(、\;、\" も読めます。バックスラッシュは
リテラルを終えます([\a\b] は2文字です)。それ以外は Unsupported character 拒否です。文字は
可読印刷(pr)では \a、通常印刷(println/str)では a と印字されます。
数
整数は基数付きで読まれます:0xFF は 16 進、2r101 と 8r17 は任意基数 Nr 記法、
先頭 0 は 8 進です。符号は基数接頭辞の外側に付きます。整形はされるが解釈できない
トークンは Invalid number 拒否です。
1M は厳密な有理数に低下します(0.1M は 1/10)。10 進演算は倍精度の丸め誤差なしに
厳密に保たれ、目印なしの有理数として印字されます。long 範囲を超える 2N は bignum で、
これも目印なしで印字されます。有理数は 1/2 として読まれます。
##NaN、##Inf、##-Inf は、ソースでも read-string/read でも倍精度数に読まれ、
pr・prn・println は同じ綴りで印字します(コレクションの中でも同じです)。値単体の
str と format は NaN、Infinity、-Infinity と綴ります。これ以外の ##名前 は
Unknown symbolic value 拒否です。2つの NaN が = になることはありません。NaN をマップや
セットのキーにすると、オラクルが同じボックス化オブジェクトしか見つけないのに対し、ここでは値で見つかります。
真偽値、nil、キーワード
true、false、nil は自己評価型です。false は nil とは別のオブジェクトです
(仕様との差異参照)。キーワード :foo はその綴りをそのまま(大文字小文字を
保存して)保持するデータで、:a と :A は別物です。コロンの付いた形で印字されます。
名前空間付き :a/b は全体で印刷・比較される不透明なデータです。:: 自動解決は現在の
名前空間に対して解決されます。(ns my.ns) の中の ::kw は :my.ns/kw に、何もなけれ
ば :user/kw に、::alias/kw はエイリアス(:require の :as、名前空間自身の名前、
require なしの既知の名前空間)経由です。未知のエイリアスは Invalid token 拒否です。
呼び出し位置のキーワードはマップ参照です -- セマンティクス。
コレクションリテラル
ベクター [1 2 3]、マップ {:a 1}、セット #{1 2}、クオートリスト '(1 2 3) は、
セマンティクスが述べる低下先のリテラルとして読まれます。セットリテラルは
綴り単位で重複要素を拒否します(Duplicate key)。