我有format
个标签~VT
的行为方式不同,具体取决于换行符~%
是在行的开头还是结尾,我想知道原因。不同之处在于,当换行位于行的末尾时,制表符的仅第一个实例中似乎有一个额外的空格。以下示例说明。示例中唯一的区别在于格式控制字符串:第一个示例中的"~%~A~VT= ~A"
和第二个示例中的"~A~VT= ~A~%"
。
(let ((sb (make-array 0
:element-type 'character
:adjustable t
:fill-pointer 0)))
(mapcar (lambda (line)
(format sb "~%~A~VT= ~A" line 10 42))
'(a abcd asdf foobar g november))
sb)
"
A = 42
ABCD = 42
ASDF = 42
FOOBAR = 42
G = 42
NOVEMBER = 42"
此处的行为符合预期。
在这个例子中要注意的是第一行,
A = 42
中有一个空格,而不是示例1中的相应行:
A = 42
由于领先的双引号,这有点难以看出,这就是为什么我把它剪掉了:帮助你更好地看待它们。
这在更大的例子中是可重复的,并且是一个MVE从更大的程序中剥离出来的。
(let ((sb (make-array 0
:element-type 'character
:adjustable t
:fill-pointer 0)))
(mapcar (lambda (line)
(format sb "~A~VT= ~A~%" line 10 42))
'(a abcd asdf foobar g november))
sb)
"A = 42
ABCD = 42
ASDF = 42
FOOBAR = 42
G = 42
NOVEMBER = 42
"
重要的问题是"为什么?"我在Mac上使用SBCL 1.3.1并且没有在其他实现上尝试过它。这可能是一个错误,但它似乎更合理的是它的预期行为,但我不明白它可以实现的目标,而且我还没能找到格式和解释的解释。 #39;文档。
答案 0 :(得分:4)
我认为这是一个错误。我也可以在Linux上用SBCL 1.3.1重现它。
在某些情况下, ~T
可能需要启发式(可能会失败)来确定当前列,但我想字符串的开头应该被视为第0列。
至少在我的计算机上,当使用简单的with-output-to-string
时似乎不会发生:
(with-output-to-string (s)
(mapcar (lambda (line)
(format s "~A~VT= ~A~%" line 10 42))
'(a abcd asdf foobar g november)))
但是,当您将预制字符串提供给with-output-to-string
:
(let ((sb (make-array 0
:element-type 'character
:adjustable t
:fill-pointer 0)))
(with-output-to-string (s sb)
(mapcar (lambda (line)
(format s "~A~VT= ~A~%" line 10 42))
'(a abcd asdf foobar g november))
sb))