R6RS Scheme: 벡터

R6RS Scheme: 벡터

정수로 색인되는 이질적(heterogeneous) 구조인 벡터(vector)의 연산을 설명해요. 벡터 생성·접근·변경·변환·매핑 프로시저를 시그니처와 예시로 다뤄요.

출처: 문서

본문

벡터는 정수로 색인되는 이질적 구조예요. 벡터는 보통 같은 길이의 리스트보다 적은 공간을 차지하고, 무작위로 선택된 원소에 접근하는 평균 시간도 리스트보다 벡터에서 보통 더 짧아요.

벡터의 길이는 그것이 포함하는 원소의 개수예요. 이 숫자는 벡터가 만들어질 때 고정되는 음이 아닌 정수예요. 벡터의 유효한 색인(valid index)들은 벡터의 길이보다 작은 정확한 음이 아닌 정수 객체들이에요. 벡터의 첫 원소는 0으로 색인되고, 마지막 원소는 벡터의 길이보다 1 작은 값으로 색인돼요.

리스트 상수와 마찬가지로, 벡터 상수는 인용(quote)되어야 해요:

'#(0 (2 2 2 2) "Anna")  ⇒ #(0 (2 2 2 2) "Anna")

(vector? obj) — procedure

obj가 벡터이면 #t를 반환해요. 그렇지 않으면 이 프로시저는 #f를 반환해요.

(make-vector k) — procedure

(make-vector k fill) — procedure

k개의 원소를 가진 새로 할당된 벡터를 반환해요. 두 번째 인자가 주어지면 각 원소가 fill로 초기화돼요. 그렇지 않으면 각 원소의 초기 내용은 미지정이에요.

(vector obj ...) — procedure

주어진 인자들을 원소로 포함하는 새로 할당된 벡터를 반환해요. list에 해당하는 벡터 버전이에요.

(vector 'a 'b 'c)               ⇒ #(a b c)

(vector-length vector) — procedure

vector의 원소 개수를 정확한 정수 객체로 반환해요.

(vector-ref vector k) — procedure

kvector의 유효한 색인이어야 해요. vector-ref 프로시저는 vector의 원소 k의 내용을 반환해요.

(vector-ref '#(1 1 2 3 5 8 13 21) 5)  ⇒ 8

(vector-set! vector k obj) — procedure

kvector의 유효한 색인이어야 해요. vector-set! 프로시저는 objvector의 원소 k에 저장하고 미지정 값을 반환해요.

vector-set!에 불변 벡터를 전달하는 것은 조건 타입 &assertion을 가진 예외를 일으켜야 해요.

(let ((vec (vector 0 '(2 2 2 2) "Anna")))
  (vector-set! vec 1 '("Sue" "Sue"))
  vec)
     ⇒ #(0 ("Sue" "Sue") "Anna")

(vector-set! '#(0 1 2) 1 "doe")
     ⇒ unspecified
        ; constant vector
        ; should raise &assertion exception

(vector->list vector) — procedure

(list->vector list) — procedure

vector->list 프로시저는 vector의 원소들에 포함된 객체들의 새로 할당된 리스트를 반환해요. list->vector 프로시저는 리스트 list의 원소들로 초기화된 새로 만들어진 벡터를 반환해요.

(vector->list '#(dah dah didah))  ⇒ (dah dah didah)
(list->vector '(dididit dah))     ⇒ #(dididit dah)

(vector-fill! vector fill) — procedure

vector의 모든 원소에 fill을 저장하고 미지정 값을 반환해요.

(vector-map proc vector1 vector2 ...) — procedure

벡터들은 모두 같은 길이여야 해요. proc은 벡터들의 개수만큼의 인자를 받아들이고 단일 값을 반환해야 해요.

vector-map 프로시저는 proc을 벡터들의 원소들에 원소별로 적용하고 결과들을 순서대로 담은 벡터를 반환해요. proc은 항상 vector-map 자신과 같은 동적 환경에서 호출돼요. proc이 벡터들의 원소들에 적용되는 순서는 미지정이에요. vector-map에서 여러 반환 값이 발생하면, 앞선 반환 값들이 만들어낸 반환 값들은 변형되지 않아요.

map에 해당하는 벡터 버전이에요.

구현 책임: 구현은 proc에 대한 제약을, 설명된 대로 적용함으로써 수행되는 범위까지 확인해야 해요. 구현은 proc을 적용하기 전에 그것이 적절한 인자인지 확인할 수 있어요.

(vector-for-each proc vector1 vector2 ...) — procedure

벡터들은 모두 같은 길이여야 해요. proc은 벡터들의 개수만큼의 인자를 받아들여야 해요. vector-for-each 프로시저는 proc을 벡터들의 원소들에 원소별로 적용해 그 부수 효과를 일으켜요. 적용 순서는 첫 원소부터 마지막 원소까지예요. proc은 항상 vector-for-each 자신과 같은 동적 환경에서 호출돼요. vector-for-each의 반환 값들은 미지정이에요.

for-each에 해당하는 벡터 버전이에요.

구현 책임: 구현은 proc에 대한 제약을, 설명된 대로 적용함으로써 수행되는 범위까지 확인해야 해요. 구현은 proc을 적용하기 전에 그것이 적절한 인자인지 확인할 수 있어요.

더 알아보기 (Learn more)

출처: Vectors - R6RS