I have wondered how clojurescript compiler processes macros.
So I tested as following:
I made dirs and files as below.
guruma@mac cljs $ tree .
.
├── build.clj
├── cljs.jar
└── src
└── foo
├── core.cljs
└── macro.cljc
2 directories, 4 files
I downloaded cljs.jar using curl.
guruma@mac cljs $ curl -LOk
https://github.com/clojure/clojurescript/releases/download/r1.9.908/cljs.jar
And I made build.clj, core.cljs and macro.cljc as below.
build.clj
(require 'cljs.build.api)
(cljs.build.api/build
"./src"
{:main 'core
:output-to "out/main.js"})
core.cljs
(ns foo.core
(:require-macros [macro :refer [log]]))
(enable-console-print!)
(log "hello, world")
core.cljs require macro.cljc and use a macro 'log'.
macro.cljc
(ns foo.macro)
(defn now []
#?(:clj (System/currentTimeMillis)
:cljs (js/Date.now)))
(defmacro log [x]
`(println "log[" (now) "]: " ~x))
macro.cljc defines a macro 'log'.
And there is the helper function 'now' that has read-conditionals in its
body.
And compile.
guruma@mac cljs $ java -cp cljs.jar:src clojure.main build.clj
guruma@mac cljs $
No error and no warning.
And I modified macro.cljc as below
macro.cljc modified
(ns foo.macro)
#?(:clj (defn now [] ; <== modified
(System/currentTimeMillis)))
(defmacro log [x]
`(println "log[" (now) "]: " ~x))
the function 'now' is in read-conditional.
And compile.
guruma@mac cljs $ java -cp cljs.jar:src clojure.main build.clj
WARNING: Use of undeclared Var foo.macro/now at line 6 ./src/foo/core.cljs
Here is a warning and it is out of question because there is no definition
of the function 'now' for clojurescript to be used for runtime.
But what i can't understand is why there is no warning when compiling
unmodified macro.cljc.
My questions are:
1) Does clojurescript compiler load macro twice for :clj and :cljs in
read-conditional when handling :require-macros?
2) How does clojurescript compiler resolve the symbol 'now' defined in
macro.cljc?
Thanks a lot in advance.
--
Note that posts from new members are moderated - please be patient with your
first post.
---
You received this message because you are subscribed to the Google Groups
"ClojureScript" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/clojurescript.