Lisp 重复调用格式化会忽略~t选项

Lisp 重复调用格式化会忽略~t选项,lisp,common-lisp,Lisp,Common Lisp,我有这个: (defun promptread (prompt) (format *query-io* "~10t~a:" prompt) (force-output *query-io*) (read-line *query-io*)) (defun prompt-cd () (make-cd (promptread "Artist") (promptread "Album") (promptread "Rating") (prom

我有这个:

(defun promptread (prompt) 
  (format *query-io* "~10t~a:" prompt)
  (force-output *query-io*)
  (read-line *query-io*))
(defun prompt-cd ()
    (make-cd
     (promptread "Artist")
     (promptread "Album")
     (promptread "Rating")
     (promptread "Like [y/n]")))
它可以工作,但是格式
~10t
只影响
promptread
内部
make cd
的第一次调用;其他的是左对齐的,没有这个填充

为什么会这样

答复:


第一个
promptread
缩进是因为
format
~10t
格式,而不是其他的,它们使用相同的
格式
调用。

问题是,在
强制输出
读取线
之后,
format
不知道光标在位置0。因此,绝对制表将失败。如果以
~&
开始格式字符串,您将看到这是一个额外的换行符

要解决此问题,请使用
@
修饰符获取相对表格:

(format *query-io* "~10@t~a:" prompt)

问题是在
强制输出
读线
之后,
格式
不知道光标是否位于位置0。因此,绝对制表将失败。如果以
~&
开始格式字符串,您将看到这是一个额外的换行符

要解决此问题,请使用
@
修饰符获取相对表格:

(format *query-io* "~10@t~a:" prompt)

你能给出完整的代码、结果以及你的期望吗?我们无法真正验证到底发生了什么,因为我们没有这些。@zck更新的问题看起来像Terje D.已经回答了您的问题,但最好尝试发布一些人复制您的错误所需的所有代码。我无法运行
addcds
,因为您尚未为其提供代码。您现在已经有了答案,因此我们并不真正需要代码,但是为了使将来的问题更容易,让我们能够重现错误。您能给出完整的代码、结果以及您期望的结果吗?我们无法真正验证到底发生了什么,因为我们没有这些。@zck更新的问题看起来像Terje D.已经回答了您的问题,但最好尝试发布一些人复制您的错误所需的所有代码。我无法运行
addcds
,因为您尚未为其提供代码。您现在已经有了答案,所以我们并不真正需要代码,但是为了使将来的问题更容易,我们可以重现错误。