Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.forth > #134993
| 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> |
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 | Next — Previous in thread | Next in thread | Find similar
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