Additionally, we can make the chain into a loop.

(defn f1 [] 42)
(def f2 #'f1)
(def f3 #'f2)
(def f1 #'f3)

(f3) ==> stack overflow

On Sunday, 26 May 2013 18:18:57 UTC-4, JvJ wrote:
>
> Actually, I spoke WAY too soon.
>
> It looks like it has to do with the way that Var is cast to IFn.
>
>
> https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/Var.java
>
> Check out lines 391 and 410.  When invoked, the result of fn() is invoked. 
>  fn() casts deref() (the data contained by the var) into a function.
>
> If the var contains another var, casting that var to an IFn will result in 
> a recursive call.
>
> For example:
>
> f3 casts f2 to an IFn.
> f2 casts f1 to an IFn.
> f1 casts the function to an IFn (resulting in the function).
>
> So the "chaining together" is defined in the invoke method and the casting 
> process.
>
> On Sunday, 26 May 2013 17:33:24 UTC-4, Simon Katz wrote:
>>
>> If I define a chain of vars like this...
>>
>> (defn f1 [] 42) 
>>
>> (def f2 #'f1) 
>>
>> (def f3 #'f2) 
>>
>>    ...when I call f3 the chain of vars is followed:
>>
>> (f3) ; => 42 
>>
>>  Out of curiosity, where is this following-the-chain defined?
>>
>> I looked at http://clojure.org/evaluation which simply says "The result 
>> of the evaluation of the operator is [...] cast to IFn (the interface 
>> representing Clojure functions), and invoke() is called on it".
>>
>> --Simon
>>
>

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