2013-08-04 13 views
5

Ho un carattere ch che voglio aggiungere a una stringa str. Mi rendo conto che è possibile concatenare stringhe come queste:Aggiunta di carattere a stringa in Common Lisp

(setf str (concatenate 'string str (list ch))) 

Ma sembra piuttosto inefficiente. C'è un modo più veloce per aggiungere un singolo carattere?

risposta

10

Se la stringa ha un indicatore di riempimento e forse è anche regolabile.

Regolabile = può cambiare la sua dimensione.

fill-pointer = la dimensione del contenuto, la lunghezza, può essere inferiore alla dimensione della stringa.

VECTOR-PUSH = aggiungi un elemento alla fine e incrementa il puntatore di riempimento.

VECTOR-PUSH-EXTEND = come VECTOR-PUSH, ridimensiona ulteriormente la matrice, se è troppo piccola.

Possiamo fare una stringa regolabile da uno normale:

CL-USER 32 > (defun make-adjustable-string (s) 
       (make-array (length s) 
          :fill-pointer (length s) 
          :adjustable t 
          :initial-contents s 
          :element-type (array-element-type s))) 
MAKE-ADJUSTABLE-STRING 

CL-USER 33 > (let ((s (make-adjustable-string "Lisp"))) 
       (vector-push-extend #\! s) 
       s) 
"Lisp!" 
7

Se si desidera estendere una singola stringa più volte, spesso è abbastanza performante da utilizzare con uscita a stringa, la scrittura allo stream fornito. Assicurati di usare write o princ, ecc (invece del formato) per le prestazioni.

+1

o l'alternativa oscura, assicurarsi che la stringa FORMAT possa essere compilata. –