Thanks again. This version is easier for my non-macro brain to follow. -A
On Wed, Dec 19, 2012 at 8:58 AM, juan.facorro <juan.faco...@gmail.com>wrote: > The following example shows an implementation of *eval-in* as a function. > > There are a some *println* added to show the namespace where the code is > running at each point. > > ;;-------------------- > (ns another-ns) > > (defn X [w h] > {:w w :h h}) > ;;-------------------- > (ns this-ns) > > (defn eval-in [code ns] > (let [orig-ns *ns*] > (println *ns*) ; we are in this-ns > (in-ns (symbol ns)) > (println *ns* (resolve *ns* 'X)) ; not anymore, now it's another-ns > (let [ret (eval (read-string code))] > (println *ns* (resolve *ns* 'X) ret) ; it's still another-ns but now > we have the return value > (in-ns (ns-name orig-ns)) > (println *ns*) ; back to this-ns > ret))) > > (def generator "(X 20 20)") > (println (eval-in generator "another-ns")) > (println (eval-in "(X 20 20)" "another-ns")) > ;;-------------------- > > Cheers, > > Juan > > > On Wednesday, December 19, 2012 4:22:58 AM UTC-3, nodename wrote: > >> As an aside, I'm curious about whether this could have been implemented >> without a macro. >> >> -A >> On Dec 18, 2012 11:06 PM, "Alan Shaw" <node...@gmail.com> wrote: >> >>> Thanks very much Juan, that's some good study material for me. >>> >>> -A >>> On Dec 18, 2012 10:45 PM, "juan.facorro" <juan.f...@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.**pn**g\"))" >>>>>>> >>> >> > >>>>>>> >>> >> > 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 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