데이터와 집합 타입

현재 값 공간에는 불리언과 정확수, 부정확수, 문자, 심볼, 문자열, 빈 리스트, 쌍, 벡터, 바이트벡터, 프로시저, 탈출 연속이 있습니다.

언제 필요한가요?

하려는 일을 가장 잘 드러내는 작은 값 형태를 고르세요. 사실 하나에는 원자 값, 순서가 있는 데이터에는 올바른 리스트, 인덱스로 바꿔 쓰는 칸에는 벡터, 길이가 정해진 바이트 덩어리에는 바이트벡터가 알맞습니다.

실행으로 확인하기

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)호출 가능한 값, 본문은 데이터가 아님

흔한 오해

복소수와 포트, 레코드, 변경 가능한 쌍과 문자열은 현재 프로필 밖입니다.

현재 경계

  • 내부 결과와 신호, 그리고 아직 초기화되지 않은 셀을 가리키는 내부 표시는 게스트 값이 아닙니다.

다음으로

생성자와 접근자는 리스트·집합 프로시저에 있습니다. 동일성 비교와 구조 비교의 차이는 동등성에서 확인하세요.

리스트·집합 프로시저 · 동등성과 동일성