> (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 <[email protected]> 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 [email protected]
> Note that posts from new members are moderated - please be patient with your
> first post.
> To unsubscribe from this group, send email to
> [email protected]
> 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 [email protected].
> 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 [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
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 [email protected].
For more options, visit https://groups.google.com/groups/opt_out.