2013-08-20 2 views
4

필자의 이해에서 문자열은 문자 유형의 벡터입니다. 지금까지 내 시도가 열매를 맺지왔다문자열 끝 부분에 문자를 추가하는 방법

(vector-push #\a "Hol") 
;; "Hol" Is not of type vector and simple-array 

'(1 2 3) (목록 1 2 3)과 동일하지 않습니다 리터럴 "홀리"같은 방식으로 일정 벡터인가? 문자의 벡터를 명시 적으로 만들고 문자를 추가해야합니까?

답변

7

올바른 진단을 받았습니다. 하지만 문자 데이터 (예 : (list 1 2 3)'(1 2 3))와 수정 가능한 데이터의 차이는 아닙니다. 벡터에 fill pointer이 있는지 여부입니다. vector-push and vector-push-extend에 대한 설명서는 벡터 인수가 채우기 포인터가있는 벡터라고 말합니다. 당신은 같이 채우기 포인터가없는 비 문자 배열과 유사한 오류를 얻을 것이다 :

(let ((v (make-array 3))) 
    (vector-push nil v)) 

당신이, 채우기 포인터로 벡터를 만들 수 있는지 확인하기 만하고 당신이 마지막 vector-push에서 벡터의 z을하지 얻을 수 있도록,

(let ((v (make-array 2 :fill-pointer 0))) 
    (print v) 
    (vector-push 'x v) 
    (print v) 
    (vector-push 'y v) 
    (print v) 
    (vector-push 'z v) 
    (print v)) 

vector-push 배열을 조정하지 않습니다 : 당신이 밀어 일을 저장하기에 충분히 큰 그것은 그

#() 
#(X) 
#(X Y) 
#(X Y) 
당신은 벡터 조정 만들고, vector-push-extend를 사용하는 경우

, 당신은 더 큰 배열을 얻을 수 있습니다 : character의 요소 유형을 사용

(let ((v (make-array 2 :adjustable t :fill-pointer 0))) 
    (print v) 
    (vector-push 'x v) 
    (print v) 
    (vector-push 'y v) 
    (print v) 
    (vector-push-extend 'z v) 
    (print v)) 

#() 
#(X) 
#(X Y) 
#(X Y Z) 

을, 당신은 문자열이 일을 할 수 있습니다 :

(let ((v (make-array 2 :element-type 'character :adjustable t :fill-pointer 0))) 
    (print v) 
    (vector-push #\x v) 
    (print v) 
    (vector-push #\y v) 
    (print v) 
    (vector-push-extend #\z v) 
    (print v)) 

"" 
"x" 
"xy" 
"xyz" 
+0

하나 질문, 왜 @ char를 초기 요소로 사용합니까? (char-code # \ @) -> 64는 리터럴 @ 부호의 코드 포인트입니다. – PuercoPop

+1

@PuercoPop 첫 번째 예제에는 초기 요소가 포함되어 있으므로 가능한 한 조금만 변경하기 위해 문자열 예제에서 초기 요소를 사용했습니다. 그러나 SBCL은 문자열의 초기 요소가 문자가 아닌 경우 오류를 표시하므로 '# \ @'인 문자를 사용했습니다. 그러나이 예제에는 초기 요소가 필요하지 않으므로 예제에서 제거했습니다. –

관련 문제