> (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.

Reply via email to