Re: Back & Forth - Co-routines

Liste des GroupesRevenir à cl forth 
Sujet : Re: Back & Forth - Co-routines
De : anton (at) *nospam* mips.complang.tuwien.ac.at (Anton Ertl)
Groupes : comp.lang.forth
Date : 01. Feb 2025, 08:26:11
Autres entêtes
Organisation : Institut fuer Computersprachen, Technische Universitaet Wien
Message-ID : <2025Feb1.082611@mips.complang.tuwien.ac.at>
References : 1 2 3
User-Agent : xrn 10.11
Paul Rubin <no.email@nospam.invalid> writes:
This seems more in the locals spirit:
>
: blend { a x b -- n } 100 b x - b a - */ ;
: tri_mf3.1 { x a b c -- mf }
   a x <= x b < AND IF b x a blend EXIT THEN
   b x <= x c < AND IF b x c blend EXIT THEN
   0 ;

Forth has a word WITHIN that should come in handy here:

: tri_mf3.1 { x a b c -- mf }
    x a b within IF b x a blend EXIT THEN
    x b c within IF b x c blend EXIT THEN
    0 ;

Another alternative, assuming a<=b<=c:

: tri_mf3.1 { x a b c -- mf }
    case
      x a < ?of 0 endof
      x b < ?of b x a blend endof
      x c < ?of b x c blend endof
      0 0
    endcase ;

The disadvantage in the latter case is that the above and below cases
are separate, needing another branch and possibly increasing the
number of mispredictions.  This can be addressed with:

[undefined] select [if]
: select ( u1 u2 f -- u )
  if swap then nip ;
[then]

: tri_mf3.1 { x a b c -- mf }
    x a c within if
      b x  x b < a c select  blend
    else
      0
    then ;

In Gforth (development) SELECT is a primitive which hopefully does not
branch; in that case you have only one branch here.

- anton
--
M. Anton Ertl  http://www.complang.tuwien.ac.at/anton/home.html
comp.lang.forth FAQs: http://www.complang.tuwien.ac.at/forth/faq/toc.html
     New standard: https://forth-standard.org/
EuroForth 2023 proceedings: http://www.euroforth.org/ef23/papers/
EuroForth 2024 proceedings: http://www.euroforth.org/ef24/papers/

Date Sujet#  Auteur
31 Jan 25 * Re: Back & Forth - Co-routines12ahmed
31 Jan 25 +* Re: Back & Forth - Co-routines2ahmed
31 Jan 25 i`- Re: Back & Forth - Co-routines1ahmed
31 Jan 25 +- Re: Back & Forth - Co-routines1ahmed
31 Jan 25 +- Re: Back & Forth - Co-routines1ahmed
31 Jan 25 +* Re: Back & Forth - Co-routines6Paul Rubin
1 Feb 25 i+* Re: Back & Forth - Co-routines2ahmed
1 Feb 25 ii`- Re: Back & Forth - Co-routines1ahmed
1 Feb 25 i`* Re: Back & Forth - Co-routines3Anton Ertl
1 Feb 25 i `* Re: Back & Forth - Co-routines2ahmed
1 Feb 25 i  `- SELECT (was: Back & Forth - Co-routines)1Anton Ertl
1 Feb 25 `- Re: Back & Forth - Co-routines1mhx

Haut de la page

Les messages affichés proviennent d'usenet.

NewsPortal