Deutsch   English   Français   Italiano  
<v73cm8$kvfk$1@solani.org>

View for Bookmarking (what is this?)
Look up another Usenet article

Path: ...!3.eu.feeder.erje.net!feeder.erje.net!weretis.net!feeder8.news.weretis.net!reader5.news.weretis.net!news.solani.org!.POSTED!not-for-mail
From: nobody@nowhere.invalid (Marc Olschok)
Newsgroups: comp.lang.forth
Subject: Re: recursion
Date: Mon, 15 Jul 2024 14:45:28 -0000 (UTC)
Sender: Marc <marc@komet.home.org>
Message-ID: <v73cm8$kvfk$1@solani.org>
References: <v6c8v0$3usoe$1@dont-email.me> <v71gpb$jsug$1@solani.org> <nnd$79e41f47$2235e236@caa216183355b959> <d8a7bf3190d012f4d6e588cf7f4f4ee1@www.novabbs.com> <2024Jul15.152917@mips.complang.tuwien.ac.at>
Injection-Date: Mon, 15 Jul 2024 14:45:28 -0000 (UTC)
Injection-Info: solani.org;
	logging-data="687604"; mail-complaints-to="abuse@news.solani.org"
User-Agent: tin/2.6.0-20210823 ("Coleburn") (Linux/5.15.10-smp (i686))
Cancel-Lock: sha1:IyuuoRJIGPSuxujkBzEY7x9G2bg=
X-User-ID: eJwFwQEBACAIA7BKqOdiHI/QP4KbLw7mBp3w9k5J0zBF2QTi2IWA7L5xxkMjPWrrYRWz+AEjAhGK
Bytes: 3663
Lines: 89

On Mon, 15 Jul 2024 15:29:17 Anton Ertl wrote:
> minforth@gmx.net (minforth) writes:
>>On Mon, 15 Jul 2024 10:41:54 +0000, albert@spenarnc.xs4all.nl wrote:
>>> So I prefer:
>>>
>>> :F binom ;
>>>
>>> :R binom  ( n1 n2 -- nd ) \ n k --> C(n,k)
>>>   dup 0=
>>>   IF     2drop 1 s>d
>>>   ELSE   2dup 1- swap 1- swap binom 2swap m*/
>>>   THEN ;
>>>
>>> In my efforts to Make A Lisp (a github https://github.com/kanaka/mal )
>>> I discovered that using recurse is an ugly cludge that present
>>> a lot of problems in refactoring code, if not prevent it.
>>> Forward and resolve definitions is the more sane method, cf. c.
>>> It is hardly more complicated.
>>
>>IIRC gforth has RECURSIVE to avoid duplicating definitions.
> 
> Yes.  So for a direct recursion like this one you can write
> 
> : binom  ( n1 n2 -- nd ) recursive \ n k --> C(n,k)
>   dup 0=
>   IF     2drop 1 s>d
>   ELSE   2dup 1- swap 1- swap binom 2swap m*/
>   THEN ;

Oh that is nice, I did not know about that. And it also avoids the
source paste problem that Albert noted.

> 
> RECURSIVE also allows you to tick the word in its own definition (not
> possible with RECURSE), a feature that I actually have used; something
> along the lines:
> 
> : walk ( node -- ) recursive
>   dup is-leaf? if
>     ... \ do something for the leaf
>   else \ the node has subnodes
>     node ['] walk for-each-subnode
>   then ;
> 
> Gforth (development) also has FORWARD, which also allows you to do
> mutual recursion, e.g.
> 
> forward foo
> 
> : bar ( n -- ) dup . 1- foo ;
> 
> : foo ( n -- ) dup 0> if bar else drop then ;
> 
> 5 foo \ prints "5 4 3 2 1 "
> 
> let's see what the decompiler says:
> 
> simple-see foo 
> $7F54E256E870 dup    0->0 
> $7F54E256E878 0>    0->0 
> $7F54E256E880 ?branch    0->0 
> $7F54E256E888 <foo+$40> 
> $7F54E256E890 call    0->0 
> $7F54E256E898 bar
> $7F54E256E8A0 branch    0->0 
> $7F54E256E8A8 <foo+$48> 
> $7F54E256E8B0 drop    0->0 
> $7F54E256E8B8 ;s    0->0  ok
> simple-see bar 
> $7F54E256E810 dup    0->0 
> $7F54E256E818 call    0->0 
> $7F54E256E820 .
> $7F54E256E828 1-    0->0 
> $7F54E256E830 call    0->0 
> $7F54E256E838 foo
> $7F54E256E840 ;s    0->0  ok
> 
> $7F54E256E838 @ hex. \ prints $7F54E256E870
> 
> The last like shows that the call to FOO inside BAR directly calls the
> FOO defined above, no DEFER or somesuch involved in this case.
> 
> The definition of FORWARD is quite intricate and uses several recent
> features of Gforth.  Read all about it in
> <2018Dec31.161743@mips.complang.tuwien.ac.at>.

Will these parts eventually go into future standards?

-- 
M.O.