Thanks for all the replies. Sorry if my responses are delayed. I'm
still on newb moderation mode, so I find my response can take 2 - 10
hours to be published.

> note that z is free in that expression, which looks suspicious.

yup, it was supposed to be x. It was a copy paste error. I normally
would evaluate the function, but in this case I was expecting errors.

As for acc or other options, I was hoping to create a recursive fn
that could generically accept an anonymous function as an argument,
which was what I was
thinking.

Using a form like:

((recursive-fn #(do-stuff (self (dec %))) (recur self))  5)

(obviously not the way - just the notion)

kind of thing.

When I am home tonight I can play aorund with the examples provided.

Thanks,
Tim





On Jun 30, 8:59 am, Dominic Cooney <dominic.coo...@gmail.com> wrote:
> If you name the Y combinator, then you can write recursive anonymous 
> functions:
>
> <http://rosettacode.org/wiki/Y_combinator#Clojure>
>
> You can't use Clojure's recur as written because it isn't in tail
> position--the result of the function isn't just the value of the recur
> expression (in the first instance it is (* 2 (recur ...)) however I
> note that z is free in that expression, which looks suspicious.
>
> If your goal is to define a function that computes 2^n with
> tail-recursion, then consider threading an "accumulator" parameter
> through the recursive function; something like this:
>
> ((fun [acc x]
>     (if (= x 0)
>       acc
>       (recur (* 2 acc) (dec x))) 1 5)
>
> Of course, you might consider a helper wrapper function that supplies
> the 1 "default" accumulator.
>
> Many functional languages optimize tail calls to jmp instructions;
> that's hard to do efficiently in general on the JVM because it doesn't
> support tail calls. I expect Clojure has designed recur to work the
> way it does because some algorithms depend on the tail call
> optimization, but the restrictions of recur make it possible to
> compile efficiently as a jmp. So it's a nice compromise.
>
> <http://clojure.org/special_forms#SpecialForms--(recur exprs*)>
>
> HTH,
>
> Dominic
>
> On Wed, Jun 30, 2010 at 2:44 PM, Tim Robinson <tim.blacks...@gmail.com> wrote:
> > So I am reading On Lisp + some blogs while learning Clojure (I know,
> > scary stuff :)
>
> > Anyway, I've been playing around to see if I can get an anonymous
> > recursive function to work, but alas I am still a n00b and not even
> > sure what Clojure's approach to this would be.
>
> > How would I do this in Clojure?:
>
> > My first attempt:
>
> > ((fn [x]
> >   (if (= x 0)
> >       1
> >       (* 2 (recur (dec z))))) 5)
>
> > Then my second:
>
> > ((fn [x]
> >       (let [z (if (= x 0)
> >                   1
> >                   (* 2 x))]
> >          (recur (dec z))))  5)
>
> > Ideally one could do:
>
> > ((recursive-fn #( if (= % 0) 1 (* 2 %)) (recur it))  5)
>
> > Obviously none work, and I believe I understand why. I just don't
> > understand how to actually do this or if for some reason Clojure
> > avoids this for some reason.
>
> > I am not actually trying to accomplish a specific task, so the example
> > was made to be simple not meaningful. I'm just playing around to learn
> > recursive functions and Clojure style.
>
> > Thanks,
> > Tim
>
> > --
> > 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

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