2015-04-28 20 views
8

Mam clojurescript z powodzeniem importując makra z innych przestrzeni nazw. Zastanawiam się jednak, czy jednolita konstrukcja jest/powinna być możliwa przy clojure 1.7, tak aby można było zdefiniować i wykorzystać makro. To, co próbowałem, nie działa, ale być może brakowało mi jakiegoś szczegółu.może cljc definicje pojedynczych plików makro do pracy z clojurescript?

(ns cljc.core) 

#?(:cljs 
(enable-console-print!)) 

#?(:clj 
(defmacro list-macro [x y] 
    `(list ~x ~y))) 

(defn foo [a] 
    (println (list-macro a a))) 

(foo :a) 

Ta postać nie z list-macro jest niezdefiniowana przy kompilacji cljs; jeśli usuwam: clj guard around makro-listy, to defmacro jest niezdefiniowany w kompilacji cljs. Czy istnieje sposób?

+3

Nie. Makra ClojureScript są nadal Clojure. Robią swój czas kompilacji pracy - kiedy kod ClojureScript jest skompilowany do JavaScript. Muszą więc najpierw zostać skompilowane (od Clojure do JVM), zanim nastąpi jakakolwiek kompilacja ClojureScript. – muhuk

Odpowiedz

10

Tak, istnieje sposób na budowę pojedynczego pliku.

(ns cljc.core 
    #?(:cljs (:require-macros [cljc.core :refer [list-macro]]))) 

#?(:clj 
(defmacro list-macro [x y] 
;; ... 

Zakłada się, że jedna z kolejnych wersji kompilatora CLJS wykona import automatycznie.

+0

Myślę, że autor chce napisać 'defmacro', nie wymaga – zarkone

+1

Tak. Ale musi napisać ': require-macros', aby użyć makra w ClojureScript. To jest odpowiedź na to, o co prosił. –

+0

Sprytny sposób na wymuszenie kompilacji CLJ po drodze! Mam nadzieję, że rzeczywiście pewnego dnia zadziała automatycznie, przynajmniej w pliku cljc. – ben