2011-09-30 2 views
3

다음 중 lisp 구문이 올바른 표현식은 무엇입니까?Lisp : 따옴표 평가

(+ 1 (quote 1)) 
==> 1 (???) 
(+ 1 (eval (quote 1)) 
==> 2 

저는 현재 제 자신의 혀짤리는 통역사를 쓰고 있으며, 따옴표를 올바르게 처리하는 방법을 모르고 있습니다. 대부분의 리스프 인터프리터는 두 표현식을 모두 "2"로 평가합니다. 그러나 따옴표가 전혀 평가되지 않아야하며 따라서 두 번째 표현 만 합법적 인 표현이되어서는 안됩니까? 그래도 어째서 작동합니까? 이것은 어떤 종류의 문법적 설탕입니까?

+2

좋은 관련 질문은 [Lisp에서 1과 '1의 차이점은 무엇입니까?] (http://stackoverflow.com/questions/2966765/what-is-the-difference-between-1-and-1 -in-lisp). – Peteris

답변

5

특수 양식을 제외하고 대부분의 Lisps는 인수를 먼저 평가 한 다음 함수를 적용합니다 (따라서 평가 및 적용 구문).

첫 번째 양식 (+ 1 '1)은 먼저 해당 인수 1'1을 평가합니다. 상수 숫자는 스스로 평가하며 따옴표는 따옴표로 평가되므로 +11에 적용하면 2이됩니다.

eval: (+ 1 (quote 1)) 
eval 1st arg: 1 ==> 1 
eval 2nd arg: '1 ==> 1 
apply: (+ 1 1) ==> 2 

두 번째 형태는 유사 하나, 인용 부호로 둘러싸이지 않은 1은 다시 1를 산출 한 번 eval를 통해 이동합니다

eval: (+ 1 (eval '1)) 
eval 1st arg: 1 ==> 1 
eval 2nd arg: (eval '1) 
    eval arg: '1 ==> 1 
    apply: (eval 1) ==> 1 
apply: (+ 1 1) ==> 2 
3

숫자는 그 자체로 평가 그래서 (quote 1)1과 동일합니다.

+2

"동일하지"않지만 "평가합니다." –

+1

고마워. 사실, 매크로에서'(인용문 1)과'1 '은 다른 행동을 일으킬 수 있습니다. – Peteris