ARRAY-ELEMENT-TYPE — 배열 원소 타입
ARRAY-ELEMENT-TYPE — 배열 원소 타입
ARRAY-ELEMENT-TYPE는 함수예요. 배열이 실제로 담을 수 있는 객체들의 타입(실제 배열 원소 타입, actual array element type)을 나타내는 타입 스펙시피어를 돌려줘요. 배열을 만들 때 지정한 :element-type이 그대로 나오리라 기대했다간, 업그레이드(upgrading) 규칙 때문에 예상과 다를 수 있어요.
본문
시그니처는 이렇게 생겼어요.
array-element-type array => typespec
- array — 배열.
- typespec — 타입 스펙시피어.
동작은 이렇습니다. array-element-type은 그 배열이 담을 수 있는 객체들의 집합을 나타내는 타입 스펙시피어를 돌려줘요. 이 타입 스펙시피어는 경우에 따라 표현된 배열 원소 타입(expressed array element type)의 상위 타입을 가리킬 수도 있어요. 왜냐하면 배열 업그레이드(upgrading) 때문에 실제 저장 방식이 더 넓은 타입으로 맞춰질 수 있거든요.
예제를 볼게요.
(array-element-type (make-array 4)) => T
(array-element-type (make-array 12 :element-type '(unsigned-byte 8))) => implementation-dependent
(array-element-type (make-array 12 :element-type '(unsigned-byte 5))) => implementation-dependent
(array-element-type (make-array 5 :element-type '(mod 5)))
could be (mod 5), (mod 8), fixnum, t, or any other type of which (mod 5) is a subtype.
:element-type을 주지 않은 첫 예제는 타입 제약이 없는 배열이라 T가 나와요. 나머지 예제들이 구현 의존적이라는 점이 이 함수를 "값을 단정적으로 믿기보다 타입 관계를 확인"하는 용도로 쓰라는 힌트예요. 특히 (mod 5) 같은 좁은 타입은 구현에 따라 그대로일 수도, 더 넓은 타입으로 업그레이드된 후 그 타입일 수도 있어요.
이 함수의 결과는 구현체에 따라 달라져요(영향을 받는 대상이 구현 자체). 인자가 배열이 아니면 type-error 타입 오류를 신호해야 해요.
관련 함수로는 array, make-array, subtypep, upgraded-array-element-type이 있어요. 특히 업그레이드 규칙을 정확히 알고 싶다면 upgraded-array-element-type이 더 직접적이에요.