Now that I rethink about it, wouldn't this version using eval be less than ideal as far as AOT compilation is concerned ?
2009/3/3 Laurent PETIT <laurent.pe...@gmail.com> > So there we are with a version of defn, which I called defn! because it is > even more agressive than defn in its side effects, that could solve your > problem : > > (defmacro defn! > "Like defn, but first ensures that if name is bound to something (e.g. > the name of a function > in a 'used' or 'required' namespace, it is first unbound)." > [name & body] > `(do > (clojure.core/ns-unmap *ns* (quote ~name)) > (eval (quote (clojure.core/defn ~name ~...@body))))) > > I chose to use eval, even if it's not the usual recommended way, because I > really wanted to not duplicate the logic in defn regarding definition of > multiple arity functions, meta data, ... > > But I'm not sure it is correct to have twice ~name in the macro expansion. > I thought that as name is expected to be the name for a symbol without > evaluation (as is required for the name in defn), I could do this ? > > If you find this interesting, please feel free to add it to > clojure-contrib. > > I think the same thing could be done for defmacro (defmacro!), ... and > other defXYZ.. functions/macros as well .. ? > > HTH, > > -- > Laurent > > > 2009/3/3 Christophe Grand <christo...@cgrand.net> > > >> Konrad Hinsen a écrit : >> > On 03.03.2009, at 00:53, Laurent PETIT wrote: >> > >> > >> >> I'm able to do that from the REPL when done one by one : >> >> (clojure.core/ns-unmap *ns* (quote filter)) >> >> (clojure.core/defn filter [] "oh my!") >> >> >> >> thus correctly redefining the binding of filter for the rest of use >> >> by the ns >> >> >> >> But I can't manage to get it work from a macro (indeed not even >> >> when directly called inside a do) : >> >> >> >> (do (clojure.core/ns-unmap *ns* (quote filter)) (clojure.core/defn >> >> filter [] "my map!")) >> >> >> >> What is wrong with me ? (Something with def I still haven't >> >> understood, I think) >> >> >> > >> > I can only confirm your observation, and say that I don't understand >> > it either! >> > >> In the first case, when you enter the second statement at the repl, >> filter is unmapped already so the compiler understands that it must >> create a var and intern it as my-ns/filter. >> In the second case, both statements are bundled in one expression: when >> the expression is compiled filter is still mapped in the current ns and >> the compiler refuses to compile the def form. >> >> Adding an eval can make that works: >> >> (do >> (clojure.core/ns-unmap *ns* (quote filter)) >> (eval '(clojure.core/defn filter [] "my map!"))) >> >> >> but it may be simpler to explore doing something like this: >> >> (do >> (clojure.core/ns-unmap *ns* (quote filter)) >> (clojure.lang.Var/intern *ns* 'filter (fn[] "my map!"))) >> >> >> Christophe >> >> -- >> Professional: http://cgrand.net/ (fr) >> On Clojure: http://clj-me.blogspot.com/ (en) >> >> >> >> >> >> > > --~--~---------~--~----~------------~-------~--~----~ 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 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 -~----------~----~----~----~------~----~------~--~---