Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.forth > #134997
| From | peter <peter.noreply@tin.it> |
|---|---|
| Newsgroups | comp.lang.forth |
| Subject | Re: locals |
| Date | 2026-04-27 09:31 +0200 |
| Organization | A noiseless patient Spider |
| Message-ID | <20260427093103.00002db9@tin.it> (permalink) |
| References | (3 earlier) <2026Apr25.084323@mips.complang.tuwien.ac.at> <nnd$22b8fb28$086616c8@3c6198f3bcb67197> <2026Apr25.122216@mips.complang.tuwien.ac.at> <20260425160747.00007f4a@tin.it> <2026Apr26.160303@mips.complang.tuwien.ac.at> |
On Sun, 26 Apr 2026 14:03:03 GMT
anton@mips.complang.tuwien.ac.at (Anton Ertl) wrote:
> 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.
Anton, thanks for running all these tests.
I have now also run them on my Ryzen 9950X.
There is an error in version 6 that i corrected.
2rdrop needs to be after unloop. On lxf64 that uses registers for
loop parameters this is necessary!
version3 does not run as lxf64 does not support defining locals
several times. I will see if this can be changed.
I needed also to change the log-fd to 5 to get it to run.
The tests are run with Debian under WSL2.
Here are the results
lxf64
59.1 10.0 57.6 version0
48.1 10.0 48.4 version2
43.0 10.7 42.5 version4
42.2 9.1 42.2 version5
55.1 9.0 55.0 version6
65.7 8.0 6.0 versionpeter
32.8 9.0 4.2 versionbezemer
lxf
64.2 8.5 64.2 version0
112.3 10.2 90.1 version2
78.8 10.6 75.6 version4
88.1 9.4 88.2 version5
112.2 7.5 114.7 version6
71.0 8.2 7.4 versionpeter
50.9 8.3 4.3 versionbezemer
There is a significant impact in having loop parameters in registers!
version 2 and 6 are interesting for lxf. The full stat gives some more
info. Sorry for the long lines
version 2 compared to version 0
Peter@R9950WSL:/mnt/d/Dev/forth/lxf32v17$ perf stat ./lxf "create version2 100000000 constant iterations include strcmp.4th bench1 bye"
Performance counter stats for './lxf create version2 100000000 constant iterations include strcmp.4th bench1 bye':
1,955.50 msec task-clock:u # 0.998 CPUs utilized
0 context-switches:u # 0.000 /sec
0 cpu-migrations:u # 0.000 /sec
64 page-faults:u # 32.728 /sec
10,973,742,845 cycles:u # 5.612 GHz
966,332,718 stalled-cycles-frontend:u # 8.81% frontend cycles idle
34,901,611,693 instructions:u # 3.18 insn per cycle
# 0.03 stalled cycles per insn
3,900,350,964 branches:u # 1.995 G/sec
36,727 branch-misses:u # 0.00% of all branches
1.960183288 seconds time elapsed
1.955783000 seconds user
0.000000000 seconds sys
peter@R9950WSL:/mnt/d/Dev/forth/lxf32v17$ perf stat ./lxf "create version0 100000000 constant iterations include strcmp.4th bench1 bye"
Performance counter stats for './lxf create version0 100000000 constant iterations include strcmp.4th bench1 bye':
1,158.97 msec task-clock:u # 0.996 CPUs utilized
0 context-switches:u # 0.000 /sec
0 cpu-migrations:u # 0.000 /sec
64 page-faults:u # 55.221 /sec
6,415,119,211 cycles:u # 5.535 GHz
4,510,117 stalled-cycles-frontend:u # 0.07% frontend cycles idle
38,301,605,801 instructions:u # 5.97 insn per cycle
# 0.00 stalled cycles per insn
3,900,348,894 branches:u # 3.365 G/sec
19,563 branch-misses:u # 0.00% of all branches
1.163667408 seconds time elapsed
1.151174000 seconds user
0.007966000 seconds sys
BR
Peter
>
> 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
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