Variable *PRINT-READABLY*
generalized-boolean
false
もし*print-readably*
がtrueのとき、 いくつかの特別なルールによって オブジェクトの出力の際に効果を発揮します。 特に、何らかのオブジェクトO1
を印刷するときに 生成される印刷表現は、 標準のリードテーブルの効果があるLispリーダーによって読み込まれたとき、 その表現はO1
と似たオブジェクトO2
が生成されます。 生成された印刷表現は、 *print-readably*
がfalseのときに生成されたものと 同じか同じではないものが生成されます。 もしreadably
なオブジェクトの印刷が不可能であるとき、 同じ実装では読み込むことができない構文(例えば#<
構文)を使うのではなく、 型print-not-readable
のエラーが発生します。 もし他のいくつかのプリンター制御変数の値が これらの要求に違反するような場合は、 それらの変数の値は無視されます。
特に*print-readably*
がtrueであれば、 *print-escape*
, *print-array*
, *print-gensym*
が それぞれtrue、 *print-length*
, *print-level*
, *print-lines*
が それぞれfalseとして、 印刷が進行します。
もし*print-readably*
がfalseのとき、 印刷の通常の規則と、 他のプリンター制御変数の通常の解釈は、 効果を発揮します。
print-object
のユーザー定義のメソッドを含む個別のメソッドは、 これらの要求を実装する責任を負います。
もし*read-eval*
がfalseであり、 *print-readably*
がtrueのとき、 リードマクロである#.
の参照を出力するようなどのようなメソッドも、 何かを出力するのか、 あるいはエラーを通知するのか(上記で定義されたような)の どちらかになります。
let ((x (list "a" '\a (gensym) '((a (b (c))) d e f g)))
(*print-escape* nil)
(*print-gensym* nil)
(*print-level* 3)
(*print-length* 3))
(write x)
(let ((*print-readably* t))
(terpri)
(write x)
(
:done))
>> (a a G4581 ((A #) D E ...))"a" |a| #:G4581 ((A (B (C))) D E F G))
>> (=> :DONE
;; これは次に続く3つの仮想的な実装の例で共有される
;; セットアップコードです。
setq table (make-hash-table)) => #<HASH-TABLE EQL 0/120 32005763>
(setf (gethash table 1) 'one) => ONE
(setf (gethash table 2) 'two) => TWO
(
;; 実装A
let ((*print-readably* t)) (print table))
(print #<HASH-TABLE EQL 0/120 32005763> readably.
Error: Can't
;; 実装B
;; ハッシュテープルが標準ではない#S表記で定義されていますが
;; これは実装定義の表記となるでしょう。
let ((*print-readably* t)) (print table))
(120 :CONTENTS (1 ONE 2 TWO))
>> #S(HASH-TABLE :TEST EQL :SIZE => #<HASH-TABLE EQL 0/120 32005763>
;; Implementation C
;; #.表記は*READ-EVAL*がtrueのときのみ使用できることに注意してください。
;; もし*READ-EVAL*がfalseのときは、同じ実装でも何か別の印刷の仕掛けにより
;; 復帰する仕組みでもない限り、エラーが発生します。
let ((*print-readably* t)) (print table))
(
>> #.(LET ((HASH-TABLE (MAKE-HASH-TABLE)))1 HASH-TABLE) ONE)
>> (SETF (GETHASH 2 HASH-TABLE) TWO)
>> (SETF (GETHASH
>> HASH-TABLE)=> #<HASH-TABLE EQL 0/120 32005763>
なし。
write
, print-unreadable-object
「類似性」の規則により、#A
か#(
の構文は 要素の型がt
ではない配列に使用することができません。 実装は他の構文を使用するか、 あるいは型print-not-readable
のエラーを通知するべきかもしれません。