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

議論

⚠️ **GitHub.com Fallback** ⚠️