リーダのグローバル変数は:
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