so basically its like using recursion to do a loop?
something: does [print "."]
forever [
do something
]
is somewhat equivalent to?:
something: does [
something
]
in F: func [x][x: x + 1 print x f x]
but how does tail-end recursion stop?
how does F ever end?
-MAx
---
"You can either be part of the problem or part of the solution, but in the end, being
part of the problem is much more fun."
> -----Original Message-----
> From: Maarten Koopmans [mailto:[EMAIL PROTECTED]
> Sent: Thursday, October 09, 2003 9:13 AM
> To: [EMAIL PROTECTED]
> Subject: [REBOL] Re: Tail end recursion
>
>
>
> Max,
>
> See the sample
>
>
> Tail recursive is calling yourself as the last thing you do in a
> function.
> This will normally blow up the stack.
>
> But... you can eliminate this by replacing a call to yourself
> by saving
> the parameters, throwing the current stack frame away, and
> then execute
> again.
>
> --Maarten
>
> > -----Original Message-----
> > From: [EMAIL PROTECTED]
> [mailto:[EMAIL PROTECTED] On Behalf
> Of
> > Maxim Olivier-Adlhoch
> > Sent: donderdag 9 oktober 2003 14:23
> > To: [EMAIL PROTECTED]
> > Subject: [REBOL] Re: Tail end recursion
> >
> >
> > sorry if I'm not versed in lisp
> >
> > but what exactly is a tail end recursion?
> >
> > -MAx
> > ---
> > "You can either be part of the problem or part of the
> solution, but in
> the
> > end, being part of the problem is much more fun."
> >
> >
> > > -----Original Message-----
> > > From: Ged Byrne [mailto:[EMAIL PROTECTED]
> > > Sent: Thursday, October 09, 2003 5:17 AM
> > > To: [EMAIL PROTECTED]
> > > Subject: [REBOL] Re: Tail end recursion
> > >
> > >
> > >
> > > Thanks for that. I look forward to the day that I can
> > > understand it :)
> > >
> > > --- Maarten Koopmans <[EMAIL PROTECTED]> wrote: >
> > > > > Another quick question: does Rebol optimise tail
> > > > end
> > > > > recursion like Lisp and Scheme?
> > > > >
> > > >
> > > > No, but I wrote a function that does this. Only for
> > > > tail recursive
> > > > functions though. And gives you good insight in
> > > > cracking some REBOL nuts
> > > > ;-)
> > > >
> > > > See below....
> > > > ----------------------------------------
> > > >
> > > > REBOL []
> > > >
> > > >
> > > > tail-func: func
> > > > [
> > > > {Returns a function that handles tail-recursion
> > > > transparently.}
> > > > args [block!] body [block!]
> > > > /local _*meta-func _*meta-spec _*meta-body
> > > > _*statement _*comm _*p1
> > > > _*p2 _*r _*w
> > > > ]
> > > > [
> > > > _*meta-spec: append/only copy [] args
> > > > _*meta-body: append/only copy [] body
> > > >
> > > > ;matches refinements and copies refinements to our
> > > > command
> > > > _*p1: [ set _*r refinement!
> > > > (either get bind to-word _*r '_*comm [append
> > > > _*comm mold _*r
> > > > _*ref-mode: on][ _*ref-mode: off ])]
> > > > ;matches words and copies their values to the
> > > > statement if ref-mode =
> > > > on
> > > > _*p2: [ set _*w word! (if _*ref-mode [ append/only
> > > > _*statement get
> > > > bind to-word _*w '_*comm])]
> > > >
> > > >
> > > > _*meta-func: copy
> > > > [
> > > > ;The use context is accessible from the wrapper
> > > > function that
> > > > ;eliminates tail recursion. It plays the role of a
> > > > stack frame
> > > > ;it implements a goto like behaviour in case of
> > > > tail recursion
> > > > use [ _*loop-detected _*myself _*innerfunc _*loops
> > > > _*myspec _*myspec2
> > > > _*mycall]
> > > > [
> > > > ;some static initialization of the use context
> > > > varaiables
> > > > _*loops: 0
> > > > _*loop-detected: false
> > > > _*mycall: copy []
> > > > _*innerfunc: func (_*meta-spec) (_*meta-body)
> > > > _*myspec: copy first :_*innerfunc
> > > > _*myspec2: either found? find _*myspec /local
> > > > [append copy _*myspec [_*ref-mode _*p1 _*p2 _*r
> > > > _*w _*comm
> > > > _*statement _*ret]]
> > > > [append copy _*myspec [/local _*ref-mode _*p1
> > > > _*p2 _*r _*w _*comm
> > > > _*statement _*ret]]
> > > > insert/only _*myspec2 [catch]
> > > >
> > > > ;The function that is returned from the use
> > > > context
> > > > _*myself: func _*myspec2
> > > > [
> > > > ;How deep in a loop am I?
> > > > _*loops: _*loops + 1
> > > >
> > > > ;These parse rules extract how I am called
> > > > ;(which refinements and so)
> > > > _*p1: [(_*p1)]
> > > > _*p2: [(_*p2)]
> > > > _*ref-mode: on
> > > >
> > > > ;Our initial call
> > > > _*comm: copy {_*innerfunc}
> > > > ;Our initial statement
> > > > _*statement: copy []
> > > >
> > > > ;Generate our statement and call
> > > > parse _*myspec [ any [ _*p1 | _*p2 ]]
> > > > insert _*statement to-path _*comm
> > > >
> > > > ;Copy it in the use context so it survives
> > > > ;a loop (_*mycall is the 'goto args)
> > > > _*mycall: copy _*statement
> > > >
> > > > if _*loops = 2
> > > > [
> > > > _*loops: 1
> > > > _*loop-detected: true
> > > > return
> > > > ]
> > > >
> > > > ;Until we are no longer in loop-detection mode
> > > > until
> > > > [
> > > > _*loop-detected: false
> > > > set/any '_*ret do bind _*mycall '_*loops
> > > > not _*loop-detected
> > > > ]
> > > >
> > > > ;Use context cleanup
> > > > _*loops: 0
> > > > _*loop-detected: false
> > > > _*mycall: copy []
> > > >
> > > >
> > > > ;return our value
> > > > return get/any '_*ret
> > > > ];_*myself: func ...
> > > >
> > > > ];use context
> > > >
> > > > ];meta-func
> > > >
> > > > ;return our function....
> > > > do compose/deep _*meta-func
> > > > ]
> > > >
> > > > ;example usage
> > > > f: tail-func [x][x: x + 1 print x f x]
> > > >
> > > > --
> > > > To unsubscribe from this list, just send an email to
> > > > [EMAIL PROTECTED] with unsubscribe as the
> > > > subject.
> > > >
> > >
> > > ______________________________________________________________
> > > __________
> > > Want to chat instantly with your online friends? Get the FREE
> Yahoo!
> > > Messenger http://mail.messenger.yahoo.co.uk
> > > --
> > > To unsubscribe from this list, just send an email to
> > > [EMAIL PROTECTED] with unsubscribe as the subject.
> > >
> > >
> >
> > --
> > To unsubscribe from this list, just send an email to
> > [EMAIL PROTECTED] with unsubscribe as the subject.
>
>
> --
> To unsubscribe from this list, just send an email to
> [EMAIL PROTECTED] with unsubscribe as the subject.
>
>
--
To unsubscribe from this list, just send an email to
[EMAIL PROTECTED] with unsubscribe as the subject.