필자의 이해에서 문자열은 문자 유형의 벡터입니다. 지금까지 내 시도가 열매를 맺지왔다문자열 끝 부분에 문자를 추가하는 방법
(vector-push #\a "Hol")
;; "Hol" Is not of type vector and simple-array
'(1 2 3) (목록 1 2 3)과 동일하지 않습니다 리터럴 "홀리"같은 방식으로 일정 벡터인가? 문자의 벡터를 명시 적으로 만들고 문자를 추가해야합니까?
필자의 이해에서 문자열은 문자 유형의 벡터입니다. 지금까지 내 시도가 열매를 맺지왔다문자열 끝 부분에 문자를 추가하는 방법
(vector-push #\a "Hol")
;; "Hol" Is not of type vector and simple-array
'(1 2 3) (목록 1 2 3)과 동일하지 않습니다 리터럴 "홀리"같은 방식으로 일정 벡터인가? 문자의 벡터를 명시 적으로 만들고 문자를 추가해야합니까?
올바른 진단을 받았습니다. 하지만 문자 데이터 (예 : (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"
하나 질문, 왜 @ char를 초기 요소로 사용합니까? (char-code # \ @) -> 64는 리터럴 @ 부호의 코드 포인트입니다. – PuercoPop
@PuercoPop 첫 번째 예제에는 초기 요소가 포함되어 있으므로 가능한 한 조금만 변경하기 위해 문자열 예제에서 초기 요소를 사용했습니다. 그러나 SBCL은 문자열의 초기 요소가 문자가 아닌 경우 오류를 표시하므로 '# \ @'인 문자를 사용했습니다. 그러나이 예제에는 초기 요소가 필요하지 않으므로 예제에서 제거했습니다. –