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.
