순서가 있는 데이터에는 리스트, 값 둘을 묶을 때는 쌍, 인덱스로 원소를 읽을 때는 벡터를 쓰세요. 이 페이지에서 각 값을 만드는 방법과 내용을 바꿀 수 있는 조건을 알아봅니다.
값의 종류 확인하기
각 예제를 플레이그라운드에 붙여 넣고 실행하세요.
(list (vector? #(1 2)) (bytevector? #u8(1 2)) (pair? (cons 1 2)))결과
(#t #t #t)세 프로시저는 각 값이 벡터인지, 바이트벡터인지, 쌍인지 묻습니다. 모두 참을 뜻하는 #t를 돌려줍니다.
쌍, 벡터, 문자열, 바이트벡터를 복합 값이라고 부릅니다. 다른 값이나 문자, 바이트를 담는 값입니다.
리스트와 쌍 만들기
(list (cons 1 (list 2 3)) (cons 1 2) (list? (cons 1 2)))결과
((1 2 3) (1 . 2) #f)cons는 값 둘로 쌍을 만듭니다. 두 번째 값이 리스트이면 첫 번째 값을 그 리스트 앞에 붙입니다. 따라서 (cons 1 (list 2 3))의 결과는 (1 2 3)입니다.
올바른 리스트는 빈 리스트 ()이거나, 쌍을 이어 붙여 마지막이 ()로 끝나는 값입니다. (cons 1 2)는 끝에 2가 있습니다. 이 쌍은 (1 . 2)로 표시되며 list?로 물으면 #f가 나옵니다.
연결을 따라가다 앞의 값으로 돌아오는 순환 구조도 올바른 리스트가 아닙니다. equal?는 순환 구조를 비교할 때도 끝납니다.
값 고르기
| 값 | 예 | 용도와 변경 가능성 |
|---|---|---|
| 불리언, 수, 문자, 심볼 | #t, 42, 2/3, 2.0, #\a, 'name | 하나의 값을 나타내며 원자 값이라고 부름 |
| 빈 리스트 | '() | 올바른 리스트의 끝 |
| 리스트 / 쌍 | (list 1 2), (cons 1 2) | 순서가 있는 데이터 / 값 둘의 연결, 쌍은 불변 |
| 문자열 | "hello" | 글자들의 나열, 불변 |
| 프로시저로 만든 벡터 | (vector 1 2) | 인덱스로 원소를 읽고 vector-set!으로 바꿈 |
| 벡터 리터럴 | #(1 2) | 인덱스로 원소를 읽음, 불변 |
| 바이트벡터 | #u8(1 2) | 길이가 정해진 바이트 묶음, 불변 |
| 프로시저 | (lambda (x) x) | 호출하는 값, 본문을 데이터로 꺼내 읽을 수 없음 |
| 탈출 연속 | call/cc로 얻음 | 저장한 지점으로 실행을 되돌림, 연속 참고 |
불변은 저장된 내용을 바꿀 수 없다는 뜻입니다. 인용한 복합 값도 불변입니다. 원소를 바꿀 벡터는 vector로 만들거나 vector-copy로 복사하세요.
변수는 set!으로 다른 값을 가리키게 할 수 있습니다. 이때 바뀌는 것은 변수에 저장된 값이며, 이전 값의 내용은 그대로입니다.
데이터 틀 채우기
준인용은 데이터의 틀을 쓰고 일부 자리에 계산한 값을 넣는 방법입니다.
(define x 7)
(define ys (list 2 3))
`(a ,x ,@ys b)결과
(a 7 2 3 b)역따옴표로 틀을 시작합니다. ,x는 x의 값을 넣습니다. ,@ys는 리스트 ys의 원소를 차례로 펼쳐 넣습니다.
,@는 준인용한 리스트나 벡터의 원소 자리에서 쓸 수 있습니다. 준인용 밖이나 값 하나가 필요한 자리에 쓰면 E130이 납니다.
지원하는 타입
현재 언어 프로파일은 지원하는 언어 기능의 묶음이며, 위 표의 값을 포함합니다. 복소수, 포트, 레코드, 변경 가능한 쌍과 문자열은 지원하지 않습니다.
실행 중 내부에서 쓰는 평가 결과, 제어 신호, 초기화를 기다리는 변수의 표시는 런타임 안에서만 다룹니다. 프로그램은 이를 일반 값처럼 저장할 수 없습니다.
관련 문서
같은지 비교하기에서 내용 비교와 같은 객체인지 확인하는 방법을 알아보세요. 값을 만들고 읽고 바꾸는 프로시저는 리스트와 복합 값 프로시저에 있습니다.