On Thu 8 May 2014 at 05:34:19AM -0700, Pascal Germroth wrote:
> (def f1 "doc" ^{:x 1} (partial inc))
> (meta f1) ; nil, unexpected
> (meta #'f1) ; contains :doc, but not :x, as expected
The definition of partial is:
(defn partial
([f] f)
([f arg1]
(fn [& args] (apply f arg1 args)))
…)
So it just calls out to fn. fn is a macro, and returns metadata on
&form, i.e. the metadata on the literal (fn) form itself. Your ^{:x 1}
therefore is lost.
> (def f2 "doc" ^{:x 2} #(inc %))
> (meta f2) ; {:x 2}, as expected
> (meta #'f2) ; contains :doc, but not :x, as expected
#() returns an instance of FnReader at read-time, so metadata can be
attached as usual.
> (def f3 "doc" (with-meta (partial inc) {:x 3}))
> (meta f3) ; {:x 3}
> (def f4 "doc" (with-meta #(inc %) {:x 4}))
> (meta f4) ; {:x 4}
with-meta calls .withMeta on its argument at runtime, so everything that
implements IObj works.
What's interesting is that
(meta ^:x inc) ; -> nil
does not work. I suppose this is because the reader cannot know if the
symbol `inc` represents an object that implements IMeta.
Hope this is accurate.
guns
pgpAjaltFssRA.pgp
Description: PGP signature
