While trying to solve the 4Clojure problem “Universal Computation Engine” involving reimplementing evaluation, I accidentally ended up calling something like this:
(apply '/ '(16 8))
rather than the intended:
(apply / '(16 8))
This had the confusing side effect of returning 8, which made me think I had messed up my maths.
I later realised my error after some debugging—I was failing to evaluate the / symbol before attempting to call it—and so realised that clojure.lang.Symbol must implement clojure.lang.IFn. But what does that implementation do? All I can get it to do is return nil with one argument, or the second argument if given.
Symbols look themselves up in a map, much as keywords do. See Symbol’s implementation:
(
RTisclojure.lang.RT, which does just about everything. “RunTime”?)In the example given, the lookup is failing (because 16 is not a map), and therefore the
notFoundvalue (8) is being returned.