리스트 연산

리스펙스에서 리스트를 만들고 읽고 바꾸는 내장 함수를 설명합니다.

이전 문서입니다. 리스트를 만들고 읽는 방법은 현재 리스트와 복합 값 프로시저에서 확인하세요.

이 페이지는 리스펙스에서 리스트를 생성하거나 조작하는 내장 함수에 대한 참조를 제공합니다. 이 함수들은 핵심 함수 참조에 있는 함수들을 보완합니다.


cons

기존 리스트의 앞에 요소를 추가하여 새 리스트를 구성합니다. "Cons"는 "construct(구성하다)"의 줄임말입니다.

  • 구문: (cons ELEMENT LIST)
  • 인자:
    • ELEMENT: 앞에 추가할 새 요소.
    • LIST: 요소가 추가될 기존 리스트.
  • 반환: 새 리스트.
  • 오류: 두 번째 인자가 리스트가 아니면 RuntimeError를 발생시킵니다.

예시:

LISPEX
(cons 1 (list 2 3 4))
;; 결과: (list 1 2 3 4)

(cons (list "a") (list "b" "c"))
;; 결과: (list (list "a") "b" "c")

append

두 리스트를 함께 이어 붙여 하나의 새 리스트를 생성합니다.

  • 구문: (append LIST_1 LIST_2)
  • 인자:
    • LIST_1: 첫 번째 리스트.
    • LIST_2: 두 번째 리스트.
  • 반환: LIST_1의 모든 요소 다음에 LIST_2의 모든 요소가 오는 새 리스트.
  • 오류: 어느 한쪽 인자라도 리스트가 아니면 RuntimeError를 발생시킵니다.

예시:

LISPEX
(append (list 1 2) (list 3 4))
;; 결과: (list 1 2 3 4)

(append (list) (list 1 2))
;; 결과: (list 1 2)

nth

리스트에서 특정 0 기반 인덱스에 있는 요소를 반환합니다.

  • 구문: (nth LIST INDEX)
  • 인자:
    • LIST: 요소를 검색할 리스트.
    • INDEX: 검색할 요소의 정수 인덱스 (0부터 시작).
  • 반환: 지정된 인덱스의 요소.
  • 오류:
    • LIST가 리스트가 아니거나 INDEX가 정수가 아니면 RuntimeError를 발생시킵니다.
    • INDEX가 범위를 벗어나면(0보다 작거나 리스트 길이보다 크거나 같으면) RuntimeError를 발생시킵니다.

예시:

LISPEX
(define my-list (list "a" "b" "c"))

(nth my-list 0)
;; 결과: "a"

(nth my-list 2)
;; 결과: "c"

(nth my-list 3)
;; RuntimeError 발생: 인덱스 3이 범위를 벗어남

member

주어진 객체와 같은 요소를 리스트에서 찾아 첫 일치 지점부터 시작하는 부분 리스트를 반환합니다. 없으면 #f를 반환합니다. memv와 memq는 깊은 equal? 대신 eqv? 동등성으로 같은 검색을 합니다 (이 버전에서는 eqv?와 eq?가 일치하므로 memq는 memv처럼 동작합니다).

  • 구문: (member OBJ LIST)
  • 인자:
    • OBJ: 찾을 객체 (equal?로 비교, memv/memq는 eqv? 사용).
    • LIST: 검색할 리스트.
  • 반환: 첫 일치 요소부터의 부분 리스트, 없으면 #f.
  • 오류: LIST가 적절한 리스트가 아니면 RuntimeError를 발생시킵니다.

예시:

LISPEX
(member 2 (list 1 2 3))
;; 결과: (list 2 3)

(member 5 (list 1 2 3))
;; 결과: #f

assoc

연관 리스트(쌍의 리스트)에서 키(각 항목의 car)가 주어진 객체와 같은 첫 쌍을 찾아 반환합니다. 없으면 #f를 반환합니다. assv와 assq는 equal? 대신 eqv?로 같은 조회를 합니다.

  • 구문: (assoc OBJ ALIST)
  • 인자:
    • OBJ: 조회할 키 (equal?로 비교, assv/assq는 eqv? 사용).
    • ALIST: 모든 항목이 쌍인 연관 리스트.
  • 반환: car가 일치하는 첫 항목 쌍, 없으면 #f.
  • 오류: ALIST가 쌍으로 이루어진 적절한 리스트가 아니면 RuntimeError를 발생시킵니다.

예시:

LISPEX
(assoc 2 (list (list 1 "one") (list 2 "two")))
;; 결과: (list 2 "two")

(assoc 9 (list (list 1 "one")))
;; 결과: #f

list-tail

LST의 처음 K개 요소를 버린 부분 리스트, 곧 K번째 cdr를 반환합니다. 결과는 LST와 구조를 공유하며 복사하지 않습니다. LST의 길이가 K보다 작으면 오류입니다.

  • 문법: (list-tail LST K)
  • 인자:
    • LST: 리스트.
    • K: LST의 길이를 넘지 않는 음이 아닌 정수.
  • 반환: 처음 K개 요소를 제외한 부분 리스트(K가 0이면 LST 자신).
  • 오류: K가 음수이거나 LST의 길이보다 크면 RuntimeError를 발생시킵니다.

예시:

LISPEX
(list-tail (list 1 2 3 4) 2)
;; 결과: (list 3 4)

list-copy

LST의 얕은 복사본, 곧 같은 요소를 담은 새 쌍 사슬을 반환합니다. 복사본은 원본과 eq?가 아니지만 요소 자체는 복제되지 않고 공유됩니다. 리스트가 아닌 객체는 그대로 반환됩니다.

  • 문법: (list-copy LST)
  • 인자:
    • LST: 리스트(또는 임의의 객체).
  • 반환: 요소를 공유하는 새로 할당된 리스트 복사본.

예시:

LISPEX
(list-copy (list 1 2 3))
;; 결과: (list 1 2 3)