如何在Common Lisp中使用填充指针初始化字符串?

6
我希望在循环中使用格式化输出来生成一个字符串。手册上说可以通过给format函数提供一个填充指针作为目的地的字符串轻松完成此操作。不幸的是,从手册中无法透明地了解首先如何初始化此字符串。
我尝试过使用(string "")(format nil ""),但都没有成功。
对我而言,(make-array 0 :element-type 'character :fill-pointer 0)是可行的,但感觉不太正确。
那么,初始化一个带有填充指针的字符串的正确方式是什么?
3个回答

9
(make-array estimated-size-of-final-string
            :element-type 'character :fill-pointer 0)

一种方法是使用 :adjustable t(如果估计不准确的话);为了累积输出以生成一个字符串,更符合惯用语法的方法可能是使用 with-output-to-string

(with-output-to-string (stream)
  (loop repeat 8 do (format stream "~v,,,'-@A~%" (random 80) #\x)))

=>

"----------------------------------x
--------x
--------------------------------------x
----------------------------------------------------------------x
--------------x
-----------------------------------------x
---------------------------------------------------x
-----------------------------------------------------------x
"

7

使用 FORMAT 函数对具有填充指针的字符串进行格式化,这是一种非常少用的功能。

CL-USER 125 > (let ((s (make-array 0
                                   :element-type 'character
                                   :adjustable t
                                   :fill-pointer t)))
                (format s  "Hello, ~a!" 'bill)
                s)
"Hello, BILL!"

CL-USER 126 > (describe *)

"Hello, BILL!" is an (ARRAY CHARACTER (12))
FILL-POINTER      12
0                 #\H
1                 #\e
2                 #\l
3                 #\l
4                 #\o
5                 #\,
6                 #\Space
7                 #\B
8                 #\I
9                 #\L
10                #\L
11                #\!

太酷了,我不知道这种格式可以接受除流之外的其他东西。谢谢! - tuscland
我的经验恰好相反:我读到format可以写入字符串,但我不清楚具体是如何实现的。所有的例子都写入了tnil,直到我经过一番搜索之后才找到了这篇文章解决了我的问题。谢谢! - Dominik Mokriš

6

(make-array 0 :element-type 'character :fill-pointer 0)是规范的做法(当然,您也可以使用非零初始长度并使用:initial-contents和字符串值)。还可以将填充指针值指定为t,这将在字符串末尾设置填充指针。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接