2011-03-20 3 views
3

왜 이러한 일련의 clojure 명령이 false를 반환하고 true가 아닌가? 문장 1 "C"와 2 "(인용 C)의 결과 사이의 차이점은 무엇입니까? 혼동을 인용 함

; SLIME 2009-03-04 
user> ('A 'B 'C) 
C 
user> (last '('A 'B 'C)) 
(quote C) 
user> (= ('A 'B 'C) (last '('A 'B 'C))) 
false 

이 질문에

' 양식 (quote ...)에 대한 바로 가기입니다 Clojure의 (다른 Lisps)에서 How does clojure's syntax-quote work?

+0

"Quoting Confujon"을 원하셨습니까? – pablosaraiva

답변

7

다소 유사하다. 그래서 Clojure의이 볼 때 :로 리더 "번역"입니다

('A 'B 'C) 

:

((quote A) (quote B) (quote C)) 

그 인용 형태의 각각은, 기호로 평가 그래서 (quote A)는 A.에서라는 기호로 평가 Clojure, 심볼은 함수이며 적용 할 수 있으므로 ((quote A) (quote B) (quote C))은 실제로 함수 호출입니다. (예 : ('mysym my-hash-map : map)')이 예제에서는 두 번째 인수 (기본값)를 사용하여 하나의 인수 (map)의 invoke()에 대해 IFn을 구현합니다. none)은 get my-hash-map 'mysym : none'과 같은 의미입니다.

그래서 무슨 일이 발생합니까? C이 기본값이므로 그 이유가 반환됩니다. 한편

'('A 'B 'C) 

세 개의 요소의 목록은 각각의 구성 요소, 심볼 quote 및 목록 실제로

(quote ((quote A) (quote B) (quote C))) 

에 리더에 의해 번역 다른 기호 (이 경우 A, B, C).

따라서 (last '('A 'B 'C))은 실제로 (quote C)입니다. 그 두 결과의 차이점은 C은 C라는 기호이며 (quote C)은 두 요소의 목록입니다.

이 작업을 확인할 수 있습니다

user=> (class ('A 'B 'C)) 
clojure.lang.Symbol 
user=> (class (last '('A 'B 'C))) 
clojure.lang.PersistentList 
user=> 

희망을 분명 그!

+0

도움 주셔서 감사합니다. – tjb

+0

안녕하세요. – spacemanaki

1

('x'y)은 매우 드문 경우입니다. 대개 '(x y)는 문자 기호 x와 y의 목록입니다. TWICE를 '('x 'y)와 함께 인용하면 대신에 (quote x)가있는 목록을 얻을 수 있습니다. 리터럴 기호 따옴표 다음에 리터럴 기호 x가옵니다.

관련 문제