Variable *READ-SUPPRESS*
generalized-boolean
false
この変数の主な目的は、 読み込み時の状態表記である#+
と#-
の処理を行うためです。 これらの表記法を実装するリーダマクロにとって、 読み飛ばされた式の構文が現在の実装にとって 完全に妥当でない可能性があるにもかかわらず、 式の印刷表現を読み飛ばすことができることは重要です。 なぜなら、#+
と#-
は、構文の小さな非互換性があっても、 複数のLispの実装(Common Lisp以外の方言を含む)で 同じプログラムを共有できるようにするために存在するからです。
もしfalseのときは、Lispリーダーは通常通り処理します。
もし*read-suppress*
の値がtrueのとき、 read
, read-preserving-whitespace
, read-delimited-list
, read-from-string
は、 処理が完全に成功したときに nil
が主値として返却されます。 しかし、そのオブジェクトをスキップするために、 これらの関数は通常の方法でオブジェクトの表現を構文解析し続け、 そして通常の方法でファイルの終わりを示します。 例外として、標準のリーダーマクロに定義されているもので 続くオブジェクトかあるいはトークンの読み込みを行ったとき、 もしそのオブジェクトの読み込みが適切な型か構文ではなかったときでも エラーは通知されません。 その標準構文と関連したリーダーマクロは どのような新しいオブジェクトも構築しないでしょう (例えば、シンボルの表現を読み込んだときでも、 シンボルは構築されませんしintern
されません)。
#
を含む)
#=
#=
表記は全体的に無視されます。 続くオブジェクトは読み込まれません。 オブジェクトの生成はされませんが、空白として扱われます。##
##
表記は常にnil
を生成します。*read-suppress*
の値が何であれ、 かっこの区切りとリストの構築は続けられます。 #(
表記のvector
の区切りも続けられ、 またコメント、文字列、シングルクォート、 バッククォート表記も正しい解釈が続きます。 このような状況で')
, #<
, #)
, #<Space>
が読み込まれたときは、 エラーが通知されます。
let ((*read-suppress* t))
(mapcar #'read-from-string
("#(foo bar baz)" "#P(:type :lisp)" "#c1.2"
'("#.(PRINT 'FOO)" "#3AHELLO" "#S(INTEGER)"
"#*ABC" "#\GARBAGE" "#RALPHA" "#3R444")))
=> (NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)
なし。
プログラマーと実装者は、 追加でマクロ文字を定義するときは、 ちょうど標準のマクロ文字が実施しているように、 *read-suppress*
を配慮することを強く推奨します。 これは、*read-suppress*
の値がtrueのとき、 続くオブジェクトを読むときに型エラーを無視するべきであり、 ディスパッチマクロ文字として実装する関数は、 通常なら数値が必要な場合でも固定値のパラメータ値とすることで、 nil
を許容する必要があります。