2013-03-13 2 views
5

나는 Clojure를 배우고있다. 아직도 나는 언어와 철학에 대해 잘 이해하지 못했다. .Clojure에서 도트 연산자와 정규화 된 명명 된 호출의 차이점

그러나 나는 언어에 더 익숙해지고 싶습니다. 그러므로 나는 Clojure 핵심 API 문서 을 읽고 clojure.core/get 소스 코드에서 흥미로운 것을 발견했다.

(defn get 
    "Returns the value mapped to key, not-found or nil if key not present." 
    {:inline (fn [m k & nf] `(. clojure.lang.RT (get ~m ~k [email protected]))) 
    :inline-arities #{2 3} 
    :added "1.0"} 
    ([map key] 
    (. clojure.lang.RT (get map key))) 
    ([map key not-found] 
    (. clojure.lang.RT (get map key not-found)))) 

주어진 키를 사용하여 값을 얻으려면 clojurelang.RT/get 함수를 사용하십시오. 코드는 점 연산자 -(. clojure.lang.RT (get map key))을 호출합니다.

제 질문은 (clojure.lang.RT/get map key) 대신 (. clojure.lang.RT (get map key))을 작성한 이유입니다.

기술적 인 차이점이 있습니까? 또는 어떤 이득?

+0

'classname/method' 구문을 정의하기 전에 정의 했습니까? 내 생각 엔'clojure.lang.RT/get'은 컴파일 시점에서 구문 에러가 될 것입니다. – ToBeReplaced

+0

''clojure.core'' 코드는 가장 낮은 수준의 양식을 사용하기 때문에 언어 철학을 이해하기에 아마도 좋은 곳이 아닙니다. 깨끗한 HTTP 추상화 (https://github.com/mmcgrana/ring/)를위한 링 또는 라우팅 DSL (https://github.com/weavejester/compojure)을위한 컴포지트와 같이 잘 설정된 라이브러리를 살펴 보는 것이 좋습니다. – sw1nn

답변

7

Clojure의 점은 호스트 interop (이 경우 Java 클래스 clojure.lang.RT)에 사용됩니다. 정적 메서드의 관용구 양식은 (Classname/staticMethod args*)이지만 . 특수 형식의 호출로 확장됩니다. get 함수의 경우에는 기본적으로 Clojure의 구현 부분을 살펴볼 수 있습니다. 저수준 Clojure 코드가 상위 매크로를 사용하는 이유는 없습니다. 따라서 . 형식을 직접 사용합니다. 그들은 도트 연산자에 전화로 확장하는 방법을 찾을 수 있습니다 http://clojure.org/java_interop

관용적 형태의 상단과 이하 :

은 문서를 살펴 보자. 다음은 정적 메소드에 대한 관련 비트입니다.

(Classname/staticMethod args*) ==> (. Classname staticMethod args*) 
관련 문제