I have a problem with `def` in macros. I'd like to create a bunch of following definitions:
(def foo "FOO")
So I wrote a macro:
user=> (defmacro def-stuff [v] `(def (symbol ~v) (clojure.string/upper-case ~v)))
#'user/def-stuff
And I'd like to do map this macro over a vector of strings:
user=> (map (fn [n] (def-stuff n)) ["foo" "bar" "baz"])
Syntax error compiling def at (REPL:1:14).
First argument to def must be a Symbol
A little check indicates that everything should be fine:
user=> (symbol? (symbol "foo"))
true
but it is not:
user=> (def (symbol "foo") "FOO")
Syntax error compiling def at (REPL:1:1).
First argument to def must be a Symbol
???
Interestingly enough:
user=> (defmacro def-stuff [v] `(def v (clojure.string/upper-case ~v)))
#'user/def-stuff
user=> (map (fn [n] (def-stuff n)) ["foo" "bar" "baz"])
(#'user/v #'user/v #'user/v)
Strangely enough a `v` gets (re)defined.
To me it looks like the lexical-binding of macro-parameters is ignored if there's a `(def <macro-param> ...)` inside this macro.
Can anybody explain what's going on here please? Thanks.