2013-08-07 7 views
5

文字列を生成するために、フォーマットされた出力をループ内で使用したいと考えています。手動では、formatに目的地としての塗りつぶしポインタを持つ文字列を指定することで簡単に行うことができます。残念ながら、最初からこの文字列をどのように初期化するかは、マニュアルからはわかりません。Common Lispで塗りつぶしポインタを使って文字列を初期化する方法は?

私は(string "")(format nil "")を試してみました。

(make-array 0 :element-type 'character :fill-pointer 0)私のために働いたが、それはちょうどいい気分ではない。

フィルポインタで文字列を初期化する適切な方法は何ですか?

答えて

6

(make-array 0 :element-type 'character :fill-pointer 0)は標準的な方法です(ゼロ以外の長さを最初に使用し、文字列の値に:initial-contentsを使用することは可能です)。また、フィルポインタの値をtと指定することもできます。これにより、文字列の最後にフィルポインタが設定されます。

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

(推定値が不正確な場合でも:adjustable t)は片道です。文字列を生成する出力を蓄積するためには、with-output-to-stringを使用することがより慣用的なことがあります

フィルポインタと文字列に FORMATを使用して
(with-output-to-string (stream) 
    (loop repeat 8 do (format stream "~v,,,'[email protected]~%" (random 80) #\x))) 

=> 

"----------------------------------x 
--------x 
--------------------------------------x 
----------------------------------------------------------------x 
--------------x 
-----------------------------------------x 
---------------------------------------------------x 
-----------------------------------------------------------x 
" 
5

は非常に稀にしか使われない機能です。

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    #\! 
+0

これは非常にクールですが、私はそのフォーマットがストリーム以外のものを受け入れたことを知らなかった。ありがとう! – tuscland

関連する問題