Macros en ClojureScript

Muy útiles pero más farragosas de usar que en Clojure.

Principales diferencias pueden verse en la web del proyecto.

Fundamental:

  • No pueden definirse en cljs
  • Han de definirse se cljc. También pueden en clj, pero preferible el primero por mi experiencia para trabajar luego con CIDER.
  • No pueden probarse en el mismo archivo donde se han definido, por la necesidad de necesitar primero compilación en JVM y luego ejecución en el runtime de javascript.
  • Igual en el REPL, no podemos cargar el ns donde se definen y probarlas. Hemos de hacer un require desde un cljs, y cargando este ns secundario, ejecutar las macros en el REPL desde él.
  • No pueden contener código que vaya a ejecutarse de javascript, para poder compilarse en la JVM.

Podemos usar tanto macroexpand-1 como macroexpand, pero clojure.walk/macroexpand-all no está disponible.