答案 0 :(得分:5)
我认为你有两个选择:让format
魔法去使用其他循环结构或生成格式字符串本身:
(defun facepalm-printer (lol)
(format t (format nil "~~{|~~{ ~~~ad~~}|~~%~~}"
(longest-member lol))
lol))
longest-member
的定义留给读者练习。
答案 1 :(得分:4)
假设所需的宽度绑定到 width
,那么你可以这样做:
(format t "~{|~{ ~Vd~}|~%~}" width '((1 23 2 312) (23 456 1 7890)))
5
已替换为V
,width
已作为参数添加到FORMAT
/
编辑:原始答案没有正确说明嵌套指令
在格式控制字符串中,V
可用于代替任何常量值,表示相应的值将取自参数列表。
你可以试试这个:
(setf width 5)
(setf data '((1 23 2 312) (23 456 1 7890)))
(format t "~{|~{ ~{~Vd~}~}|~%~}"
(mapcar #'(lambda (r) (mapcar #'(lambda (v) (list width v)) r)) data) )
此格式字符串要求在每个值之前有所需的宽度。 (mapcar ...)
表达式实现了这一点。