2013-02-08 4 views
9

X.clojurescript와 X.clojure 네임 스페이스가 있다고 가정 해 보겠습니다. X.clojurescript의 모든 것은 Clojurescript 코드이며, X.clojure의 모든 것은 Clojure 코드입니다. 불행하게도, 내가 직접 Clojurescript에서 매크로를 정의 할 수 없습니다, 나는 Clojure의의를 정의하고Clojurescript 매크로에서 필요한 Clojurescript 코드를 어떻게 처리합니까?

(ns X.clojurescript.abc 
    (:require-macros [X.clojure.def :as clj])) 

이 괜찮 사용하여 Clojurescript 네임 스페이스로 가져해야합니다. 그러나 매크로 (X.clojure에 정의 된)가 Clojurescript 네임 스페이스 (X.clojurescript)에 정의 된 것을 참조 할 필요가 있다면 어떻게 될까요? 문제는 다른 네임 스페이스를 해결할 때 Clojure 컴파일러가 Clojurescript 네임 스페이스 (별도의 디렉토리)를 찾지 않는다는 것입니다.

Clojurescript와 동일한 네임 스페이스와 정의가 필요한 Clojure 코드에 네임 스페이스를 생성하면이 문제를 해결할 수 있지만이 방법은 어리석은 일입니다. 예를 들어, 매크로에 X.clojurescript.abc.y가 필요한 경우 Clojure 버전의 X.clojurescript.abc에서 더미 y를 정의하는 추가 네임 스페이스를 Clojure 측에 작성합니다. 일종의 바보.

Clojurescript 쪽에서 뭔가를 참조해야하는 매크로는 어떻게 처리합니까?

+0

clojurescript에서 필요한 모든 항목을 매개 변수로 사용하는 매크로를 만듭니다. 일부 코드를 추가 할 수 있다면 명확한 질문에 대답하는 것이 훨씬 쉬울 것입니다. – Ankur

+2

귀하의 질문을 이해할 수 없다고 생각합니다. 매크로는 클로저 스크립트에서 평가할 코드를 * 생성 *해야합니다. 따라서 어떤 클로저 스크립트를 참조해야한다면 매크로 확장시 기호를 생성하는 것으로 충분하지 않습니까? – KIMA

+0

'Clojurescript 쪽의 무언가를 참조하십시오 .' 매크로 확장시 또는 출력 코드에서 출력 될 내용이 필요합니까? – Ankur

답변

6

정의 시간에 매크로가 특정 네임 스페이스를 필요로하는 유일한 경우는 매크로가 네임 스페이스의 코드를 사용하여 반환 할 기호 목록을 생성하는 경우입니다.

당신은 REPL에서 이러한 예제를 따라 할 수 있습니다

(defmacro foo 
    [a] 
    `(bar/bar ~a)) 

foo는 정의 바 이제 때문에 실패합니다 foo는 호출 정의 된 네임 스페이스

(foo :a) 

없는 경우에도 컴파일 막대 네임 스페이스 또는 함수 막대를 아직 정의하지 않았습니다.

(ns bar) 
(defn bar 
    [x] 
    [x x]) 

바 네임 스페이스 바를 정의

(ns user) 
(foo :a) 

=> [: A :] 바 foo는의 정의 시점에 존재할 필요하지 않습니다

알 수 있습니다. 사실 네임 스페이스는 foo의 정의 시점에 존재할 필요조차 없습니다.

+0

컴파일은 하나이지만 ClojureScript 측에서 라이브러리를 요구하는 것은 어떨까요? 위의 예제에서 foo 매크로를 호출하는 ClojureScript 모듈에서 bar 네임 스페이스를 요구해야하는 것처럼 보입니다. 즉, 호출 모듈이 매크로에 대한 구현 세부 사항을 알아야합니다. –

+0

내가 언급 한 문제의 예는 딸꾹개 (Hiccups) 라이브러리에서 경험할 수 있습니다. 해커의 일종 인 솔루션을 여기에서 볼 수 있습니다 : https://github.com/teropa/hiccups#usage –

+1

이것이 존재하는 것처럼 이것이 클로저 스크립트의 구현에 근본적인 문제라고 생각합니다.나는 그것으로 작업하는 가장 좋은 방법이라고 생각하는 것을 제안하고 있지만 이상적이지 않다는 것을 이해한다. 하지만 근본적으로 이것은 순수한 클로저 코드에서 매크로를 사용하는 것과 다르지 않습니다. 매크로는 호출시에 심볼을 생성하는 함수를 찾습니다. – noisesmith