Hello All, I am new to Clojure. Surprised why this code does not work: user=> (filter #(%) [1 2 3]) ClassCastException java.lang.Long cannot be cast to clojure.lang.IFn
Here my intent behind #(%) is to define a lambda function returning its argument. Since Clojure defines truth on any type, it should be acceptable as filter function, and the result should be the original array Some narrowing down. What's #(%) really good for? user=> #(%) #<user$eval48$fn__49 user$eval48$fn__49@5e2c17f7> so it is a function user=> (#(%)) ArityException Wrong number of args (0) passed to: user$eval26$fn Ok, here not enough arguments supplied, fair enough. Let's fix that: user=> (#(%) 1) ClassCastException java.lang.Long cannot be cast to clojure.lang.IFn Same problem as the first example. So Clojure understands this is a function, knows it takes some arguments, but cannot call it? What's wrong? The following works: (user=> (filter (fn [a] a) [1 2 3]) (1 2 3) So apparently it has something to do with the fact that #() is shorthand. So in my case, it produces a function which cannot be used... In fact, it seems to just yield the constant, not a function. Ask me, it should work (auto-wrap the constant in a function) or the expression should be illegal. I think it deserves better diagnostics... Also, in Practical Clojure book, it says: "The shothand function form #(* %1 %2) is actually identical to the longer form (fn [x y] (* x y)) before it is even seen by the compiler." If you literally apply this rule, you will get ((fn[x] (1)) 1) which throws same exception, not surprisingly, since it tries to evaluate 1 as a fucntion. What it should have done is transform the expression into ((fn[x] 1) 1) which works fine... Special-case it? What do you think? Julian -- 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