Reader macros are evaluated at read time, not macroexpansion time. Read 
time happens during reading - the process in which the characters in a file 
are read into the Lisp forms Clojure supports. Therefore ^:private is not 
syntax which can be manipulated in a macro, because by the point the macro 
is evaluated that form is no longer present. 

Check out the source for defn- (you can find it in a REPL by calling 
(clojure.repl/source defn-)

(defmacro defn-
  "same as defn, yielding non-public def"
  {:added "1.0"}
  [name & decls]
  (list* `defn (with-meta name (assoc (meta name) :private true)) decls))

(defmacro def-
  "same as def, yielding non-public def"
  ([name] `(def- ~name nil))
  ([name expr]
   (list `def (with-meta name (assoc (meta name) :private true)) expr)))
  

On Thursday, May 7, 2015 at 10:12:39 AM UTC-4, Stig Brautaset wrote:
>
> Is it because the def form can also be ^:dynamic?
>
> At any rate, I did an attempt at my first macro to create a (def- ...) 
> form, but it doesn't seem to work. Can you not attach metadata in a macro?
>
> (defmacro def-
>   "Why (defn- private-fn ...) but (def ^:private var ...)?"
>   [sym & body]
>   `(def ^:private ~sym ~@body))
>
> ;; => #'user/def-
> user> (macroexpand '(def- blah "foo bar quux"))
> ;; => (def blah "foo bar quux")
>
> Stig
>

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to