(rontolisp) docs

構文

リーダは 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)。