我有这个:
(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
调用的缩进,但由于格式打印出正确的缩进值,可能是什么原因导致没有缩进?
答案 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))
如果您想要相对制表而不是绝对制表,则可以使用@
修饰符。