【发布时间】:2016-01-18 23:31:55
【问题描述】:
我有 format 的标签 ~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,并没有在其他实现上尝试过。这可能是一个错误,但它的预期行为似乎更合理,但我不明白它可以完成什么,我无法在格式的文档中找到解释。
【问题讨论】:
-
在 CCL 和 CLISP 中为我工作。 (顺便说一句,
mapc是首选的副作用。) -
CMUCL 的相同问题 (snapshot-2016-01)。由于 SBCL 是从它派生的,因此问题可能源于该实现。
-
@danlei -- 我确认 CLISP 确实不显示异常。
标签: common-lisp