This happens because a Symbol is a "function that looks itself up in its argument" much like Keywords do:
user=> ('a {'a 2 'b 3})
2
user=> ('b {'a 2 'b 3})
3
user=> ('b 42)
nil
And the two argument version provides a default value to return if the symbol
is not found:
user=> ('c {'a 2 'b 3} ::not-found)
:user/not-found
user=> ('c "not a map" ::not-found)
:user/not-found
Sean
On Mar 21, 2014, at 4:44 PM, John Mastro <[email protected]> wrote:
>
> On Fri, Mar 21, 2014 at 3:55 PM, Andy Smith <[email protected]>
> wrote:
> > I came across the following issue when doing problem
> >
> > user=> (let [f '(+ 1 1)] (apply (first f) (rest f)))
> > 1
>
> That's interesting. It seems it's the last form in the list that's being
> returned, and it doesn't matter what function you apply
>
> (apply '+ '(2 1)) ;=> 1
> (apply '+ '(1 2)) ;=> 2
> (apply 'map '(2 1)) ;=> 1
>
> I don't have any immediate thoughts on why it behaves like that, though
> I'm sure there's a reason (?).
>
> > I could use eval but eval is bad (apparently)...
>
> You could use clojure.core/resolve instead, I think that should be safe.
>
> (let [f '(+ 1 1)]
> (apply (resolve (first f) (rest f))))
> ;=> 2
signature.asc
Description: Message signed with OpenPGP using GPGMail
