Hi, I'm new to clojure and came from a Lisp background. While learning I clojure I came accross the two different ways of creating anonymous functions ((fn ...) and #(...)). I tried to construct the accumulator function in clojure using these forms and this is what I wrote (this might seem naive but I'm just a beginner :)
1. (defn foo [n] (let [r (ref n)] (fn [i] (dosync (alter r + i) @r)))) And it works fine: user> (def f (foo 10)) #'user/f user> (f 1) 11 user> (f 1) 12 2. (defn foo2 [n] (let [r (ref n)] #((dosync (alter r + %) @r)))) This does not work: user> (def f (foo2 10)) #'user/f user> (f 1) ; Evaluation aborted. java.lang.ClassCastException: java.lang.Integer cannot be cast to clojure.lang.IFn (NO_SOURCE_FILE:0) [Thrown class clojure.lang.Compiler$CompilerException] However, another different function defined below just works: user> (defn bar [n] #(+ n %)) #'user/bar user> (def b (bar 10)) #'user/b user> (b 1) 11 Obviously I might be missing something... Please help. --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---