format:NIL を () として印字したい - lisp-cookbook-ja/common-lisp GitHub Wiki
~Aもしくは~Sの引数にコロン修飾子を付けることによりNILを () として印字可能です。
(format t "~:A" '())
;-> ()
;=> NIL
リストの内部を再帰的に変換するオプションはありませんので、自作かライブラリを利用することになるでしょう ;;
;; ;;; 処理系の出力文字列をcl-ppcreを使って置換
;; (defun cl-user::super-aesthetic (stream arg colon at)
;; (declare (ignore colon at))
;; (princ (ppcre:regex-replace-all "NIL"
;; (princ-to-string arg)
;; "()")
;; stream))
;;
;; (let ((*print-circle* t))
;; (format t
;; "~/super-aesthetic2/"
;; '#1=(nil nil nil . #1#)))
;; ;>> #1=(() () () . #1#)
;; ;=> NIL
;; ```
```cl
;;; 再帰的にリストを処理 (この実装は循環構造やプリティ・プリントに対応していない)
(defun cl-user::super-aesthetic (stream arg colon at)
(declare (ignore colon at))
(labels ((pr (arg)
(princ arg stream))
(rec-pr (arg)
(typecase arg
(null (pr "()"))
(atom (pr arg))
(T (pr "(")
(mapl (lambda (e)
(rec-pr (car e))
(and (cdr e) (pr " ")))
arg)
(pr ")")))))
(typecase arg
(list (rec-pr arg))
(T (pr arg)))))
(format t "~&~/super-aesthetic/ ≡ ~:*~A~%" '(() ((())) ()))
;-> (() ((())) ()) ≡ (NIL ((NIL)) NIL)
;
;=> NIL
(format t "~&~/super-aesthetic/ ≡ ~:*~A~%" '((a b (c nil d (e nil nil f)))))
;-> ((A B (C () D (E () () F)))) ≡ ((A B (C NIL D (E NIL NIL F))))
;
;=> NIL