2013-08-07 16 views
5

Chcę użyć sformatowanego wyjścia w pętli do wygenerowania ciągu znaków. Instrukcja mówi, że można to łatwo zrobić, nadając funkcji format ciąg znaków ze wskaźnikiem wypełnienia jako miejscem docelowym. Niestety z instrukcji nie wynika, jak zainicjować ten ciąg w pierwszej kolejności.Jak zainicjować ciąg ze wskaźnikiem wypełnienia w Common Lisp?

Próbowałem (string "") i (format nil "") bez powodzenia.

pracowała dla mnie, ale po prostu nie czuje się dobrze.

Jaki jest właściwy sposób inicjowania łańcucha za pomocą wskaźnika wypełnienia?

Odpowiedz

6

(make-array 0 :element-type 'character :fill-pointer 0) to kanoniczny sposób (cóż, całkiem możliwe jest użycie początkowej niezerowej długości i użycie :initial-contents z wartością ciągu znaków). Możliwe jest również określenie wartości wskaźnika fil jako t, która ustawi wskaźnik wypełnienia na końcu łańcucha.

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

(z :adjustable t też, jeśli szacunek jest niedokładny) jest jednokierunkowy; do gromadzenia danych wyjściowych do produkcji ciąg może być bardziej idiomatyczne użycie with-output-to-string:

(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

Korzystanie FORMAT na sznurku ze wskaźnikiem wypełnienia jest bardzo rzadko używane funkcje.

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

To bardzo fajne, nie wiedziałem, że format akceptuje coś innego niż strumień. Dzięki! – tuscland