`LIST` — 리스트 시스템 클래스

LIST — 리스트 시스템 클래스

커먼 리스프를 처음 시작하면 가장 먼저 만나는 자료구조가 바로 리스트(list)예요. 그런데 이 리스트에는 정상 리스트(proper list) 만 있는 게 아니에요. 점 리스트, 원형 리스트까지 포함해서 리스트라는 타입이 정확히 뭘 뜻하는지 짚고 넘어가야 나중에 헷갈리지 않아요.

출처: Common Lisp HyperSpec — System Class LIST

본문

클래스 우선순위 리스트 (Class Precedence List)

list, sequence, t

설명

리스트는 cons의 사슬(chain)이에요. 각 cons의 car는 그 리스트의 한 요소이고, 각 cons의 cdr은 사슬의 다음 연결 고리이거나 사슬을 끝내는 원자(terminating atom)예요.

여기서 끝맺음 방식에 따라 리스트가 세 종류로 갈라져요.

  • 정상 리스트(proper list): cdr의 끝이 빈 리스트 ()인 리스트예요. () 자체도 정상 리스트죠.
  • 점 리스트(dotted list): cdr의 끝이 빈 리스트가 아닌 다른 원자인 리스트예요.
  • 원형 리스트(circular list): 사슬 안의 어떤 cons의 cdr이 그보다 뒤에 오는 cons를 가리켜서 끝이 없는 리스트예요.

점 리스트와 원형 리스트도 엄연히 리스트에요. 다만 이 스펙에서 꾸밈없이 "list"라고 부를 때는 보통 정상 리스트를 뜻해요. 그렇지만 list 타입 자체는 분명하게 점 리스트와 원형 리스트까지 포함해요.

리스트의 각 요소마다 cons가 하나씩 존재해요. 빈 리스트는 요소가 없으니까 cons도 아니에요.

그리고 한 가지 재미있는 성질이 있는데, cons 타입과 null 타입은 list 타입을 빠짐없이 갈라 나누는(exhaustive partition) 관계예요. 다시 말해 어떤 객체든 리스트라면 cons이거나 nil 중 하나라는 거죠.

함께 보기

  • Section 2.4.1 (Left-Parenthesis)
  • Section 22.1.3.5 (Printing Lists and Conses)