Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.forth > #134993

Re: locals

From anton@mips.complang.tuwien.ac.at (Anton Ertl)
Newsgroups comp.lang.forth
Subject Re: locals
Date 2026-04-26 14:03 +0000
Organization Institut fuer Computersprachen, Technische Universitaet Wien
Message-ID <2026Apr26.160303@mips.complang.tuwien.ac.at> (permalink)
References (2 earlier) <87o6j74l1z.fsf@nightsong.com> <2026Apr25.084323@mips.complang.tuwien.ac.at> <nnd$22b8fb28$086616c8@3c6198f3bcb67197> <2026Apr25.122216@mips.complang.tuwien.ac.at> <20260425160747.00007f4a@tin.it>

Show all headers | View raw


peter <peter.noreply@tin.it> writes:
>I recently reviewed the string comparison for search-wordlist
>and came up with the following
>
>The string stored in the word header is already uppercased.
>So string comparison will be case insensitive
>
>: UC ( c -- c' )    \ uppercase char
>    dup $61 $7B within  $20 and -  ;
>
>
>: NCOMP4  ( addr n  addr' n'  - f)	\  0 is match 
>    dup >r
>    begin
>        rot = while             \ str cstr
>        r> dup 1- >r
>            while               \ str cstr
>            swap count uc       \ cstr str' s1
>            rot count           \ str' s1 cstr' c1
>    repeat   
>        2drop r> drop 0 exit
>    then
>        2drop r> drop 1 ;
>
>First iteration in the loop it does not compare chars but the length!

Clever, but, at least without comment, too clever.

This code, and, more clearly, Hans Bezemers version demonstrate that
STR= is easier than COMPARE, STRCMP, or STR<, because you can deal
with the case of length difference right at the start, whereas the
latter words have to check the characters up to the end of the shorter
string first before dealing with the length.  This shows the greatest
benefit in cases like

s" 0123456789abcdefg" s" 0123456789abcdefgh" strcmp

As for STRCMP, I have measured the five versions shown in my earlier
posting (whole program posted below), with the bugs fixed, and the
?DUP IF replaced by DUP IF ... THEN DROP, because it produces better
code.

I have also included the following versions:

: strcmp { addr1 u1 addr2 u2 -- n }
 u1 u2 min 0
 ?do
   addr1 c@ addr2 c@ - ?dup
   if
     unloop exit
   then
   addr1 char+ TO addr1
   addr2 char+ TO addr2
 loop
 u1 u2 - ;

This comes from the '94 paper and is the version that uses TO instead
of defining new locals at every iteration.  Paul Rubin will love the
code that current Gforth produces for "addr2 char+ TO addr2":

<strcmp+$E0>  @local2    1->2 
   $7F337DA71BBA: mov    0x10(%rbp),%r15
<strcmp+$E8>  char+    2->2 
   $7F337DA71BBE: add    $0x1,%r15
<strcmp+$F0>  !local2    2->1 
   $7F337DA71BC2: mov    %r15,0x10(%rbp)

The TO <local> code was not that efficient in earlier Gforth versions.

The other version I added is:

: strcmp ( addr1 u1 addr2 u2 -- n )
    rot 2dup 2>r min 0 ?do ( addr1 addr2 )
        over c@ over c@ - dup if
            nip nip 2rdrop unloop exit then
        drop
        char+ swap char+ swap
    loop
    2drop r> r> - ;

This is the STRCMP3 from <2024Apr9.175958@mips.complang.tuwien.ac.at>
and may be the locals-less version I compared against in the '94
paper.

I also included your version (without the UC call) and Hans Bezemer's
version.

I benchmarked two Forth systems, gforth-fast and gforth-itc.
gforth-itc uses indirect-threaded code and should perform similar to
the "simple interpreters" that Paul Rubin had in mind.

I ran three different benchmarks on these words, which performed the
following a number of times:

s" 0123456789abcdefg" 2dup strcmp drop \ bench1
s" 0123456789abcdefg" s" 2123456789abcdefg" strcmp drop \ bench2
s" 0123456789abcdefg" s" 0123456789abcdefgh" strcmp drop \bench3

In bench1 the strings are equal and everything has to be compared.  In
bench2 the strings have the same length, but differ in the first char,
so the loop can terminate after the first char.  In bench3 the strings
have different length, but all chars that both strings have are the
same.  In the latter case versionpeter and versionbezemer have an
advantage from not performing the same functionality.

The cycles numbers are per invocation of STRCMP, including benchmark overhead.

The benchmarks are run on a Ryzen 8700G (Zen4)>

In addition to the cycles, I also show the bytes of the native code of
the whole word in gforth-fast on AMD64 (without the final jmp (2
Bytes)), and of the loop (including the code for the if...then).

   Bytes   | cycles gforth-fast  |  cycles gforth-itc   |
strcmp loop|bench1 bench2 bench3 | bench1 bench2 bench3 |
  262  127 | 109.5   16.6  109.4 | 1732.7  147.4 1724.5 | version0
  303  151 | 164.2   17.2  164.4 | 1714.1  170.4 1613.5 | version1
  257  122 | 105.3   17.4  105.1 | 1496.7  166.4 1493.0 | version2
  280  113 |  98.6   19.2   99.0 | 1230.1  194.4 1116.2 | version3
  267  118 |  91.2   17.9   91.2 | 1268.6  198.4 1269.0 | version4
  273  108 |  89.9   17.0   90.0 | 1136.0  178.4 1138.9 | version5
  261  128 | 121.1   14.6  118.5 | 1221.4  131.3 1213.3 | version6
  210  142 | 137.5   15.4    9.5 | 1244.4  155.3   78.3 | versionpeter
  260  119 | 107.8   16.4    9.8 | 1186.2  134.5   71.3 | versionbezemer

So the champion among the full-featured strcmps for bench1 and bench3
is version5, for bench2 version6.  The str= variants are much faster
for bench3 (of course), but slower than several other versions for
bench1 and slower than version6 for bench2.  The native code size is
smallest for version2 (among the full-featured strcmp
implementations), so the locals-less versions do not win everything.

So locals-less (version5 and version6) is somewhat faster on both
gforth-fast and gforth-itc.

lxf has a more efficient locals implementation.  Let's see how it
fares.  It does not support the usage in version1, so I leave that
away.

     cycles lxf 
bench1 bench2 bench3
  79.9   12.0   79.9 version0
  99.6   12.0   99.6 version2
  98.8   14.1   98.1 version3
  86.0   13.2   86.0 version4
  84.1   12.6   84.2 version5
  88.7   10.0   92.8 version6
  98.3   10.0    6.0 versionpeter
  72.1    9.5    6.0 versionbezemer

On lxf version0 (with locals) is the fastest for bench1 and bench3,
and version6 is the fastest for bench2.  Hans Bezemers version wins
everything if we are only interested in str= functionality.

And here's the code (measurement scripts at the bottom):
----------------------------------------------------------
[defined] version0 [if]
: strcmp {: addr1 u1 addr2 u2 -- n :}
 u1 u2 min 0
 ?do
   addr1 c@ addr2 c@ - dup
   if
     unloop exit
   then
   drop
   addr1 char+ TO addr1
   addr2 char+ TO addr2
 loop
 u1 u2 - ;
[then]

[defined] version1 [if]
: strcmp {: addr1 u1 addr2 u2 -- n :}
 addr1 addr2
 u1 u2 min 0 
 ?do {: s1 s2 :}
   s1 c@ s2 c@ - dup 
   if
     unloop exit
   then
   drop s1 char+ s2 char+
 loop
 2drop
 u1 u2 - ;
[then]

[defined] version2 [if]
: strcmp {: addr1 u1 addr2 u2 -- n :}
 u1 u2 min 0 
 ?do
   addr1 i + c@ addr2 i + c@ - dup 
   if
     unloop exit
   then
   drop
 loop
 u1 u2 - ;
[then]

[defined] version3 [if]
: strcmp {: addr1 u1 addr2 u2 -- n :}
 addr2 addr1 - {: offset :}
 u1 u2 min addr1 + addr1 ?do
   i c@ i offset + c@ - dup 
   if
     unloop exit
   then
   drop
 loop
 u1 u2 - ;
[then]

[defined] version4 [if]
: strcmp {: addr1 u1 addr2 u2 -- n :}
 addr2 addr1 - ( offset )
 u1 u2 min addr1 + addr1 ?do ( offset )
   dup i + c@ i c@ - dup 
   if
     nip negate unloop exit
   then
   drop
 loop
 drop u1 u2 - ;
[then]

[defined] version5 [if]
: strcmp ( addr1 u1 addr2 u2 -- n )
 rot 2dup - >r ( addr1 addr2 u1 u2 R: n1 )
 min -rot over - ( u12 addr1 offset R: n1 )
 swap rot bounds ( offset limit start R: n1 )
 ?do ( offset R: n1 loop-sys )
   dup i + c@ i c@ - dup 
   if
     nip negate unloop r> drop exit
   then
   drop
 loop
 drop r> negate ;
[then]

[defined] version6 [if]
[undefined] 2rdrop [if]
: 2rdrop postpone 2r> postpone 2drop ; immediate
[then]

: strcmp ( addr1 u1 addr2 u2 -- n )
    rot 2dup 2>r min 0 ?do ( addr1 addr2 )
        over c@ over c@ - dup if
            nip nip 2rdrop unloop exit then
        drop
        char+ swap char+ swap
    loop
    2drop r> r> - ;
[then]

[defined] versionpeter [if]
    \ from <20260425160747.00007f4a@tin.it>
    \ renamed and deleted the call to UC
: strcmp  ( addr n  addr' n'  - f)	\  0 is match 
    dup >r
    begin
        rot = while             \ str cstr
        r> dup 1- >r
            while               \ str cstr
            swap count          \ cstr str' s1
            rot count           \ str' s1 cstr' c1
    repeat   
        2drop r> drop 0 exit
    then
        2drop r> drop 1 ;
[then]

[defined] versionbezemer [if]
    \ from <nnd$548d4f1b$1e104571@905dda44db1f54ae>
    \ renamed
: strcmp
   rot over - if drop 2drop true exit then
   0 ?do
     over i chars + c@ over i chars + c@ -
     if drop drop unloop true exit then
   loop drop drop false
;
[then]

[defined] t{ [if]
    t{ s" abc" s" abc" strcmp -> 0 }t
    t{ s" abc" s" abcd" strcmp -> -1 }t
    t{ s" abc" s" abd" strcmp -> -1 }t
    t{ s" abd" s" abc" strcmp -> 1 }t
    t{ s" cbc" s" abc" strcmp -> 2 }t
    t{ s" abc" s" adc" strcmp -> -2 }t
[then]

\ Benchmarks

[undefined] iterations [if]
    100000000 constant iterations
[then]

: benchmark ( c-addr1 u1 c-addr2 u2 -- )
    iterations 0 do
        2over 2over strcmp drop
    loop
    2drop 2drop ;

: bench1
    s" 0123456789abcdefg" 2dup benchmark ;

: bench2
    s" 0123456789abcdefg" s" 2123456789abcdefg" benchmark ;

: bench3
    s" 0123456789abcdefg" s" 0123456789abcdefgh" benchmark ;
    

0 [if]
# bash script for producing the cycles
IFS=":"
for i in 0 1 2 3 4 5 6 peter bezemer; do
    for forthit in gforth-fast:100000000 gforth-itc:10000000; do
        fields=($forthit); forth="${fields[0]}"; iterations="${fields[1]}"
        for bench in 1 2 3; do
            perf stat --log-fd 3 -x, -e cycles:u $forth -e "create version$i $iterations constant iterations" ~/forth/strcmp.4th -e "bench$bench bye" 3>&1 >/dev/null|
                 awk -F, '{printf "%6.1f ",$1/'$iterations'}'
         done
     done
     echo version$i
done
IFS=":"
for i in 0 2 3 4 5 6 peter bezemer; do
    forth=lxf; iterations=100000000
    for bench in 1 2 3; do
        perf stat --log-fd 3 -x, -e cycles:u $forth "create version$i $iterations constant iterations include $HOME/forth/strcmp.4th bench$bench bye" 3>&1 >/dev/null|
             awk -F, '{printf "%6.1f ",$1/'$iterations'}'
     done
     echo version$i
done
[then]
--------------------------------------------------------------

- 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 2025 proceedings: http://www.euroforth.org/ef25/papers/

Back to comp.lang.forth | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

Coroutines in Forth Gerry Jackson <do-not-use@swldwa.uk> - 2026-04-05 23:25 +0100
  Re: Coroutines in Forth Gerry Jackson <do-not-use@swldwa.uk> - 2026-04-05 23:30 +0100
    Re: Coroutines in Forth Paul Rubin <no.email@nospam.invalid> - 2026-04-05 17:16 -0700
      Re: Coroutines in Forth Gerry Jackson <do-not-use@swldwa.uk> - 2026-04-06 19:58 +0100
        Re: Coroutines in Forth Paul Rubin <no.email@nospam.invalid> - 2026-04-22 11:13 -0700
          Re: Coroutines in Forth albert@spenarnc.xs4all.nl - 2026-04-22 22:05 +0200
      Re: Coroutines in Forth albert@spenarnc.xs4all.nl - 2026-04-07 13:23 +0200
  Re: Coroutines in Forth albert@spenarnc.xs4all.nl - 2026-04-06 13:51 +0200
    Re: Coroutines in Forth Gerry Jackson <do-not-use@swldwa.uk> - 2026-04-06 22:20 +0100
      Re: Coroutines in Forth albert@spenarnc.xs4all.nl - 2026-04-07 13:35 +0200
        Re: Coroutines in Forth Gerry Jackson <do-not-use@swldwa.uk> - 2026-04-07 20:55 +0100
          Re: Coroutines in Forth albert@spenarnc.xs4all.nl - 2026-04-08 12:34 +0200
            Re: Coroutines in Forth Gerry Jackson <do-not-use@swldwa.uk> - 2026-04-08 12:32 +0100
          Re: Coroutines in Forth Stephen Pelc <stephen@vfxforth.com> - 2026-04-09 10:12 +0000
        Re: Coroutines in Forth Hans Bezemer <the.beez.speaks@gmail.com> - 2026-04-10 19:01 +0200
          Re: Coroutines in Forth dxf <dxforth@gmail.com> - 2026-04-11 11:54 +1000
            Re: Coroutines in Forth Hans Bezemer <the.beez.speaks@gmail.com> - 2026-05-01 13:07 +0200
          Re: Coroutines in Forth peter <peter.noreply@tin.it> - 2026-04-11 09:49 +0200
          Re: Coroutines in Forth albert@spenarnc.xs4all.nl - 2026-04-11 22:03 +0200
            Re: Coroutines in Forth dxf <dxforth@gmail.com> - 2026-04-12 12:49 +1000
              Re: Coroutines in Forth albert@spenarnc.xs4all.nl - 2026-04-12 12:13 +0200
                Re: Coroutines in Forth Hans Bezemer <the.beez.speaks@gmail.com> - 2026-04-12 17:39 +0200
                Re: Coroutines in Forth dxf <dxforth@gmail.com> - 2026-04-13 10:54 +1000
                Re: Coroutines in Forth Hans Bezemer <the.beez.speaks@gmail.com> - 2026-04-13 19:24 +0200
              Re: Coroutines in Forth Hans Bezemer <the.beez.speaks@gmail.com> - 2026-04-12 13:48 +0200
              Re: Coroutines in Forth albert@spenarnc.xs4all.nl - 2026-04-13 12:13 +0200
              Re: Coroutines in Forth Paul Rubin <no.email@nospam.invalid> - 2026-04-22 11:18 -0700
                Re: Coroutines in Forth dxf <dxforth@gmail.com> - 2026-04-23 11:13 +1000
                Re: Coroutines in Forth Hans Bezemer <the.beez.speaks@gmail.com> - 2026-04-23 12:37 +0200
                Re: Coroutines in Forth Paul Rubin <no.email@nospam.invalid> - 2026-04-24 10:36 -0700
                Re: Coroutines in Forth dxf <dxforth@gmail.com> - 2026-04-25 12:12 +1000
                Re: Coroutines in Forth Paul Rubin <no.email@nospam.invalid> - 2026-04-24 23:31 -0700
                Re: Coroutines in Forth albert@spenarnc.xs4all.nl - 2026-04-25 10:45 +0200
                Re: Coroutines in Forth dxf <dxforth@gmail.com> - 2026-04-25 22:06 +1000
                Re: Coroutines in Forth Hans Bezemer <the.beez.speaks@gmail.com> - 2026-04-25 15:11 +0200
                Re: Coroutines in Forth dxf <dxforth@gmail.com> - 2026-04-26 13:33 +1000
                Re: Coroutines in Forth Hans Bezemer <the.beez.speaks@gmail.com> - 2026-04-26 16:28 +0200
                Re: Coroutines in Forth Paul Rubin <no.email@nospam.invalid> - 2026-04-25 21:46 -0700
                FP stack depth limitations (was: Coroutines in Forth) anton@mips.complang.tuwien.ac.at (Anton Ertl) - 2026-04-26 05:55 +0000
                Re: FP stack depth limitations Paul Rubin <no.email@nospam.invalid> - 2026-04-26 00:28 -0700
                Re: FP stack depth limitations dxf <dxforth@gmail.com> - 2026-04-26 19:55 +1000
                Re: FP stack depth limitations (was: Coroutines in Forth) peter <peter.noreply@tin.it> - 2026-04-26 09:57 +0200
                Re: FP stack depth limitations (was: Coroutines in Forth) albert@spenarnc.xs4all.nl - 2026-04-26 14:34 +0200
                Re: Coroutines in Forth Hans Bezemer <the.beez.speaks@gmail.com> - 2026-04-25 15:01 +0200
                Re: Coroutines in Forth Hans Bezemer <the.beez.speaks@gmail.com> - 2026-05-01 13:13 +0200
                Forth, C, hardware, and programming virtues (was: Coroutines in Forth) anton@mips.complang.tuwien.ac.at (Anton Ertl) - 2026-04-25 05:26 +0000
                Re: Forth, C, hardware, and programming virtues Paul Rubin <no.email@nospam.invalid> - 2026-04-24 23:55 -0700
                Re: Forth, C, hardware, and programming virtues anton@mips.complang.tuwien.ac.at (Anton Ertl) - 2026-04-25 08:21 +0000
                Re: Forth, C, hardware, and programming virtues albert@spenarnc.xs4all.nl - 2026-04-25 11:27 +0200
                Re: Forth, C, hardware, and programming virtues Hans Bezemer <the.beez.speaks@gmail.com> - 2026-04-25 15:43 +0200
                Re: Forth, C, hardware, and programming virtues anton@mips.complang.tuwien.ac.at (Anton Ertl) - 2026-04-25 17:21 +0000
                Re: Forth, C, hardware, and programming virtues dxf <dxforth@gmail.com> - 2026-04-26 15:21 +1000
                Re: Forth, C, hardware, and programming virtues Hans Bezemer <the.beez.speaks@gmail.com> - 2026-04-26 15:08 +0200
                Re: Forth, C, hardware, and programming virtues albert@spenarnc.xs4all.nl - 2026-04-26 00:34 +0200
                Re: Forth, C, hardware, and programming virtues Hans Bezemer <the.beez.speaks@gmail.com> - 2026-04-26 15:10 +0200
                locals (was: Coroutines in Forth) anton@mips.complang.tuwien.ac.at (Anton Ertl) - 2026-04-25 04:47 +0000
                Re: locals Paul Rubin <no.email@nospam.invalid> - 2026-04-24 23:21 -0700
                Re: locals anton@mips.complang.tuwien.ac.at (Anton Ertl) - 2026-04-25 06:43 +0000
                Re: locals albert@spenarnc.xs4all.nl - 2026-04-25 11:43 +0200
                Re: locals anton@mips.complang.tuwien.ac.at (Anton Ertl) - 2026-04-25 10:22 +0000
                Re: locals peter <peter.noreply@tin.it> - 2026-04-25 16:07 +0200
                Re: locals Hans Bezemer <the.beez.speaks@gmail.com> - 2026-04-25 17:38 +0200
                Re: locals albert@spenarnc.xs4all.nl - 2026-04-26 01:13 +0200
                Re: locals anton@mips.complang.tuwien.ac.at (Anton Ertl) - 2026-04-26 14:03 +0000
                Re: locals peter <peter.noreply@tin.it> - 2026-04-27 09:31 +0200
                Re: locals anton@mips.complang.tuwien.ac.at (Anton Ertl) - 2026-04-27 07:53 +0000
                Re: locals peter <peter.noreply@tin.it> - 2026-04-27 11:52 +0200
                Re: locals albert@spenarnc.xs4all.nl - 2026-04-26 00:51 +0200
                Re: locals Paul Rubin <no.email@nospam.invalid> - 2026-04-25 22:40 -0700
                Re: locals albert@spenarnc.xs4all.nl - 2026-04-26 14:55 +0200
                Re: locals anton@mips.complang.tuwien.ac.at (Anton Ertl) - 2026-04-26 09:50 +0000
                Re: locals Hans Bezemer <the.beez.speaks@gmail.com> - 2026-04-26 16:22 +0200
                Re: locals anton@mips.complang.tuwien.ac.at (Anton Ertl) - 2026-04-26 17:04 +0000
                Re: locals dxf <dxforth@gmail.com> - 2026-04-27 11:51 +1000
                Re: locals Hans Bezemer <the.beez.speaks@gmail.com> - 2026-04-28 08:21 +0200
                Re: locals Hans Bezemer <the.beez.speaks@gmail.com> - 2026-04-28 08:22 +0200
                Re: locals dxf <dxforth@gmail.com> - 2026-04-27 11:12 +1000
                Re: locals Hans Bezemer <the.beez.speaks@gmail.com> - 2026-04-28 14:34 +0200
                Re: locals Hans Bezemer <the.beez.speaks@gmail.com> - 2026-04-28 14:34 +0200
                Re: locals Gerry Jackson <do-not-use@swldwa.uk> - 2026-04-29 12:44 +0100
                Re: locals Hans Bezemer <the.beez.speaks@gmail.com> - 2026-04-29 14:37 +0200
                Re: locals Hans Bezemer <the.beez.speaks@gmail.com> - 2026-04-29 14:44 +0200
                Re: locals Paul Rubin <no.email@nospam.invalid> - 2026-05-01 23:50 -0700
                Re: locals anton@mips.complang.tuwien.ac.at (Anton Ertl) - 2026-05-02 10:34 +0000
                Re: locals Paul Rubin <no.email@nospam.invalid> - 2026-05-01 23:54 -0700
                Re: locals dxf <dxforth@gmail.com> - 2026-05-02 17:36 +1000
                Re: locals Paul Rubin <no.email@nospam.invalid> - 2026-05-02 01:11 -0700
                Re: locals anton@mips.complang.tuwien.ac.at (Anton Ertl) - 2026-05-02 15:58 +0000
      Re: Coroutines in Forth Krishna Myneni <krishna.myneni@ccreweb.org> - 2026-04-07 09:28 -0500
        Re: Coroutines in Forth anton@mips.complang.tuwien.ac.at (Anton Ertl) - 2026-04-07 16:12 +0000
          Re: Coroutines in Forth Krishna Myneni <krishna.myneni@ccreweb.org> - 2026-04-07 18:06 -0500
          Re: Coroutines in Forth Gerry Jackson <do-not-use@swldwa.uk> - 2026-04-08 11:43 +0100
            Re: Coroutines in Forth albert@spenarnc.xs4all.nl - 2026-04-08 13:16 +0200
              Re: Coroutines in Forth Krishna Myneni <krishna.myneni@ccreweb.org> - 2026-04-08 11:47 -0500
                Re: Coroutines in Forth Gerry Jackson <do-not-use@swldwa.uk> - 2026-04-08 21:48 +0100
                Re: Coroutines in Forth Krishna Myneni <krishna.myneni@ccreweb.org> - 2026-04-09 07:06 -0500
                Re: Coroutines in Forth albert@spenarnc.xs4all.nl - 2026-04-09 16:41 +0200
                Re: Coroutines in Forth Krishna Myneni <krishna.myneni@ccreweb.org> - 2026-04-09 13:34 -0500
                Re: Coroutines in Forth albert@spenarnc.xs4all.nl - 2026-04-10 01:23 +0200
                Re: Coroutines in Forth Krishna Myneni <krishna.myneni@ccreweb.org> - 2026-04-09 21:34 -0500
                Re: Coroutines in Forth albert@spenarnc.xs4all.nl - 2026-04-09 13:01 +0200
                Re: Coroutines in Forth Krishna Myneni <krishna.myneni@ccreweb.org> - 2026-04-09 07:01 -0500
                Re: Coroutines in Forth albert@spenarnc.xs4all.nl - 2026-04-09 16:10 +0200
                Re: Coroutines in Forth Krishna Myneni <krishna.myneni@ccreweb.org> - 2026-04-09 13:29 -0500
              Re: Coroutines in Forth Gerry Jackson <do-not-use@swldwa.uk> - 2026-04-08 21:26 +0100
          Re: Coroutines in Forth Hans Bezemer <the.beez.speaks@gmail.com> - 2026-04-08 14:22 +0200
          Re: Coroutines in Forth Hans Bezemer <the.beez.speaks@gmail.com> - 2026-04-28 15:31 +0200
            Re: Coroutines in Forth albert@spenarnc.xs4all.nl - 2026-04-29 10:49 +0200
              Re: Coroutines in Forth Hans Bezemer <the.beez.speaks@gmail.com> - 2026-04-29 15:22 +0200
        Re: Coroutines in Forth Gerry Jackson <do-not-use@swldwa.uk> - 2026-04-08 11:33 +0100
          Re: Coroutines in Forth albert@spenarnc.xs4all.nl - 2026-04-08 13:07 +0200
            Re: Coroutines in Forth Gerry Jackson <do-not-use@swldwa.uk> - 2026-04-08 22:05 +0100

csiph-web