yep, you do have a point the thing is, that at runtime it's nolonger known that symbol y points to symbol x, it's only known that y is a function (just like x is, but without the connection between them), so I really don't see how to actually get the var of the function that some y points-to eventually
anyway I'm just going to stop here, but this is as far as i got: => (defmacro get-lexical-asvar [q] (let [ oem (zipmap (keys &env) (vals &env)) ] (loop [ yy (second (find oem q)) expr (.init yy) ] (cond (instance? clojure.lang.Compiler$VarExpr expr) `~(.var expr) :else (do (assert (instance? clojure.lang.Compiler$LocalBindingExpr expr)) `~(.var (.init (.b expr))) ; (recur (.init (second (find oem yy)))) ) ) ) ) ) #'runtime.q/get-lexical-asvar => (let [notworking (#(do assoc)) x assoc y x z y] (str (get-lexical-asvar y)) ) "#'clojure.core/assoc" but since x will have to eval at runtime, and at runtime y and z will have the same value as x... without the visible connections between them (I think, unless a macro is keeping them somehow, maybe add metadata?) then I don't see how I could pass z and get the var of assoc ... but for me this seems to be quite a necessary concept, but since I don't know clojure much at all, perhaps there is an idiomatic way already? anyone? On Sun, Mar 3, 2013 at 1:47 PM, Dave Sann <daves...@gmail.com> wrote: > because it is a macro, I am not sure it can work for y. (my macro skills > are limited) > > but in the general case where the data is not available at compile time. I > am not sure macros will help. > > > On Sunday, 3 March 2013 23:44:56 UTC+11, AtKaaZ wrote: > >> oo, what do we have here? >> => (defmacro get-lexical-asvar [q] >> (let [ >> oem (zipmap (keys &env) (vals &env)) >> zz (.var (.init (second (find oem q)))) >> ] >> `~zz >> ) >> ) >> #'runtime.q/get-lexical-asvar >> => (let [x assoc >> y x] >> (str (get-lexical-asvar x)) >> ) >> "#'clojure.core/assoc" >> >> but it doesn't (yeT) work for y >> >> >> On Sun, Mar 3, 2013 at 1:27 PM, AtKaaZ <atk...@gmail.com> wrote: >> >>> ok you're right, it's impossible to get the var since those x and y are >>> already resolved to the function, and multiple vars could point to the same >>> function anyway. >>> >>> => (let [x assoc >>> y x] >>> (get-lexical-env) >>> ) >>> {x #<core$assoc clojure.core$assoc@35fcd90c>, y #<core$assoc >>> clojure.core$assoc@35fcd90c>} >>> >>> for consistency, ignore the following: >>> ;the following is inspired from http://blog.jayfields.com/** >>> 2011/02/clojure-and.html<http://blog.jayfields.com/2011/02/clojure-and.html> >>> (defmacro get-lexical-env [] >>> " >>> => (let [a 1 b (+ 1 2)] >>> (let [c (do \"a\" \"b\")] >>> (q/get-lexical-env) >>> ) >>> ) >>> {a 1, b 3, c \"b\"} >>> " >>> (let [envkeys (keys &env)] >>> `(zipmap (quote ~envkeys) (list ~@envkeys)) >>> ) >>> ) >>> >>> (defmacro show-lexical-env [] >>> `(clojure.pprint/pprint (get-lexical-env)) >>> ) >>> >>> >>> On Sun, Mar 3, 2013 at 1:05 PM, AtKaaZ <atk...@gmail.com> wrote: >>> >>>> that's true but I thought you meant in general >>>> basically, I'm looking for a way to get the var... ie. >>>> => (let [x assoc >>>> y x] >>>> *(var y)* >>>> ) >>>> CompilerException java.lang.RuntimeException: Unable to resolve var: y >>>> in this context, compiling:(NO_SOURCE_PATH:3:3) >>>> >>>> => (let [x assoc >>>> y x] >>>> y >>>> ) >>>> #<core$assoc clojure.core$assoc@35fcd90c> >>>> => (var assoc) >>>> #'clojure.core/assoc >>>> >>>> >>>> something that can replace that (var y) with something that actually >>>> gets the var that y resolves to. >>>> >>>> >>>> >>>> On Sun, Mar 3, 2013 at 12:58 PM, Dave Sann <dave...@gmail.com> wrote: >>>> >>>>> I think, that will only work if you do it directly. >>>>> >>>>> It will not work in the example I gave. >>>>> >>>>> Dave >>>>> >>>>> >>>>> On Sunday, 3 March 2013 22:43:14 UTC+11, AtKaaZ wrote: >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> On Sun, Mar 3, 2013 at 12:21 PM, Dave Sann <dave...@gmail.com> wrote: >>>>>> >>>>>>> This may be a question for clojure dev >>>>>>> >>>>>>> I find myself wanting to be able to print data-structures containing >>>>>>> resolvable functions >>>>>>> >>>>>>> e.g. >>>>>>> >>>>>>> (let [x assoc] (str [x :a :b])) >>>>>>> >>>>>>> would be: >>>>>>> >>>>>>> "[#fn clojure.core/assoc :a :b]" >>>>>>> >>>>>>> or similar, rather than the current: >>>>>>> >>>>>>> "[#<core$assoc clojure.core$assoc@6d289e48> :a :b]" >>>>>>> >>>>>>> which is unreadable. >>>>>>> >>>>>>> I can read this tag very easily, using the data-reader >>>>>>> >>>>>>> {fn resolve} or, >>>>>>> >>>>>>> (set! *data-readers* {'fn resolve}) >>>>>>> >>>>>>> >>>>>>> >>>>>>> But I don't know of any way to get the name and namespace of a >>>>>>> function to write it out. >>>>>>> >>>>>> Did you mean this? >>>>>> => (meta #'assoc) >>>>>> {:ns #<Namespace clojure.core>, :name assoc, :arglists ([map key val] >>>>>> [map key val & kvs]), :column 1, :added "1.0", :static true, :doc >>>>>> "assoc[iate]. When applied to a map, returns a new map of the\n same >>>>>> (hashed/sorted) type, that contains the mapping of key(s) to\n val(s). >>>>>> When applied to a vector, returns a new vector that\n contains val at >>>>>> index. Note - index must be <= (count vector).", :line 177, :file >>>>>> "clojure/core.clj"} >>>>>> >>>>>> >>>>>>> I think this is not possible at the moment. >>>>>>> >>>>>>> >>>>>>> Anyone? >>>>>>> >>>>>>> Thanks >>>>>>> >>>>>>> Dave >>>>>>> >>>>>>> -- >>>>>>> -- >>>>>>> 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 unsubscribe from this group and stop receiving emails from it, >>>>>>> send an email to clojure+u...@**googlegroups.com. >>>>>>> >>>>>>> For more options, visit >>>>>>> https://groups.google.com/**grou**ps/opt_out<https://groups.google.com/groups/opt_out> >>>>>>> . >>>>>>> >>>>>>> >>>>>>> >>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> Please correct me if I'm wrong or incomplete, >>>>>> even if you think I'll subconsciously hate it. >>>>>> >>>>>> -- >>>>> -- >>>>> 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 unsubscribe from this group and stop receiving emails from it, send >>>>> an email to clojure+u...@**googlegroups.com. >>>>> For more options, visit >>>>> https://groups.google.com/**groups/opt_out<https://groups.google.com/groups/opt_out> >>>>> . >>>>> >>>>> >>>>> >>>> >>>> >>>> >>>> -- >>>> Please correct me if I'm wrong or incomplete, >>>> even if you think I'll subconsciously hate it. >>>> >>>> >>> >>> >>> -- >>> Please correct me if I'm wrong or incomplete, >>> even if you think I'll subconsciously hate it. >>> >>> >> >> >> -- >> Please correct me if I'm wrong or incomplete, >> even if you think I'll subconsciously hate it. >> >> -- > -- > 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 unsubscribe from this group and stop receiving emails from it, send an > email to clojure+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/groups/opt_out. > > > -- Please correct me if I'm wrong or incomplete, even if you think I'll subconsciously hate it. -- -- 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 unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/groups/opt_out.