본문 바로가기

리스트 다루기 (Emacs Lisp)

기술적인 이야기/이맥스 2020. 3. 24.
반응형

리스트 생성

그냥 생성하기

(list 1 2 3 4)

;; => (1 2 3 4)

위의 경우가 가장 가독성은 좋은 코드이겠지만 보통은 아래처럼 백틱을 이용한 quote 구문을 많이 사용합니다.

'(1 2 3 4)

;; => (1 2 3 4)

순차적인 리스트 만들기

(number-sequence 2 5)

;; => (2 3 4 5)

굳이 정수가 아니라도 사용 가능하니 매뉴얼을 읽어봅시다.

리스트에 추가하기

제일 앞에 추가하기

(cons 1 '(2 3 4))

;; => (1 2 3 4)

리스트끼리 연결하기

(append '(1 2 3) '(4 5 6))

;; => (1 2 3 4 5 6)

리스트끼리 연결하기(2)

(let ((some-list '(1 2 3)))
  (nconc some-list '(4))
  some-list)

;; => (1 2 3 4)

nconc는 리스트를 연결하는 용도로 사용할 수 있습니다. 다만 빈 리스트는 연결하는 데 사용할 수 없으므로 주의가 필요합니다.

append와는 다르게 nconc는 첫 번째 매개 변수의 값을 바꿔버리는 함수임을 주의합시다. nconc의 리턴되는 값은 변경된 리스트의 값과 동일하므로 필요하면 이걸 받아서 쓸 수도 있습니다.

리스트에서 아이템 뽑아오기

첫 아이템

(car '(1 2 3 4))

;; => 1

car라는 이상한(?) 이름 대신 first라는 가독성이 좋은 함수를 쓸 수도 있습니다.

(first '(1 2 3 4))

;; => 1

마지막 아이템

(car (last '(1 2 3 4)))

;; => 4

last의 결과는 (4) 처럼 리스트로 돌아오기 때문에 car로 한번 더 빼줘야(?) 해당 원소를 구할 수 있습니다.

특정 위치(index)의 아이템

(nth 2 '(1 2 3 4))

;; => 3

nth는 N th, 즉 'N번째' 라는 이름으로 이해하면 됩니다.

리스트의 여분 구하기

첫 엘리먼트를 제외한 리스트

(cdr '(1 2 3 4))

;; => (2 3 4)

cdr이라는 이해하기 어려운 이름 대신 더 읽기 편한 rest라는 이름의 함수를 이용할 수도 있습니다.

(rest '(1 2 3 4))

;; => (2 3 4)

마지막 엘리먼트를 제외한 리스트

(butlast '(1 2 3 4))

;; => (1 2 3)

butlast 함수는 옵션으로 3번째 인자를 제외하기 위한 엘리먼트 개수를 지정할 수 있습니다.

(butlast '(1 2 3 4) 2)

;; => (1 2)

특정 위치(index)의 엘리먼트를 제외한 리스트

(nthcdr 2 '(1 2 3 4))

;; => (3 4)

nthcdr을 붙인 듯한 이름이지요.

기타

(member "bar" '("foo" "bar" 1 2 3))

;; => ("bar" 1 2 3)

member 함수는 이름에서 알 수 있듯이 리스트에서 특정 엘리먼트가 존재하는지 테스트하는 함수입니다. 따라서 non-nil일 경우 멤버가 존재(contain)한다라는 의미로 사용합니다. 다만 리턴되는 결과가 발견 지점부터 나머지의 리스트를 돌려주기 때문에 리스트의 일부를 구하는 특수한 용도로 사용할 수 있습니다.

728x90
반응형

댓글