
[英]How do I print text in Common Lisp so that I could format it with escape sequences (akin to display in Racket)?
[英]How might I format an alist in common lisp?
我开始给我写一些Common Lisp,我只是把事情放在一起并格式化它们。
让我们假设我有一个alist,就像这样:
(defvar *map* '((0 . "zero") (1 . "one") (2 . "two")))
我该如何格式化呢?
0: zero
1: one
2: two
我想的是(format t "~{~{~a: ~a~}~%~}" *map*)
,但这会产生错误,因为“零”不是列表而你不能拿它的车。
当然,打印(format t "~{~a~%~}" *map*)
(0 . "zero")
(1 . "one")
(2 . "two")
喜欢它应该,但它不是我想要的。 有没有更好的方法来做到这一点而不仅仅是(dolist (entry *mapping*) (format t "~a: ~a~%" (car entry) (cdr entry)))
?
Freenode上的#cl-gardeners频道建议像这样做一个解构循环绑定:
(loop for (a . b) in *mapping*
do (format t "~a: ~a" a b))
你是对的,因为看起来没有办法从FORMAT中分离出一个缺点。
如果您定义另一个函数来格式化单个关联:
(defun print-assoc (stream arg colonp atsignp)
(format stream "~A: ~A" (car arg) (cdr arg)))
那很简单:
(format t "~{~/print-assoc/~%~}" *map*)
我不确定这是否有所改善。 一方面,它有点复杂,但另一方面,它确实将print-assoc分解为(可重用)函数,这可能很有用。
我认为这里的外卖课程实际上不是为你的列表使用虚线列表。 当然,你可以保存一个cons单元格,但是你放弃了所有好的序列和列表函数。 这不值得。 您的格式化示例完全形成列表是微不足道的:
(defvar *map* '((0 "zero") (1 "one") (2 "two")))
(format t "~:{~a: ~a~}" *map*)
我不认为有更好的方法来做到这一点; 我会用map()
:
(format t "~{~a~%~}"
(map 'list
#'(lambda (entry)
(format nil "~a: ~a" (car entry) (cdr entry))
*map*))
使用将alist单元格(a . 2)
a.2)转换为list (a 2)
(mapcar #'(lambda (x) `(,(car x) ,(cdr x))) *map*)
然后以格式处理。
例如,将((a . 2) (b . 3))
打印为"a=2&b=3"
使用
(format t "~{~{~a~^=~}~^&~}" (mapcar #'(lambda (x) `(,(car x) ,(cdr x))) *map*))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.