Emacs Lisp에서 작은따옴표의 의미

Emacs // 2024년 06월 24일 작성 // 2024년 06월 29일 업데이트

Emacs Lisp 코드를 보면 작은따옴표가 종종 보이는데 유독 한 쌍이 아니라 한 개씩만 보여서 상당히 혼란스러웠었다. 왜냐하면 다른 언어에서 작은따옴표는 문자 혹은 문자열을 둘러싸는 특수 기호로 쓰이니 말이다.

즉 Emacs Lisp에서 작은따옴표는 다른 언어들과는 다른 의미로 쓰인다. 도대체 이 작은따옴표는 무슨 의미일까?

Emacs Lisp에서 순수한 데이터 리스트 표현하기

Common Lisp을 포함하여 Emacs Lisp에서 모든 요소는 리스트로 표현된다. 그리고 리스트의 특징 중 하나로 첫 요소는 바로 함수여야 한다는 점이 있다.

그래서 순수한 데이터 리스트를 표현할 때는 약간의 문제가 있다. 아래의 예를 보자.

(print (1 2 3))

위 코드의 의도는 (1 2 3)이라는 리스트를 콘솔에 표시하고 싶은 것인데, 블행히도 '1이라는 함수는 없다'는 식의 오류가 발생하는 코드다. 앞서 이야기 했다시피 Lisp에서 리스트의 첫 요소는 함수여야 하기 때문이다.

만약 순수한 데이터 리스트로 (1 2 3)을 표현하려면 어떻게 해야 할까?

대략 두 가지 방법이 있는데 하나는 list라는 함수를 이용해 인스턴스를 생성하는 것이다.

(print (list 1 2 3))

위와 같이 하면 의도대로 동작하는 것을 확인할 수 있다.

두가지라고 했으니 나머지 하나가 남았다. 그 나머지가 이 글의 주제와 관련이 있다.

Emacs Lisp에서 작은따옴표의 용도

리스트 데이터를 표현하기 위해 list 함수를 이용하는 것보다 더 직관적인 방법이 있는데 바로 이번 글의 주제인 작은따옴표를 써서 할 수 있다. 아래와 같은 식으로 말이다.

(print '(1 2 3))

이렇게 하면 list 함수를 이용한 경우와 동일하게 동작하면서도 코드 자체는 더 간결하게 느껴진다. 이게 바로 작은따옴표가 자주 쓰이는 용도다.

사실 작은따옴표는 quote라는 함수라고 이해하면 된다. 위와 코드는 아래 코드와 동일하다.

(print (quote 1 2 3))

그렇다면 "작은따옴표는 데이터 리스트를 표현하기 위해 사용하는구나"라고 이해하면 될까? 틀린 건 아니겠지만 원칙적으로 맞지는 않는 설명이다.

Emacs Lisp에서 작은따옴표의 의미

Emacs Lisp에서 작은따옴표(', single quote)는 사실은 "실행시키지 않는다"는 의미로 대충 둘러대는 게 맞을 것 같다. 이 작은따옴표로 인용된 리스트는 리스트 자체를 그대로 표현하는 것이기 때문이다.

약간 비슷하지만 다른 예를 보자.

(defun doubled (x)
  (+ x x))

(print '(doubled 2))

이 코드가 실행되면 어떻게 될까? 별로 생각할 필요 없이 그대로 (doubled 2)가 출력된다. 작은따옴표로 인용된 리스트는 별도의 처리가 없으면 그대로 표현될 뿐이다.

이번에는 아예 이상한(?) 영단어를 요소로 리스트를 구성해 봤다.

(print '(aaa bbb ccc))

이 코드에서 참조하는 aaa, bbb, ccc는 정의되지 않은 심볼이다. 따라서 실행시키면 오류가 나야 할 것 같다.

하지만 위 코드는 (aaa bbb ccc)를 그대로 출력할 뿐 오류가 나지 않는다. 왜냐하면 해당 리스트의 각 요소는 아직 실체화되지 않았기 때문이다.

결과적으로 list 함수를 이용해 생성한 순수 데이터 리스트와 작은따옴표를 이용해 생성한 인용(quote)된 리스트는 결과적으로는 동일하게 사용할 수 있지만 본질적으로는 다르다는 말이다. 그저 작은따옴표를 데이터 리스트를 표현하는 데 자주 사용할 뿐이다.

참고로 작은따옴표나 quote로 인용된 리스트는 eval로 일반 리스트화 하는 것도 가능하다.

(eval '(1 2 3))

'1이라는 함수는 없다'는 오류가 발생한다. 제일 처음의 이야기다.

관련된 글들