Common Lisp:条件格式的自定义谓词

Common Lisp: custom predicate for conditional formatting

我有一个包含两种不同元素的列表:

我希望此列表按以下结构打印:所有元素用逗号分隔,每个 cons 单元格 (a . b) 打印为 a=b

真正的目标是使用 Common Lisp 生成 Tikz/LaTeX 代码,代码的这个特定部分只是用来生成“选项”(到环境、包、命令......)

示例:

>>> (format nil "<cool-format-string>" '(draw (color . red) dashed (fill . gray)))
[draw, color=red, dashed, fill=gray]

我知道迭代指令、条件指令等的格式。唯一的问题是我想根据它们的类型打印我的列表元素,而不是根据它们的数值或它们的 'truth' (nil 与其他任何东西)

除了使用 ~/ 编写自定义指令外,是否可以使用另一种构造来执行类似于条件指令的操作,但使用自定义谓词?

(defun dotted-pair-p (x)
  (and (listp x) (not (listp (cdr x)))))

(defun print-fancy (lst)
  (let ((res (mapcar (lambda (x) (if (dotted-pair-p x)
                                     (format nil "~a=~a" (car x) (cdr x))
                                     (format nil "~a" x)))
                     lst)))
    ;; add the ', ' inbetween the strings
    ;; and put the result in between "[]"
    (format nil "[~{~a~^, ~}]" res)))
                                  

(print-fancy '(draw (color . red) dashed (fill . gray)))
;; "[DRAW, COLOR=RED, DASHED, FILL=GRAY]"