From: dxforth@gmail.com   
      
   On 28/03/2025 8:38 pm, albert@spenarnc.xs4all.nl wrote:   
   > In article <19029ff0c8e7cf53335fe62639308e7f92d10240@i2pn2.org>,   
   > dxf wrote:   
   >> On 27/03/2025 11:02 pm, albert@spenarnc.xs4all.nl wrote:   
   >>> In article <87semzmwok.fsf@nightsong.com>,   
   >>> Paul Rubin 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 ;   
      
   --- SoupGate-DOS v1.05   
    * Origin: you cannot sedate... all the things you hate (1:229/2)   
|