Thanks very much Juan, that's some good study material for me. -A On Dec 18, 2012 10:45 PM, "juan.facorro" <juan.faco...@gmail.com> wrote:
> The macro sees it arguments as *symbols* and does not resolve to the > corresponding *var* until evaluation, so the value for the local *code* var > in the macro is actually the *symbol** generator.* > > The *eval-in* macro uses the *read-string* function to evaluate the code > you provide, this function expects a string but it's getting the* **symbol > ** generator* instead, since that's what the macro got as a first > argument. > > Here's a modified version of the *eval-in* macro, that delays the > evaluation of the call to *read-string*: > > (require '[clojure.pprint :as p]) > > (defmacro eval-in > [code ns] > `(do > (in-ns '~(symbol ns)) > (let [ret# (eval *(read-string ~code)*)] ; This line was changed > (in-ns '~(ns-name *ns*)) > ret#))) > > (p/pprint (macroexpand '(eval-in generator "another-ns"))) > > Here's the output: > > (do > (clojure.core/in-ns 'another-ns) > (clojure.core/let > [ret__1879__auto__ > (clojure.core/eval *(clojure.core/read-string generator)*)] ; The > unquoting of code resulted in the symbol generator > (clojure.core/in-ns 'test-eval) > ret__1879__auto__)) > > If you want to use a var as an argument for the code, you could resolve > the var before changing namespaces, delaying the read-string until the > forms evaluation: > > (ns another-ns) > > (defn X [w h] [w h]) > ;--------------------------- > (ns this-ns > (:require [clojure.pprint :as p])) > > (defmacro eval-in > [code ns] > `(let [code# ~code] > (in-ns '~(symbol ns)) > (let [ret# (eval (read-string code#))] > (in-ns '~(ns-name *ns*)) > ret#))) > > (def generator "(X 300 300)") > (p/pprint (eval-in generator another-ns)) > > Hope it helps, > > Juan > > > On Wednesday, December 19, 2012 1:13:00 AM UTC-3, nodename wrote: >> >> From yesterday: >> >> (defmacro eval-in >> "Eval a Clojure form in a different namespace and switch back to >> current namespace. >> >> Args: >> code - Clojure form as string >> ns - Target namespace as string" >> [code ns] >> `(do >> (in-ns '~(symbol ns)) >> (let [ret# (eval '~(read-string code))] >> (in-ns '~(ns-name *ns*)) >> ret#))) >> >> >> >> user=> (def generator "(X 400 400)") >> #'user/generator >> user=> (def image (eval-in generator "clevolution.version.version0-** >> 1-1")) >> CompilerException java.lang.ClassCastException: clojure.lang.Symbol >> cannot be cast to java.lang.String, compiling:(NO_SOURCE_PATH:1) >> >> user=> (def image (eval-in "(X 400 400)" "clevolution.version.version0-** >> 1-1")) >> #'user/image >> >> So it's OK to pass the explicit string but not the symbol. What am I not >> getting here? >> >> -A >> >> >> On Tue, Dec 18, 2012 at 12:48 AM, Alan Shaw <node...@gmail.com> wrote: >> >>> Now I do, and the macro worked! >>> I believe I have a problem using the macro from a function, but leaving >>> that for tomorrow. >>> >>> Thanks BG! >>> >>> -A >>> >>> >>> >>> On Tue, Dec 18, 2012 at 12:19 AM, Baishampayan Ghose >>> <b.g...@gmail.com>wrote: >>> >>>> Do you have target ns "clevolution.version.version0-**1-1" required? >>>> >>>> -BG >>>> >>>> On Tue, Dec 18, 2012 at 1:38 PM, Alan Shaw <node...@gmail.com> wrote: >>>> > BG, >>>> > The macro doesn't seem to do the trick. The function X is interned in >>>> the >>>> > target namespace, but: >>>> > >>>> > user=> (def image (eval-in "(X 400 400)" >>>> > "clevolution.version.version0-**1-1")) >>>> > CompilerException java.lang.RuntimeException: Unable to resolve >>>> symbol: X in >>>> > this context, compiling:(NO_SOURCE_PATH:1) >>>> > >>>> > >>>> > On Mon, Dec 17, 2012 at 11:53 PM, Alan Shaw <node...@gmail.com> >>>> wrote: >>>> >> >>>> >> Oh yes, the something.something is fixed so I can just prepend it, >>>> thanks. >>>> >> (Hadn't noticed your macro takes the ns as a string!) >>>> >> >>>> >> -A >>>> >> >>>> >> >>>> >> >>>> >> On Mon, Dec 17, 2012 at 11:47 PM, Baishampayan Ghose < >>>> b.g...@gmail.com> >>>> >> wrote: >>>> >>> >>>> >>> Alan, >>>> >>> >>>> >>> What you're asking for is to derive the ns "clojure.core" given only >>>> >>> "core". Not sure if that's possible. >>>> >>> >>>> >>> The namespace constitutes the whole dotted structure and not just >>>> the >>>> >>> last component, I am afraid. >>>> >>> >>>> >>> If the actual ns is something.something.version-0-**1-1, then you >>>> need >>>> >>> the string "something.something.version-**0-1-1" and not just >>>> >>> "version-0-1-1" [unless of course you have some other way of >>>> deriving >>>> >>> it from info that's embedded in _your_ code or structure thereof]. >>>> >>> >>>> >>> >>>> >>> -BG >>>> >>> >>>> >>> On Tue, Dec 18, 2012 at 1:10 PM, Alan Shaw <node...@gmail.com> >>>> wrote: >>>> >>> > Thanks BG, I'm trying that. >>>> >>> > But I don't think it addresses how to get from the string >>>> >>> > "version-0-1-1" to >>>> >>> > the namespace something.something.version-0-**1-1. How can I do >>>> that? >>>> >>> > >>>> >>> > -A >>>> >>> > >>>> >>> > >>>> >>> > >>>> >>> > On Mon, Dec 17, 2012 at 11:26 PM, Baishampayan Ghose >>>> >>> > <b.g...@gmail.com> >>>> >>> > wrote: >>>> >>> >> >>>> >>> >> Alan, >>>> >>> >> >>>> >>> >> Something like this might work for you - >>>> >>> >> >>>> >>> >> (defmacro eval-in >>>> >>> >> "Eval a Clojure form in a different namespace and switch back >>>> to >>>> >>> >> current namespace. >>>> >>> >> >>>> >>> >> Args: >>>> >>> >> code - Clojure form as string >>>> >>> >> ns - Target namespace as string" >>>> >>> >> [code ns] >>>> >>> >> `(do >>>> >>> >> (in-ns '~(symbol ns)) >>>> >>> >> (let [ret# (eval '~(read-string code))] >>>> >>> >> (in-ns '~(ns-name *ns*)) >>>> >>> >> ret#))) >>>> >>> >> >>>> >>> >> Warning - I haven't really tested this code. >>>> >>> >> >>>> >>> >> -BG >>>> >>> >> >>>> >>> >> On Tue, Dec 18, 2012 at 12:37 PM, Alan Shaw <node...@gmail.com> >>>> >>> >> wrote: >>>> >>> >> > Thanks, Las! >>>> >>> >> > >>>> >>> >> > Ok say I have a file in which there is string such as >>>> >>> >> > >>>> >>> >> > "(- (atan (bw-noise 902 2 0.7604615575402431 400 400)) >>>> >>> >> > (read-image-from-file >>>> >>> >> > \"images/Dawn_on_Callipygea.**png\"))" >>>> >>> >> > >>>> >>> >> > and another >>>> >>> >> > >>>> >>> >> > "version-0-0-1" >>>> >>> >> > >>>> >>> >> > and I have a namespace version-0-0-1 into which functions >>>> named atan >>>> >>> >> > etc. >>>> >>> >> > are all :referred. I want to evaluate the expression in that >>>> >>> >> > particular >>>> >>> >> > context, and not remain there when I'm done. >>>> >>> >> > >>>> >>> >> > -A >>>> >>> >> > >>>> >>> >> > >>>> >>> >> > >>>> >>> >> > On Mon, Dec 17, 2012 at 11:00 PM, László Török < >>>> ltor...@gmail.com> >>>> >>> >> > wrote: >>>> >>> >> >> >>>> >>> >> >> ah, sorry, it's a bit early for me >>>> >>> >> >> >>>> >>> >> >> (in-ns (ns-name user-ns)) >>>> >>> >> >> >>>> >>> >> >> if you could post a simple example for the second part of your >>>> >>> >> >> question >>>> >>> >> >> I >>>> >>> >> >> maybe able to help. >>>> >>> >> >> >>>> >>> >> >> Las >>>> >>> >> >> >>>> >>> >> >> Alan Shaw 2012. december 18., kedd napon a következőt írta: >>>> >>> >> >> >>>> >>> >> >>> Ah no, that puts me in a new user-ns namespace! Not what I >>>> wanted! >>>> >>> >> >>> >>>> >>> >> >>> >>>> >>> >> >>> On Mon, Dec 17, 2012 at 10:51 PM, László Török >>>> >>> >> >>> <ltor...@gmail.com> >>>> >>> >> >>> wrote: >>>> >>> >> >>>> >>>> >>> >> >>>> Try (in-ns 'user-ns) >>>> >>> >> >>>> >>>> >>> >> >>>> Las >>>> >>> >> >>>> >>>> >>> >> >>>> On Dec 18, 2012 7:50 AM, "Alan Shaw" <node...@gmail.com> >>>> wrote: >>>> >>> >> >>>>> >>>> >>> >> >>>>> user=> *ns* >>>> >>> >> >>>>> #<Namespace user> >>>> >>> >> >>>>> user=> (def user-ns *ns*) >>>> >>> >> >>>>> #'user/user-ns >>>> >>> >> >>>>> user=> user-ns >>>> >>> >> >>>>> #<Namespace user> >>>> >>> >> >>>>> user=> (in-ns user-ns) >>>> >>> >> >>>>> ClassCastException clojure.lang.Namespace cannot be cast to >>>> >>> >> >>>>> clojure.lang.Symbol clojure.lang.RT$1.invoke (RT.java:226) >>>> >>> >> >>>>> >>>> >>> >> >>>>> It appears I'm not understanding how namespaces are >>>> represented. >>>> >>> >> >>>>> >>>> >>> >> >>>>> Also, is it just wrong of me to want to remember a >>>> namespace I >>>> >>> >> >>>>> was >>>> >>> >> >>>>> working in and try to go back to it later? >>>> >>> >> >>>>> >>>> >>> >> >>>>> The slightly larger context is: I'm saving an s-expression >>>> with >>>> >>> >> >>>>> unqualified names in it into a file as a string. Also >>>> saving a >>>> >>> >> >>>>> string >>>> >>> >> >>>>> indicating the name of the environment in which that string >>>> >>> >> >>>>> should >>>> >>> >> >>>>> be (read >>>> >>> >> >>>>> and) eval'ed so that the names will resolve to the >>>> appropriate >>>> >>> >> >>>>> functions. >>>> >>> >> >>>>> Advice on managing this would be appreciated. >>>> >>> >> >>>>> >>>> >>> >> >>>>> -Alan Shaw >>>> >>> >> >>>>> >>>> >>> >> >>>>> -- >>>> >>> >> >>>>> You received this message because you are subscribed to the >>>> >>> >> >>>>> Google >>>> >>> >> >>>>> Groups "Clojure" group. >>>> >>> >> >>>>> To post to this group, send email to >>>> clo...@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+u...@**googlegroups.com >>>> >>> >> >>>>> For more options, visit this group at >>>> >>> >> >>>>> http://groups.google.com/**group/clojure?hl=en<http://groups.google.com/group/clojure?hl=en> >>>> >>> >> >>>> >>>> >>> >> >>>> -- >>>> >>> >> >>>> You received this message because you are subscribed to the >>>> >>> >> >>>> Google >>>> >>> >> >>>> Groups "Clojure" group. >>>> >>> >> >>>> To post to this group, send email to >>>> clo...@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+u...@**googlegroups.com >>>> >>> >> >>>> For more options, visit this group at >>>> >>> >> >>>> http://groups.google.com/**group/clojure?hl=en<http://groups.google.com/group/clojure?hl=en> >>>> >>> >> >>> >>>> >>> >> >>> >>>> >>> >> >>> -- >>>> >>> >> >>> You received this message because you are subscribed to the >>>> Google >>>> >>> >> >>> Groups "Clojure" group. >>>> >>> >> >>> To post to this group, send email to clo...@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+u...@**googlegroups.com >>>> >>> >> >>> For more options, visit this group at >>>> >>> >> >>> http://groups.google.com/**group/clojure?hl=en<http://groups.google.com/group/clojure?hl=en> >>>> >>> >> >> >>>> >>> >> >> >>>> >>> >> >> >>>> >>> >> >> -- >>>> >>> >> >> László Török >>>> >>> >> >> >>>> >>> >> >> -- >>>> >>> >> >> You received this message because you are subscribed to the >>>> Google >>>> >>> >> >> Groups "Clojure" group. >>>> >>> >> >> To post to this group, send email to clo...@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+u...@**googlegroups.com >>>> >>> >> >> For more options, visit this group at >>>> >>> >> >> http://groups.google.com/**group/clojure?hl=en<http://groups.google.com/group/clojure?hl=en> >>>> >>> >> > >>>> >>> >> > >>>> >>> >> > -- >>>> >>> >> > You received this message because you are subscribed to the >>>> Google >>>> >>> >> > Groups "Clojure" group. >>>> >>> >> > To post to this group, send email to clo...@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+u...@**googlegroups.com >>>> >>> >> > For more options, visit this group at >>>> >>> >> > http://groups.google.com/**group/clojure?hl=en<http://groups.google.com/group/clojure?hl=en> >>>> >>> >> >>>> >>> >> >>>> >>> >> >>>> >>> >> -- >>>> >>> >> Baishampayan Ghose >>>> >>> >> b.ghose at gmail.com >>>> >>> >> >>>> >>> >> -- >>>> >>> >> You received this message because you are subscribed to the >>>> Google >>>> >>> >> Groups "Clojure" group. >>>> >>> >> To post to this group, send email to clo...@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+u...@**googlegroups.com >>>> >>> >> For more options, visit this group at >>>> >>> >> http://groups.google.com/**group/clojure?hl=en<http://groups.google.com/group/clojure?hl=en> >>>> >>> > >>>> >>> > >>>> >>> > -- >>>> >>> > You received this message because you are subscribed to the Google >>>> >>> > Groups "Clojure" group. >>>> >>> > To post to this group, send email to clo...@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+u...@**googlegroups.com >>>> >>> > For more options, visit this group at >>>> >>> > http://groups.google.com/**group/clojure?hl=en<http://groups.google.com/group/clojure?hl=en> >>>> >>> >>>> >>> >>>> >>> >>>> >>> -- >>>> >>> Baishampayan Ghose >>>> >>> b.ghose at gmail.com >>>> >>> >>>> >>> -- >>>> >>> You received this message because you are subscribed to the Google >>>> >>> Groups "Clojure" group. >>>> >>> To post to this group, send email to clo...@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+u...@**googlegroups.com >>>> >>> For more options, visit this group at >>>> >>> http://groups.google.com/**group/clojure?hl=en<http://groups.google.com/group/clojure?hl=en> >>>> >> >>>> >> >>>> > >>>> > -- >>>> > You received this message because you are subscribed to the Google >>>> > Groups "Clojure" group. >>>> > To post to this group, send email to clo...@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+u...@**googlegroups.com >>>> > For more options, visit this group at >>>> > http://groups.google.com/**group/clojure?hl=en<http://groups.google.com/group/clojure?hl=en> >>>> >>>> >>>> >>>> -- >>>> Baishampayan Ghose >>>> b.ghose at gmail.com >>>> >>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "Clojure" group. >>>> To post to this group, send email to clo...@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+u...@**googlegroups.com >>>> For more options, visit this group at >>>> http://groups.google.com/**group/clojure?hl=en<http://groups.google.com/group/clojure?hl=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 > 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 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