I have format
's tabs ~VT
根据是否换行而表现不同~%
位于行首或行尾,我想知道为什么。不同之处在于,当换行符位于行尾时,行中似乎有一个额外的空格仅一审制表位的。下面举例说明。示例中唯一的区别在于格式控制字符串:它是"~%~A~VT= ~A"
在第一个例子中和"~A~VT= ~A~%"
在第二。
示例 1:输出行开头的换行符
(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"
这里的行为符合预期。
示例 2:输出行末尾的换行符
在这个例子中需要注意的是第一行,
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,尚未在其他实现上尝试过。这可能是一个错误,但似乎更合理的是它的预期行为,但我不明白它的目的是什么,而且我无法在格式的文档中找到解释。
我认为这是一个错误。我还可以使用 SBCL 1.3.1 在 Linux 上重现它。
~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))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)