Common Lisp:条件格式的自定义谓词
Common Lisp: custom predicate for conditional formatting
我有一个包含两种不同元素的列表:
- 字符串指示符
- Cons 单元格,其 car 和 cdr 都是字符串指示符
我希望此列表按以下结构打印:所有元素用逗号分隔,每个 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]"
我有一个包含两种不同元素的列表:
- 字符串指示符
- Cons 单元格,其 car 和 cdr 都是字符串指示符
我希望此列表按以下结构打印:所有元素用逗号分隔,每个 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]"