时间:2011-01-06 18:42:53

标签: lisp format

2 个答案:

答案 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已替换为Vwidth已作为参数添加到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 ...)表达式实现了这一点。