ARRAY-DISPLACEMENT — 변위 배열의 정보

ARRAY-DISPLACEMENT — 변위 배열의 정보

ARRAY-DISPLACEMENT는 함수예요. 배열이 변위 배열(displaced array)일 때, 그 배열이 어느 배열에 변위되어 있는지와 오프셋을 알려줘요. 배열이 다른 배열의 내용을 공유하는 관계를 들여다볼 때 써요.

출처: CLHS Function ARRAY-DISPLACEMENT

본문

시그니처는 이렇게 생겼어요.

array-displacement array => displaced-to, displaced-index-offset
  • array — 배열.
  • displaced-to — 배열 또는 nil.
  • displaced-index-offset — 음이 아닌 fixnum.

동작은 이렇습니다. 배열이 변위 배열이면, 그 배열을 만들 때 준 :displaced-to:displaced-index-offset 옵션의 값을 돌려줘요(make-array, adjust-array 참고). 변위 배열이 아니라면 nil0을 반환해요.

좀 더 꼼꼼히 보면요. make-arrayadjust-array:displaced-to 인자로 nil이 아닌 객체를 제공해 만든 배열에 대해 이 함수를 호출하면, 반드시 그 객체를 첫 번째 값으로 돌려줘야 해요. 그 외의 배열에 대해 이 함수가 첫 번째 값으로 nil이 아닌 값을 돌려줄지는 구현 의존적(implementation-dependent)이에요.

예제를 볼게요.

(setq a1 (make-array 5)) => #<ARRAY 5 simple 46115576>
(setq a2 (make-array 4 :displaced-to a1 :displaced-index-offset 1))
=> #<ARRAY 4 indirect 46117134>
(array-displacement a2) => #<ARRAY 5 simple 46115576>, 1

a2a1에 변위되고 오프셋 1을 가지는데, array-displacement가 정확히 그 정보를 돌려주죠. 변위 배열이 또 다른 변위 배열에 변위되는 것도 가능해요.

(setq a3 (make-array 2 :displaced-to a2 :displaced-index-offset 2))
=> #<ARRAY 2 indirect 46122527>
(array-displacement a3) => #<ARRAY 4 indirect 46117134>, 2

a3a2에 변위되어 있으니, 첫 번째 값으로 a2를 돌려주고 오프셋 2를 알려줘요. 이렇게 변위 관계가 체인처럼 이어져도 이 함수는 "직접" 변위된 대상과 그 오프셋을 반환한다는 점이 핵심이에요.

인자가 배열이 아니면 type-error 타입 오류를 신호해야 해요. 변위 배열을 만드는 쪽은 make-array를 함께 보면 돼요.