次: Input Functions, 前: Streams Intro, 上: Read and Print
テキストを読み取るほとんどのLisp関数は、 ストリーム(stream)を引数として受け付けます。 入力ストリームは、読み取るべきテキストの文字をどこからどのように得るのかを 指定します。 入力ストリームとして使える型は以下のとおりです。
ttを使うと、ミニバッファから読み取ることを意味する。
実際には、ミニバッファを表示しユーザーが指定したテキストから成る文字列を作り、
それを入力ストリームとして使う。
nilnilを指定すると、
standard-inputの値をかわりに使うことを意味する。
その値はデフォルト入力ストリームであり、
nil以外の入力ストリームであること。
バッファであるストリームからの読み取りの例を 読み取り前後のポイント位置を含めて示します。
---------- Buffer: foo ----------
This-!- is the contents of foo.
---------- Buffer: foo ----------
(read (get-buffer "foo"))
=> is
(read (get-buffer "foo"))
=> the
---------- Buffer: foo ----------
This is the-!- contents of foo.
---------- Buffer: foo ----------
最初の読み取りでは空白を読み飛ばしていることに注意してください。 読み取りでは、意味あるテキストのまえにある白文字はいくつでも読み飛ばします。
つぎは、マーカをストリームとして読み取る例です。
マーカの初期位置は下に示したバッファの先頭にあります。
読み取った値はシンボル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 5 in foo> ;; 最初の空白の直前
つぎは文字列の内容から読み取ります。
(read "(When in) the course")
=> (When in)
以下の例は、ミニバッファから読み取ります。
プロンプトは`Lisp expression: 'です。
(ストリームtから読むとつねにこのプロンプトが使われる。)
ユーザーの入力はプロンプトに続けて示してあります。
(read t)
=> 23
---------- Buffer: Minibuffer ----------
Lisp expression: 23 <RET>
---------- Buffer: Minibuffer ----------
最後は、useless-streamという名前の関数をストリームにした例です。
このストリームを使うまえに、
変数useless-listを文字のリストで初期化します。
そうすると、関数useless-streamを呼び出すたびに
リスト内のつぎの文字を返すか、
リストの先頭に追加して文字を読み戻します。
(setq useless-list (append "XY()" nil))
=> (88 89 40 41)
(defun useless-stream (&optional unread)
(if unread
(setq useless-list (cons unread useless-list))
(prog1 (car useless-list)
(setq useless-list (cdr useless-list)))))
=> useless-stream
つぎのようにしてストリームを使って読み取ります。
(read 'useless-stream)
=> XY
useless-list
=> (40 41)
リストには開き括弧と閉じ括弧が残っていることに注意してください。
Lispリーダが開き括弧に出会うとこれで入力を終えると決定し、
それを読み戻すのです。
この時点で読み取りを試みると、
`()'を読み取ってnilを返します。