http://clojure.org/data_structures defines how the various data structures 
implement IFn.

I would expect either http://clojure.org/vars 
or http://clojure.org/Evaluation to talk about the chaining of vars, but if 
either does I'm missing it.


On Monday, 27 May 2013 01:04:42 UTC+1, JvJ wrote:
>
> I suppose that would depend on the specifications for how various objects 
> are cast to functions.  For instance, vectors, maps, sets, keywords, etc. 
> have their own specific ways of acting as functions.  Do you know where 
> that is specified?
>
> On Sunday, 26 May 2013 18:35:55 UTC-4, Simon Katz wrote:
>>
>> Cool; thanks. That's an implementation-level explanation, which is fine 
>> as far as it goes.
>>
>> Can anyone point at a specification-level explanation?
>>
>>
>> On Sunday, 26 May 2013 23:18:57 UTC+1, 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 [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.


Reply via email to