Ich bin in Deutschland und das war meine erste versuch etwas informieren vo
Rebol. Ich bin nicht in der lage diskutieren
mit freundlichen Gr��en
H.Kalka
----- Original Message ----- 
From: "Maxim Olivier-Adlhoch" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Thursday, October 09, 2003 3:45 PM
Subject: [REBOL] Re: Tail end recursion


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

-- 
To unsubscribe from this list, just send an email to
[EMAIL PROTECTED] with unsubscribe as the subject.

Reply via email to