入力ストリームを取る関数のアーギュメントは、以下のオブジェクトのいずれかです。
buffer
(文字を読み込むと先に進められる)ポイントの直後の文字を最初の文字とし て、 buffer から(入力)文字を読み込みます。
marker
(文字を読み込むと先に進められる)マーカーの直後の文字を最初の文字とし て、( marker がその中にある) buffer から(入力)文字を読み込みます。
function
入力文字は、(1回の呼び出しに対し 1文字のペースで) function で生成され ます。
string
ストリングの最初の文字から始め、必要な文字だけ進めることで、 string か ら(入力)文字を取ります。
t
t をストリームとして用いることは、 (ユーザーが)ミニバッファに入力する と、その入力文字を読み込むことを意味します。
nil
nil をストリームとして用いることは、 standard-input の値を(代りに)用い ることを意味します (この値は nil でない入力ストリームでなくてはいけま せん)。
次の例において、バッファ foo 中のポイントは最初のスペースと文字 `i' の間に位置 付けられています。 read はこれを word(訳注:語) `is' の後ろに進めます。これは また、スペースを読み込み無視します。次に read を呼ぶと、word `the' を読み込み 2番目のスペースのすぐ後にポイントを位置付けます。
---------- Buffer: foo ---------- This is the contents of foo. ---------- Buffer: foo ----------
(read (get-buffer "foo")) => is (read (get-buffer "foo")) => the
次の例において、マーカー m は、(この)バッファの先頭に設定されています。 read は最初の word `This' をシンボルとして読み込み、マーカーを (最初のスペースを越 え) 先に動かします。
---------- Buffer: foo ---------- This is the contents of foo. ---------- Buffer: foo ----------
(setq m (set-marker (make-marker) 1 (get-buffer "foo"))) => #<marker at 1 in foo> (read m) => This m => #<marker at 6 in foo>
次の例では、 (リストを作る) ストリングの最初の 9文字を読み込みます。
(read "(When in) the course") => (When in)
(ミニバッファから読み込む) 次の例において、Lisp はプロンプト Lisp expression: を表示し、ユーザーは (RET でターミネートされた) 数字 23 をタイプしています。
(read t) => 23 ---------- Buffer: Minibuffer ---------- Lisp expression: RET
以下の例において、変数 useless-stream は文字のリストに初期化されています。関数 useless-stream は呼ばれるたびにこのリストの(次の) 文字を生成します。 2回目の read の呼び出しにおいて、エラーが出されている点に注意しておく必要があります。 これは read は (すでに読み込まれてしまっている) 次の S-式の部分の文字を "unread" しないためです(最初の例としては良くない!!)。
read は最初の read 形式で useless-stream を 3 回呼んでいます。 3 番目の文字 `(' が読まれると、これは (XY) と形作られたシンボルをターミネートして忘れられま す。このため、次の read は ( `(' がないと無効である) 文字 `)' で始まっていま す。
(setq useless-list '(?X ?Y ?( ?))) => (88 89 40 41) (defun useless-stream () (prog1 (car useless-list) (setq useless-list (cdr useless-list)))) =>useless-stream (read 'useless-stream) => XY (read 'useless-stream)) --> ERROR: unbalanced parentheses