QUOTE 특수 연산자

QUOTE 특수 연산자 (quote)

quote는 Common Lisp에서 평가(evaluation)를 막고 데이터를 그대로 값으로 만드는 특수 연산자예요. 코드를 적는 자리에서 프로그램 조각이 아니라 '그 자체로 값'인 상수 데이터를 표현하고 싶을 때 가장 먼저 등장하는 도구죠.

출처: CLHS: Special Operator QUOTE

문법 (Syntax)

quote object => object

인자와 값 (Arguments and Values)

  • object — 어떤 객체이든 올 수 있으며, 평가되지 않아요. 인자 자체가 곧 결과가 된다고 보면 돼요.

설명 (Description)

quote 특수 연산자는 object를 그대로 돌려줍니다. 인자로 준 객체는 평가되지 않으니, 심볼이나 리스트 같은 '프로그램 조각'도 여기서는 순수한 데이터로 취급돼요.

한 가지 짚어둘 점은, **리터럴 객체(quoted object 포함)를 파괴적으로 수정하면 결과가 정의되지 않는다(undefined)**는 거예요. 데이터를 바꿀 때는 리터럴을 직접 건드리지 말고 copy-tree 같은 걸로 복사해서 쓰는 게 안전해요.

예제 (Examples)

(setq a 1) =>  1
(quote (setq a 3)) =>  (SETQ A 3)
a =>  1
'a =>  A
''a =>  (QUOTE A) 
'''a =>  (QUOTE (QUOTE A))
(setq a 43) =>  43
(list a (cons a 3)) =>  (43 (43 . 3))
(list (quote a) (quote (cons a 3))) =>  (A (CONS A 3)) 
1 =>  1
'1 =>  1
"foo" =>  "foo"
'"foo" =>  "foo"
(car '(a b)) =>  A
'(car '(a b)) =>  (CAR (QUOTE (A B)))
#(car '(a b)) =>  #(CAR (QUOTE (A B)))
'#(car '(a b)) =>  #(CAR (QUOTE (A B)))

처음 예제에서 (quote (setq a 3))의 결과가 (SETQ A 3)라는 리스트 그대로인 걸 볼 수 있어요. 평가를 막았으니 setq가 실행되지 않고, '그런 모양의 리스트'만 만들어지는 거죠. 심볼 a의 값은 변하지 않아요.

영향 (Affected By)

없음.

예외 상황 (Exceptional Situations)

없음.

함께 보기 (See Also)

  • Section 3.1 (Evaluation), Section 2.4.3 (Single-Quote), Section 3.2.1 (Compiler Terminology)

참고 (Notes)

텍스트 표기 'object(quote object)와 같아요 (Section 3.2.1 참고).

숫자·문자·문자열처럼 **자기-평가 객체(self-evaluating object)**는 quote 없이도 그 자체가 값이 돼요. 반면 심볼과 리스트는 프로그램의 일부를 나타내는 데 쓰이기 때문에, quote가 없으면 프로그램으로 실행되고 말아요. quote가 이런 객체들의 평가를 막아 주는 순간, 그 객체들은 '프로그램'이 아니라 '데이터'로 취급되는 거예요.

더 알아보기 (Learn more)