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.
