On Wed, Dec 8, 2010 at 2:40 PM, javajosh <javaj...@gmail.com> wrote:
> I was looking at quote.
>
> user=> (quote 1)
> 1
> user=> (quote)
> nil
> user=> (quote quote)
> quote
> user=> ((quote quote) 1)
> nil
>
> It's the last result that confuses me. I would have expected the
> result to be "1" - e.g. the same as (quote 1). I figured I'd try quote
> on something other than itself, and it just got stranger:
>
> user=> ((quote +) 1 2)
> 2
>
> I would have expected 3.
>
1) quote is a special form, so it's probably a bad symbol to be
experimenting with in this way, let's use "+" instead.

2) This is kind of funny, (quote +) returns a symbol, not a ref
holding the function. When you invoke it, you're actually calling the
invoke method of the Fn implentation of the Symbol class, whose
behavior is to look itself up in the first parameter (intended to be a
collection), similar to how keywords look themselves up.

This supports things like ('key {'key 'value}) which returns 'value.
With two parameters, the third parameter is actually the "not found"
value, which is what should be returned if the key isn't found in the
collection.

user=> ('+ {'+ "Plus"})
"Plus"

user=> ('+ {} "Not Found")
"Not Found"

user=> (:name {:name "Aaron"})
"Aaron"

user=> (:name {} "Not Found")
"Not Found"

Once you get a symbol, if you want to actually call it the way you
were originally, try "resolve" amongst probably other ways.

user=> (resolve '+)
#'clojure.core/+

user=> ((resolve '+) 1 2)
3

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

Reply via email to