格式化调用不会按要求缩进

时间:2013-12-02 07:53:32

标签: lisp common-lisp

我有这个:

(format *standard-output* "~v@a ~a ~%" (* 5 indent) "End of Parent" (* 5 indent))

奇怪的问题是(* 5 indent)被添加为调试项,并且在打印输出中是正确的。但是,在我的函数内部调用时,文本不会缩进,即使它打印出正确的indent值。如果我只是在REPL上执行此行,它会正确地打印出来,并带有缩进。我的全部功能是:

(defun print-object-and-children-data (object indent)
  "Recursively prints a chart object and its children,
   with each child level indented further."
  (let ((children (get-chart-children object)))
    ;; This indents correctly.
    (format *standard-output* "~v@a Level: ~a~%"
            (* 5 indent) object indent)
    (mapc (lambda (x)
            (when x (print-object-and-children-data x (+ 1 indent))))
          children)
    ;; This does not.
    (format *standard-output* "~v@a ~a ~%"
            (* 5 indent) "End of Parent" (* 5 indent)))) 

所有文字内容都是正确的。此外,最终format是否属于let的一部分也没有区别(它不需要children中的任何内容)。此函数中的某些内容以某种方式影响format调用的缩进,但由于格式打印出正确的缩进值,可能是什么原因导致没有缩进?

2 个答案:

答案 0 :(得分:3)

v中的~v@A未指定缩进。它指定字段宽度。试试这个:

(dolist (i '(5 10 15))
  (dolist (x '(1 123 12345))
    (format t ">~v@A< (i=~D)~%" i x i)))

请注意输出未与左侧对齐。

这是缩放输出的一种可能方法:

(dolist (i '(5 10 15))
  (dolist (x '(1 123 12345))
    (format t ">~vA~A< (i=~D)~%" i " " x i)))

(修复此处的错误仅作为练习。)

答案 1 :(得分:2)

为了获得缩进输出,您还可以使用format的{​​{3}}:

(dolist (i '(0 5 10 15 20))
   (format t "~&~vt~a~%" i i))

如果您想要相对制表而不是绝对制表,则可以使用@修饰符。