2013-08-04 19 views
5

Mam znak ch, który chcę dołączyć do łańcucha znaków str. Rozumiem, że możesz łączyć następujące łańcuchy:Dołączanie znaków do ciągów w Common Lisp

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

Ale wydaje się to raczej nieefektywne. Czy istnieje szybszy sposób na dodanie pojedynczej litery?

Odpowiedz

10

Jeśli łańcuch ma wskaźnik wypełnienia i może być również regulowany.

Adjustable = może zmienić swój rozmiar.

wskaźnik wypełnienia = rozmiar treści, długość, może być mniejsza niż rozmiar ciągu.

VECTOR-PUSH = dodaj element na końcu i zwiększ wskaźnik wypełnienia.

VECTOR-PUSH-EXTEND = jako VECTOR-PUSH, dodatkowo zmienia rozmiar tablicy, jeśli jest za mała.

Możemy regulowany ciąg z normalnym One:

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

Jeśli chcesz rozszerzyć pojedynczy ciąg wiele razy, często dość wydajnych korzystać z-wyjścia do łańcucha, pisanie do strumienia zapewnia. Upewnij się, że używasz zapisu lub princ itp. (Zamiast formatu) dla wydajności.

+1

lub niejasną alternatywą, upewnij się, że można skompilować ciąg FORMAT. –