могут ли однофайловые макроопределения cljc работать с clojurescript?

У меня есть clojurescript, который успешно импортирует макросы из других пространств имен. Но мне интересно, возможна ли/должна ли быть однофайловая конструкция с clojure 1.7, чтобы можно было определить и использовать макрос. То, что я пробовал, не работает, но, возможно, я где-то упустил какую-то деталь.

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

Эта форма дает сбой, поскольку list-macro не определено при компиляции cljs; если я удалю защиту :clj вокруг макроса списка, то defmacro не будет определен в компиляции cljs. Есть ли способ?


person ben    schedule 28.04.2015    source источник
comment
Нет. Макросы ClojureScript по-прежнему принадлежат Clojure. Они выполняют свою работу во время компиляции — когда код ClojureScript компилируется в JavaScript. Поэтому их необходимо сначала скомпилировать (из Clojure в JVM), прежде чем будет выполняться любая компиляция ClojureScript.   -  person muhuk    schedule 28.04.2015


Ответы (1)


Да, есть способ построения одного файла.

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

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

Предполагается, что одна из следующих версий компилятора CLJS сделает импорт автоматически.

person Leon Grapenthin    schedule 28.04.2015
comment
я думаю, что автор хочет написать defmacro, а не требовать - person zarkone; 29.04.2015
comment
да. Но ему нужно написать :require-macros, чтобы использовать макрос в ClojureScript. Это ответ на то, что он просил. - person Leon Grapenthin; 29.04.2015
comment
Умный способ форсировать компиляцию CLJ в первую очередь! Надеюсь, однажды он действительно будет работать автоматически, по крайней мере, в файле cljc. - person ben; 29.04.2015