Guru, I'm not sure. Are you running it exactly the same way? If you did...
(def y 1) (def f (fn [x] (+ x y))) ...then I think that would result in two const fields instead, because it stores the var #'y as a static field and calls getRawRoot on it at runtime. Otherwise I'm not sure. On 26 November 2013 17:11, Guru Devanla <grd...@gmail.com> wrote: > Hi Jamie, > > Thats interesting. How do I not let the compiler not optimize away the fact > that y refers to the constant. When I run your program I have two constant > fields defined rather than 'y. Am I missing something. > > Thanks > Guru > > > On Tue, Nov 26, 2013 at 6:16 AM, Jamie Brandon > <ja...@scattered-thoughts.net> wrote: >> >> > (def f (let [y 1] (fn [x] (+ x y)))) >> >> Let's have a look inside. >> >> > (require '[no.disassemble :refer [disassemble]]) >> > (println (disassemble f)) >> // Compiled from /home/jamie/strucjure/src/strucjure.clj (version 1.5 >> : 49.0, super bit) >> public final class strucjure$fn__5589$fn__5590 extends >> clojure.lang.AFunction { >> >> // Field descriptor #7 Lclojure/lang/Var; >> public static final clojure.lang.Var const__0; >> >> // Field descriptor #25 Lclojure/lang/IPersistentMap; >> final clojure.lang.IPersistentMap __meta; >> >> // Field descriptor #27 J >> long y; >> .... >> >> So there is the field you want. >> >> > (.y f) >> java.lang.IllegalArgumentException: No matching field found: y for >> class strucjure$eval5552$fn__5553 Reflector.java:271 >> clojure.lang.Reflector.getInstanceField Reflector.java:300 >> clojure.lang.Reflector.invokeNoArgInstanceMember >> /home/jamie/strucjure/src/strucjure.clj:21 strucjure/eval5556 >> >> Humbug. >> >> > (require '[clojure.reflect :refer [reflect]]) >> > (reflect f) >> java.lang.ClassNotFoundException: strucjure$eval5552$fn__5553 >> >> Interesting... I would love to know why that is the case. >> >> > (into [] (.. f getClass getDeclaredFields)) >> >> [#<Field public static final clojure.lang.Var >> strucjure$fn__5589$fn__5590.const__0> #<Field final >> clojure.lang.IPersistentMap strucjure$fn__5589$fn__5590.__meta> >> #<Field long strucjure$fn__5589$fn__5590.y>] >> >> > (defn get-field [instance field-name] >> (let [field (first (filter #(= field-name (.getName %)) (.. instance >> getClass getDeclaredFields)))] >> (.setAccessible field true) >> (.get field instance))) >> > (get-field f "y") >> 1 >> >> Success! And just for fun: >> >> > (def f2 (strucjure$fn__5589$fn__5590 7)) >> > (f2 1) >> 8 >> >> I hope that helps. Now the more interesting question is why you would >> want to do that... >> >> >> On 21 November 2013 18:14, henry w <henryw...@gmail.com> wrote: >> > Say you have a function created like this: >> > >> > (fn [x] (+ x y)) >> > >> > and then you have a reference to an instance of this function, is there >> > some >> > way to use the function reference to access the list '(fn [x] (+ x y)), >> > including the symbol 'y' (such that you could dereference 'y' and get >> > its >> > value)? The source function is not the right thing and so far googling >> > hasn't got me the answer. >> > >> > Thanks >> > >> > -- >> > -- >> > 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. >> >> -- >> -- >> 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. > > > -- > -- > 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. -- -- 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.