リーダのグローバル変数は:
Readerのデフォルトマクロ文字は:
( リスト読み込み
" 文字列読み込み
' 引用符表現読み込み
# マクロ変換
; コメント
` back-quote
, list-time eval
@ 追加
% C言語表記の数式読み込み
エスケープ文字:
単一文字エスケープ
多重文字エスケープ
エスケープされていないsymbolが読まれると、 全ての構成される文字はデフォルトで大文字に変換され、 そして大文字のsymbolは内部に蓄えられる。 例えば、'abcと'ABCは同じsymbolとみなされる。 エスケープは、それらを区別するのに必要である。 'ABC, 'ABCと'abcは同一であるが、 'abcと'abcは違うsymbolである。 デフォルトとして、大文字のsymbolを入力したときでさえ、 そのsymbolを表示するときは EusLispのプリンタが内部の大文字表現から小文字に変換する。 この変換は、プリンタによって実行されている。 この変換は、 :UPCASEを*print-case*に設定することにより、禁止される。
10.は整数の10として読まれ、実数の10.0ではない。 ':'がパッケージマーカーとして予約されているので、 'のようにsymbolを構成するものとして使うとき、エスケープ化しなければ ならない。 この制限は、文字':'の構文により強制されないが、 アルファベット順やletterの意味を決定する属性により強制される。 その文字の属性は、リーダから堅く結ばれる(hardwired)。 したがって、copy-readtableで新しいreadtableを作ったり、 set-syntax-from-charで文字のための構文的意味を組み直したりすることにより、 ある文字の構文を変更可能であるが、 その属性はどのようにしても変更することができない。 その一方で、数字はいつも数字であり、アルファベットはアルファベットで、 数値を表現するために'#$%@'の様な文字を使用することはできない。
%は、EusLispで拡張read-macro文字となっている。 挿入記述により書かれた数式の前に%を付けることにより、 その数式はlisp用の式に変換される。 具体例を上げると、 %(1 + 2 * 3 / 4.0)は (+ 1 (/ (* 2 3) 4.0))に変換され、結果は2.5となる。 Cの様な関数呼出や行列参照も、lisp形式に変換される。 従って、%(sin(x) + a[1])は (+ (sin x) (aref a 1))として評価される。 1つ以上の引数を持つ関数や2次元以上の行列は、 func(a b c ...)やary[1 2 3 ...]のように記述し、 func(a,b,c)やary[1][2][3]のように書かない。 相対表現や割り当てもまた、正しく扱われる。 それで、%(a b)は( a b)に変換され、 %(a[0] = b[0] * c[0])は (setf (aref a 0) (* (aref b 0) (aref c 0)))として得られる。 単純な最適化は、重複した関数呼出や行列参照をなくすことである。 %(sin(x) + cos(x) / sin(x))は (let* ((temp (sin x))) (+ temp (/ (cos x) temp)))のように変換される。
マクロ変換は#
文字が前に付いている。
数値(integer)引数は、#
とマクロ変換文字の間に与えられる。
これは、どの数字(0 .. 9)もマクロ変換文字として定義できないことを意味する。
リーダの標準のマクロ変換文字は次の通り:
いくつかのリーダ関数は、eof-error-p, eof-valueや recursive-pのパラメータを持っている。 最初の2つのパラメータは、リーダがend-of-fileに出会ったときの動作を制御する。 eof-error-pのデフォルトは、Tである。これは、eof時のエラーの原因となる。 eofの発生を知りたかったり、snatch controlにシステムエラーを渡したくないなら、 eof-error-pにNILを指定すること。 それで、読み込みの最中にeofが現れたとき、リーダはエラーループに入る代りに eof-valueを返す。 eof-valueのデフォルトは、NILである。 そのため、実際にNILが読まれたのかeofが現れたのか判別できない。 それらを判別するためには、ストリームに決して現れない値を与えること。 そのような特殊データオブジェクトを作るには、consかgensymを 使用すること。
recursive-pは、read-macro関数にしばしば使用される。 それは、リーダを再帰的に呼び出す。 recursive-pのnon-NIL値は、読み込み処理がどこかで始まっていて、 #n=や#n#によってラベル付けされる書式の読み込みのために 内部テーブルを初期化 すべきでないことをリーダに告げている。
read &optional stream (eof-error-p t) (eof-value nil) recursive-p [関数]
read-delimited-list delim-char &optional stream recursive-p [関数]
read-line &optional stream (eof-error-p t) (eof-value nil) [関数]
read-char &optional stream (eof-error-p t) (eof-value nil) [関数]
read-from-string string &optional (eof-error-p t) (eof-value nil) [関数]
unread-char char &optional stream [関数]
peek-char &optional stream (eof-error-p t) (eof-value nil) [関数]
y-or-n-p &optional format-string &rest args [関数]
yes-or-no-p &optional stream [関数]
以下に示すreadtableの操作関数の中で、readtableのデフォルト値は グローバル変数*readtable*の値である。
set-syntax-from-char from-char to-char [from-readtable to-readtable] [関数]
set-macro-character char func [non-teminating-p readtable] [関数]
2016-04-05