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<javascript:> > > 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<javascript:> >> > 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<javascript:>> >>> 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<javascript:>> >>> 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 <javascript:>> >>> >> 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<javascript:>> >>> 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 <javascript:>> >>> >>> > 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<javascript:> >>> > >>> >>> >> 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 <javascript:>> >>> >>> >> > 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 <javascript:>> >>> >>> >> >>> wrote: >>> >>> >> >>>> >>> >>> >> >>>> Try (in-ns 'user-ns) >>> >>> >> >>>> >>> >>> >> >>>> Las >>> >>> >> >>>> >>> >>> >> >>>> On Dec 18, 2012 7:50 AM, "Alan Shaw" >>> >>> >> >>>> <node...@gmail.com<javascript:>> >>> 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 <javascript:> >>> >>> >> >>>>> 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 <javascript:> >>> >>> >> >>>>> 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 >>> >>> >> >>>> clo...@googlegroups.com<javascript:> >>> >>> >> >>>> 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 <javascript:> >>> >>> >> >>>> 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 >>> >>> >> >>> clo...@googlegroups.com<javascript:> >>> >>> >> >>> 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 <javascript:> >>> >>> >> >>> For more options, visit this group at >>> >>> >> >>> 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<javascript:> >>> >>> >> >> 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 <javascript:> >>> >>> >> >> 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 >>> >>> >> > clo...@googlegroups.com<javascript:> >>> >>> >> > 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 <javascript:> >>> >>> >> > For more options, visit this group at >>> >>> >> > 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<javascript:> >>> >>> >> 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 <javascript:> >>> >>> >> 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 >>> >>> > clo...@googlegroups.com<javascript:> >>> >>> > 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 <javascript:> >>> >>> > For more options, visit this group at >>> >>> > 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<javascript:> >>> >>> 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 <javascript:> >>> >>> 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 clo...@googlegroups.com<javascript:> >>> > 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 <javascript:> >>> > For more options, visit this group at >>> > 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<javascript:> >>> 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 <javascript:> >>> 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