Sujet : Re: Locals revisited
De : dxforth (at) *nospam* gmail.com (dxf)
Groupes : comp.lang.forthDate : 30. Mar 2025, 05:33:52
Autres entêtes
Organisation : i2pn2 (i2pn.org)
Message-ID : <4b84665e38d5a523efc2479f48338ed55d142185@i2pn2.org>
References : 1 2 3 4 5
User-Agent : Mozilla Thunderbird
On 28/03/2025 8:38 pm,
albert@spenarnc.xs4all.nl wrote:
In article <19029ff0c8e7cf53335fe62639308e7f92d10240@i2pn2.org>,
dxf <dxforth@gmail.com> wrote:
On 27/03/2025 11:02 pm, albert@spenarnc.xs4all.nl wrote:
In article <87semzmwok.fsf@nightsong.com>,
Paul Rubin <no.email@nospam.invalid> wrote:
albert@spenarnc.xs4all.nl writes:
In hindsight my locals definition is not convincing, because carnal
knowledge about the behaviour of the return stack is required.
>
It's ok if it's for a specific implementation. But what I'm having
trouble seeing is how the locals get popped in case of an exception.
>
>
I showed it as an example of the pretty convincing usefulness
of CO. For this the example had to have to be portable.
>
A simpler example would be
\ Temporary set some-rounding-mode for the duration of this word.
: rounding set-rounding-mode CO truncate-mode set-rounding-mode ;
...
>
Actually it was that example which caused me to *not* go ahead
and implement ;: in the kernel despite a cost of only one header.
How many calls to 'rounding' will you encounter in an application?
`rounding: is an internal word in the fp package and it is used 4
times.
My guess is one. The usual example is HEX: but I already had (H.N)
that's more flexible. For me at least locals was more credible but
again it fell into a range. For a single use I'd do it manually;
for extensive use (where exceptions etc are likely) a proper locals
may be the only option. OTOH such decision-making is exactly what
Forth has always been about.
>
>
You can't argue with
:NONAME ." Before " .S CO ." After " .S ;
' proc_contains_Heisenbug decorated
Study python for the concept of decoration.
This alone makes CO a worthwhile addition.
I have (D.H) that uses CO. Undoubtedly your (H.N) is more complicated.
Possibly though much of the complication lies in what it needs to do - as
opposed to radix save/restore.
\ Convert unsigned number u to a hexadecimal string c-addr2 u2 in the
\ HOLD buffer beginning with the least-significant digits. Exactly
\ +n hexadecimal characters are returned with any unused positions
\ being filled with character '0'. BASE is preserved.
: (H.N) ( u +n -- c-addr2 u2 )
base @ >r hex <# 0 tuck ?do # loop #> r> base ! ;
\ Misc examples
: (H.) ( u -- adr len ) [ 2 cells ] literal (h.n) ;
: (HW.) ( u -- adr len ) 4 (h.n) ;
: (HB.) ( u -- adr len ) 2 (h.n) ;
: (HD.) ( ud -- adr len )
(h.) holds (h.) [ -2 cells ] literal /string ;
: .HB ( u -- ) 2 (h.n) [char] $ hold #> type space ;
: h.n ( u n -- ) (h.n) type ;
: DUMP ( addr u -- ) \ Dump u bytes in hex and ascii
cr 3 spaces 16 0 do over i + 2 spaces 1 h.n loop
bounds ?do
cr 50 ms halt? if unloop then
i 4 h.n space
16 0 do i j + c@ 2 h.n space loop
16 0 do i j + c@ dup 127 bl within
if drop [char] . then emit
loop
16 +loop ;