2015-04-28 5 views
8

Ich habe Clojurescript erfolgreich importiert Makros aus anderen Namespaces. Aber ich frage mich, ob mit clojure 1.7 eine Single-File-Konstruktion möglich ist/sollte, so dass ein Makro definiert und verwendet werden kann. Was ich versucht habe funktioniert nicht, aber vielleicht habe ich irgendwo ein Detail übersehen.können Cljc Single-File-Makrodefinitionen mit Clojurescript arbeiten?

(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) 

Diese Form nicht mit list-macro nicht definiert wird, wenn cljs kompilieren; Wenn ich den clj-Wächter um list-macro entferne, dann ist defmacro innerhalb der cljs-Kompilierung nicht definiert. Gibt es einen Weg?

+3

Nein. ClojureScript Makros sind immer noch Clojure. Sie machen ihre Arbeit kompilieren Zeit - wenn ClojureScript-Code zu JavaScript kompiliert wird. Daher müssen sie zuerst kompiliert werden (von Clojure zu JVM), bevor irgendeine ClojureScript-Kompilierung stattfindet. – muhuk

Antwort

10

Ja, es gibt eine Möglichkeit für eine einzelne Dateikonstruktion.

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

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

Vermutlich wird eine der nächsten CLJS-Compiler-Versionen den Import automatisch durchführen.

+0

Ich denke, dass der Autor 'defmacro' schreiben möchte, nicht – zarkone

+1

Ja. Aber er muss ': require-macros' schreiben, um das Makro in ClojureScript zu verwenden. Dies ist die Antwort auf das, wonach er gefragt hat. –

+0

Cleverer Weg, CLJ Compilation zuerst auf dem Weg zu erzwingen! Hoffentlich klappt es in der Tat eines Tages automatisch, zumindest in einer cljc-Datei. – ben