我如何在常见的lisp中格式化alist?

Mic*_*ael 5 lisp format formatting common-lisp string-formatting

我开始给我写一些Common Lisp,我只是把事情放在一起并格式化它们.

让我们假设我有一个alist,就像这样:

(defvar *map* '((0 . "zero") (1 . "one") (2 . "two")))
Run Code Online (Sandbox Code Playgroud)

我该如何格式化呢?

0: zero
1: one
2: two
Run Code Online (Sandbox Code Playgroud)

我在想类似的东西(format t "~{~{~a: ~a~}~%~}" *map*),但是这会产生一个错误,因为"零"不是一个列表,你不能把它当作汽车.

当然,做(format t "~{~a~%~}" *map*)印刷品

(0 . "zero")
(1 . "one")
(2 . "two")
Run Code Online (Sandbox Code Playgroud)

喜欢它应该,但它不是我想要的.有没有比这更好的方法(dolist (entry *mapping*) (format t "~a: ~a~%" (car entry) (cdr entry)))呢?

Mic*_*ael 11

Freenode上的#cl-gardeners频道建议像这样做一个解构循环绑定:

(loop for (a . b) in *mapping*
  do (format t "~a: ~a" a b))
Run Code Online (Sandbox Code Playgroud)


Ken*_*Ken 6

你是对的,因为看起来没有办法从FORMAT中分离出一个缺点.

如果您定义另一个函数来格式化单个关联:

(defun print-assoc (stream arg colonp atsignp)
  (format stream "~A: ~A" (car arg) (cdr arg)))
Run Code Online (Sandbox Code Playgroud)

那很简单:

(format t "~{~/print-assoc/~%~}" *map*)
Run Code Online (Sandbox Code Playgroud)

我不确定这是否有所改善.一方面,它有点复杂,但另一方面,它确实将print-assoc分解为(可重用)函数,这可能很有用.

  • 您应该在格式中使用限定的函数名称.FORMAT解析*package*中的指定符号,在调用格式时你永远不会知道*package*是什么. (6认同)