Variable *PRINT-READABLY*

UP


Variable *PRINT-READABLY*

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))
Error: Can't print #<HASH-TABLE EQL 0/120 32005763> readably.

;; 実装B
;; ハッシュテープルが標準ではない#S表記で定義されていますが
;; これは実装定義の表記となるでしょう。
(let ((*print-readably* t)) (print table))
>>  #S(HASH-TABLE :TEST EQL :SIZE 120 :CONTENTS (1 ONE 2 TWO))
=>  #<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)))
>>      (SETF (GETHASH 1 HASH-TABLE) ONE)
>>      (SETF (GETHASH 2 HASH-TABLE) TWO)
>>      HASH-TABLE)
=>  #<HASH-TABLE EQL 0/120 32005763>

影響

なし。

参考

write, print-unreadable-object

備考

「類似性」の規則により、#A#(の構文は 要素の型がtではない配列に使用することができません。 実装は他の構文を使用するか、 あるいは型print-not-readableのエラーを通知するべきかもしれません。


TOP, Github