Emacs Lisp에서 작은따옴표의 의미
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이라는 함수는 없다'는 오류가 발생한다. 제일 처음의 이야기다.