2013-08-07 52 views
5

Tôi muốn sử dụng đầu ra được định dạng trong một vòng lặp để tạo chuỗi. Hướng dẫn sử dụng cho biết nó có thể dễ dàng thực hiện bằng cách cho format hoạt động một chuỗi với một con trỏ điền làm đích. Thật không may, nó không phải là minh bạch từ hướng dẫn làm thế nào để khởi tạo chuỗi này ở nơi đầu tiên.Làm thế nào để khởi tạo một chuỗi với một con trỏ điền vào Common Lisp?

Tôi đã thử (string "")(format nil "") không có may mắn.

(make-array 0 :element-type 'character :fill-pointer 0) đã làm việc cho tôi, nhưng nó không cảm thấy đúng.

Cách thích hợp để khởi tạo chuỗi bằng con trỏ điền là gì?

Trả lời

6

(make-array 0 :element-type 'character :fill-pointer 0) là cách kinh điển (tốt, bạn hoàn toàn có thể sử dụng độ dài ban đầu khác 0 và sử dụng :initial-contents với giá trị chuỗi). Cũng có thể chỉ định giá trị con trỏ fil-fil là t, sẽ thiết lập con trỏ điền ở cuối chuỗi.

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

(với :adjustable t quá nếu ước tính không chính xác) là một cách; cho tích lũy đầu ra để tạo ra một chuỗi nó có thể là thành ngữ hơn để sử dụng 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

Sử dụng FORMAT thành một chuỗi với một con trỏ điền là một chức năng rất ít được sử dụng.

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

Điều đó rất tuyệt, tôi không biết định dạng đó đã chấp nhận thứ gì khác ngoài luồng. Cảm ơn! – tuscland

Các vấn đề liên quan