common-lisp - Common Lisp 格式中可重复的一对一问题

标签 common-lisp

我有 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,并没有在其他实现上尝试过。这可能是一个错误,但它的预期行为似乎更合理,但我不明白它可能打算完成什么,并且我无法在格式文档中找到解释。

最佳答案

我认为这是一个错误。我也可以使用 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))

关于common-lisp - Common Lisp 格式中可重复的一对一问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34866049/

相关文章:

gtk - Lisp 中的指针?

common-lisp - Lisp SBCL 将函数参数声明为某种类型的列表,以进行类型检查

javascript - 为什么我不能使用这个解析 javascript 代码的 Common Lisp 宏?

copy - 在Lisp中复制哈希表

clojure - 类似于Clojure对plists的get-in和assoc-in的操作

LISP 回溯

optimization - SBCL:Fixnum 优化

common-lisp - 在 lisp 中转置列表列表的安全方法?

macros - 检测全局范围的宏

lisp - 如何修复 Common Lisp REPL 中 <TAB> 触发的自动文档查找的 URL?