Please forgive about this defn! macro, it does not seem to play well in
practice.

I now share Konrad's thoughts : I don't know if what he want is feasible
without changes in clojure, or use of clojure non-public APIs.

2009/3/3 Laurent PETIT <laurent.pe...@gmail.com>

> 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
-~----------~----~----~----~------~----~------~--~---

Reply via email to