언제 필요한가요?
하려는 일을 가장 잘 드러내는 작은 값 형태를 고르세요. 사실 하나에는 원자 값, 순서가 있는 데이터에는 올바른 리스트, 인덱스로 바꿔 쓰는 칸에는 벡터, 길이가 정해진 바이트 덩어리에는 바이트벡터가 알맞습니다.
실행으로 확인하기
LISPEX
(list (vector? #(1 2)) (bytevector? #u8(1 2)) (pair? (cons 1 2)))관측 결과
OUTPUT
(#t #t #t)예제 읽기
예제는 서로 다른 집합 값 세 개에 타입 술어를 하나씩 적용합니다. 생성자마다 문서에 적힌 종류의 값을 만들므로, 결과는 참 세 개가 든 리스트입니다.
cons는 값 둘을 이어 쌍 하나를 만듭니다. 뒤에 리스트를 이으면 (cons 1 (list 2 3))이 (1 2 3)이 되어 리스트가 하나 길어지고, 뒤가 리스트가 아니면 (cons 1 2)가 (1 . 2)가 되어 리스트가 아닌 쌍으로 남습니다. pair?는 그 쌍인지를 묻습니다.
모양이 거의 정해져 있고 몇 자리만 값으로 채우고 싶다면 준인용을 씁니다. 역따옴표로 틀을 적고, 채울 자리에 쉼표를 붙입니다. 쉼표 하나는 값 하나를 그 자리에 넣고, ,@는 리스트를 풀어 여러 자리에 펼쳐 넣습니다.
LISPEX
(define x 7)
(define ys (list 2 3))
`(a ,x ,@ys b)관측 결과
OUTPUT
(a 7 2 3 b),@는 리스트 원소가 들어갈 자리에서만 쓸 수 있습니다. 그 밖의 자리에 홀로 쓰면 E130입니다.
이 순서로 생각하세요
- 현재 프로필에서 쌍과 문자열, 바이트벡터는 불변입니다. 벡터와 어휘 셀은 변경할 수 있습니다.
- 인용한 집합 데이터는 불변입니다. 생성자는 문서에 적힌 동일성 규칙을 따르는 런타임 집합을 만듭니다.
- 부적절한 구조와 순환 구조는 올바른 리스트와 구분됩니다. 깊은 동등성 비교는 순환이 있어도 끝납니다.
빠르게 고르기
| 값 계열 | 대표 표기 | 현재 프로필의 변경 가능성 |
|---|---|---|
| 원자 값 | #t, 42, 2/3, name, #\\a | 해당 없음 |
| 리스트 / 쌍 | (list 1 2), (cons 1 2) | 불변 |
| 문자열 | "hello" | 불변 |
| 벡터 | #(1 2) 또는 (vector 1 2) | 칸 변경 가능 |
| 바이트벡터 | #u8(1 2) | 불변 |
| 프로시저 | (lambda (x) x) | 호출 가능한 값, 본문은 데이터가 아님 |
흔한 오해
복소수와 포트, 레코드, 변경 가능한 쌍과 문자열은 현재 프로필 밖입니다.
현재 경계
- 내부 결과와 신호, 그리고 아직 초기화되지 않은 셀을 가리키는 내부 표시는 게스트 값이 아닙니다.
다음으로
생성자와 접근자는 리스트·집합 프로시저에 있습니다. 동일성 비교와 구조 비교의 차이는 동등성에서 확인하세요.