2015-04-28 32 views
8

Ho clojurescript che importa con successo macro da altri namespace. Ma mi chiedo se una costruzione a file singolo sia/dovrebbe essere possibile con clojure 1.7, in modo tale che una macro possa essere definita e utilizzata. Quello che ho provato non funziona, ma forse ho perso un dettaglio da qualche parte.può cljc definizioni di macro a file singolo per funzionare con 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) 

Questa forma viene a mancare con list-macro essere undefined durante la compilazione cljs; se rimuovo: clj guard around list-macro, defmacro non è definito nella compilation cljs. C'è un modo?

+3

No. Le macro ClojureScript sono ancora Clojure. Fanno il loro lavoro per compilare il tempo - quando il codice ClojureScript viene compilato su JavaScript. Quindi devono essere compilati (da Clojure in JVM) prima di eseguire qualsiasi compilazione ClojureScript. – muhuk

risposta

10

Sì, esiste un modo per una singola costruzione di file.

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

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

Assumibilmente una delle prossime versioni del compilatore CLJS eseguirà l'importazione automaticamente.

+0

Penso che l'autore voglia scrivere 'defmacro', non richiedere – zarkone

+1

Sì. Ma ha bisogno di scrivere ': require-macros' per usare la macro in ClojureScript. Questa è la risposta a ciò che ha chiesto. –

+0

Modo intelligente per forzare la compilazione CLJ per la prima volta! Spero che un giorno funzionerà automaticamente, almeno quando si trova in un file cljc. – ben