(rontolisp) docs
← cl パッケージの関数

read

(read &optional stream eof-error-p eof-value recursive-p)

単一の S 式を読み取って解析します。引数がない場合は標準入力から読み取ります。open、with-open-file、with-input-from-string で開いたストリームを与えると、そのストリームから読み取ります。ちょうど 1 つのデータム分の文字だけを消費し、ストリームをその直後の位置に残します。したがって同じ行にある 2 つ目のデータムは失われず、データムは複数行にまたがれ、同じストリーム上で read と read-line・read-char を混ぜて使えます。データムの前の空白とコメントはスキップされ、データムの後の空白は 1 文字だけ消費されます(標準が許しています)。) のような終端文字はストリームに残ります。入力の終端では、eof-error-p が明示的な nil でない限り end-of-file をシグナルします(eof-error-p の既定は t です)。eof-error-p が nil の場合のみ eof-value(既定は nil)を返します。不完全なデータムは eof-error-p によらず end-of-file をシグナルし、不正な形式のデータムは reader-error をシグナルします。どちらもストリームを運ぶ error のサブタイプなので、(handler-case ... (error () ...)) はすべてのバックエンドで捕捉できます。コンパイルされたリーダーは同じ失敗を捕捉可能な simple-error として報告するか、一部の不正トークン形状をシンボルとして読みます。詳細はコンパイルされた read/load の制限を参照してください。コンパイル系バックエンドが出力するランタイムリーダーはフロントエンドと同等の構文を読みます。リスト(ドット対を含む)、'、#'、文字列、シンボル、数値(比と #x/#o/#b の基数付き整数を含む)、#\ 文字リテラル、#(...)/#nA(...) 配列、#* ビットベクタ、#f(/#d( packed 浮動小数点配列、#S(...) 構造体リテラル、#|...|# ブロックコメントです。#+/#- ガードはすべてのバックエンドで read 自身が呼び出し時点の *features* に対して解決します。成り立たないガードはその後ろのフォームをスキップし、read は次のデータムを返します(#+nope a b は B を読みます)。トップレベルでもリストの中でも同じです。#. と #n=/#n# は read 時に評価器を必要とするため、コンパイルされたリーダーは捕捉可能なエラーをシグナルします(インタプリタはこれらも解決します。標準に従い、*read-eval* を nil に束縛するとインタプリタでも #. はシグナルします)。WASM リーダーの数値はより狭い範囲です(64 ビット整数、指数表記のない 10 進浮動小数点数、固定のエラーメッセージ)— コンパイルされた read/load の制限を参照してください。

ストリーム引数がない場合、read は標準入力から 1 つのデータムを解析します。標準入力から (+ 1 2) を読み取ればリスト (+ 1 2) になります。入力の終端では read は end-of-file をシグナルします。eof-value を得たい場合は eof-error-p に明示的な nil を渡してください。実行時に読まれるシンボルはリーダーの大文字化に従い、ユーザーのシンボルも標準の名前も同様に大文字化されます(畳み込みはありません)。これはすべてのバックエンドで同一です。