プリティプリントの方法には、今までみてきたようなプリティプリント用関数を駆使する方法のほかに、format文を使う方法もあります。その場合、通常の制御文に混ぜて、プリティプリント用の制御文を使うことになります。
論理ブロックは"~<"と"~:>"で指示されます。任意のprefixとsufixを用いることができます。たとえば、jsonのような出力をするには、~;
でprefix部と本体とsufix部を分けて、次のようにします。
cg-user(147): (setq foo '((slot1 val1) (slot2 val2) (slot3 val3)))
((slot1 val1) (slot2 val2) (slot3 val3))
cg-user(148): (defun pprint-json-object (list)
(format t "~<{~;~@{~{\"~W\": ~W~}~^, ~_~}~;}~:>" list))
pprint-json-object
cg-user(149): (pprint-json-object foo)
{"slot1": val1, "slot2": val2, "slot3": val3}
nil
cg-user(150): (pprint-json-object foo)
{"slot1": val1,
"slot2": val2,
"slot3": val3}
nil
ここで~_
は(pprint-newline :linear)
に相当するものです。Window幅を狭くして、一行に収まらないときには、各行に分割されます。:fillにするには~:_
を使います。上記関数を書き換えてその変化を確かめてください。
Json-object の表記に、クラス名とオブジェクト名を書くことにします。そうすると次のようになります。
cg-user(152): (setq foo '(long-long-class-name long-long-object-name (slot1 val1) (slot2 val2) (slot3 val3)))
(long-long-class-name long-long-object-name (slot1 val1) (slot2 val2) (slot3 val3))
cg-user(153): (defun pprint-object (list)
(format t "~<{~;~W ~@_~W~1I ~@{~_~{\"~W\": ~W~}~^, ~}~;}~:>" list))
pprint-object
cg-user(154): (pprint-object foo)
{long-long-class-name long-long-object-name "slot1": val1, "slot2": val2, "slot3": val3}
nil
cg-user(155): (pprint-object foo)
{long-long-class-name long-long-object-name
"slot1": val1,
"slot2": val2,
"slot3": val3}
nil
ここで~1I
は(pprint-indent :block 1)
に相当します。詳しい使い方はCLtL2を見ていただくとして、制御文の大体が分かってしまえば、試行錯誤を手早くするにはフォーマット制御文の方が圧倒的に楽ですね。
ウーム、やはりSBCLではこの例も働きませんね。何か前提のセットアップがあるのでしょうか。エラーにはならないんですよ。どなたか教えてください。
なんか不満が残りますが、新しい情報が入り次第、お知らせいたします。