리스트와 복합 값 프로시저

쌍을 만들고 리스트와 벡터의 원소를 읽거나 벡터를 바꾸는 방법과 인자 오류를 찾아봅니다.

이 프로시저로 쌍을 만들고, 리스트나 벡터의 원소를 읽고, 벡터의 내용을 바꿀 수 있습니다. 표에서 필요한 인자와 결과, 오류를 찾아보세요.

원소 읽기

각 예제를 플레이그라운드에 붙여 넣고 실행하세요.

LISPEX
(list (list-ref (list 10 20 30) 1) (vector-ref #(4 5) 0))

결과

출력
(20 4)

인덱스는 0부터 시작합니다. list-ref는 리스트의 두 번째 원소 20을 읽습니다. vector-ref는 벡터의 첫 번째 원소 4를 읽습니다.

쌍, 벡터, 문자열, 바이트벡터는 다른 값이나 문자, 바이트를 담으므로 복합 값이라고 부릅니다.

벡터 바꾸기

LISPEX
(define v (vector 4 5))
(define same v)
(vector-set! v 0 9)
(list (vector-ref same 0) (eq? v same))

결과

출력
(9 #t)

vector-set!은 v의 첫 번째 원소를 바꿉니다. same도 그 벡터를 가리키므로 바뀐 원소를 읽습니다. 벡터의 객체 동일성은 그대로이므로 eq?의 결과는 #t입니다.

vector-set!이 돌려주는 값은 0개입니다. 예제는 그 뒤에 벡터를 읽어 바뀐 내용을 보여 줍니다.

변경할 벡터는 vector나 vector-copy로 만드세요. #(4 5) 같은 벡터 리터럴과 인용한 벡터는 불변입니다. 바꾸려고 하면 E312가 납니다. 현재 언어 프로파일에서 쌍과 바이트벡터도 불변입니다.

호출 방법과 오류

아래 표의 k는 0부터 시작하는 정확 정수 인덱스입니다. 올바른 리스트는 쌍을 이어 붙여 빈 리스트 ()로 끝나는 값이거나 빈 리스트 자체입니다.

호출결과잘못된 인자
(cons a d)a와 d를 담은 새 쌍어떤 값이든 두 개 받음
(car pair) / (cdr pair)저장된 첫 번째 / 두 번째 부분쌍이 아니면 E310
(list-ref proper-list k)인덱스 k의 원소올바른 리스트가 아니거나 k가 정확 정수가 아니면 E312, 인덱스가 범위 밖이면 E311
(vector-ref vector k)인덱스 k의 원소타입이 틀리면 E312, 인덱스가 범위 밖이면 E311
(vector-set! vector k value)값 0개, 기존 벡터의 원소를 바꿈타입이 틀리거나 불변 벡터이면 E312, 인덱스가 범위 밖이면 E311
(bytevector-u8-ref bytevector k)0부터 255까지의 정확 정수타입이 틀리면 E312, 인덱스가 범위 밖이면 E311

오류는 프로시저마다 다릅니다. 예를 들어 car에 쌍이 아닌 값을 주면 E310이 납니다. list-ref에 올바른 리스트가 아닌 값을 주면 E312가 납니다.

다른 연산 찾기

할 일프로시저
리스트와 쌍 만들기list, make-list, cons
일부 읽기car, cdr, 둘을 조합한 cadr 등, list-ref, list-tail
검색하기member, memv, memq, assoc, assv, assq
리스트 복사, 연결, 뒤집기list-copy, append, reverse
벡터 만들기, 복사, 원소별 변환vector, make-vector, vector-copy, vector-map

데이터와 복합 값에서 값의 형태를 설명합니다. 비교 방법은 같은지 비교하기에 있습니다. 다른 프로시저 계열은 프로시저 색인에서 찾아보세요.