home bbs files messages ]

Forums before death by AOL, social media and spammers... "We can't have nice things"

   comp.lang.forth      Forth programmers eat a lot of Bratwurst      117,927 messages   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]

   Message 117,053 of 117,927   
   Ruvim to albert@spenarnc.xs4all.nl   
   Re: Back & Forth - Co-routines   
   03 Feb 25 13:07:36   
   
   From: ruvim.pinka@gmail.com   
      
   On 2025-02-02 15:13, albert@spenarnc.xs4all.nl wrote:   
   > In article , Ruvim     
   wrote:   
   >> On 2025-01-31 11:33, dxf wrote:   
   >>>   
   >>> Not sure if previously mentioned but here's another version of LOCAL   
   >>>   
   >>> : ;:  >r ;   
   >>>   
   >>> : LOCAL ( x adr -- )   
   >>>     r> -rot dup @ over 2>r ! ;: 2r> ! ;   
   >>>   
   >>> variable A  variable B  8 a !  7 b !   
   >>>   
   >>> : divide ( a b -- )  b local  a local   
   >>>     a @  b @  /  . cr  ;   
   >>>   
   >>> 15 3 divide  a ? b ?   
   >>>   
   >>   
   >>   
   >> This approach does not work well with catch/throw. Because `throw` must   
   >> restore the values of all "local" variables that are used in the   
   >> definitions whose execution is being terminated. And this is difficult   
   >> to implement.   
   >>   
   >>   
   >> See also 13.3.3.1, item c,   
   >>    
   >>   
   >> | ABORT shall release all local storage resources,   
   >> | and CATCH / THROW (if implemented) shall release   
   >> | such resources for all definitions whose execution   
   >> | is being terminated.   
   >   
   > Nice catch!   
   >   
   > However, this is highly artificial. You have to have a recursive routine in   
   this   
   > vein:   
   >   
   > RECURSIVE   
   > : fun .. fun ... fun . 'fun CATCH .. fun  ... ;   
   >   
   > otherwise the global VARIABLE's can be ignored.   
   >   
   > I would be interested to see a remotely plausible example of this.   
   > Mixing recursion and exception is ill advised by iq<160.   
      
      
   Recursion is not necessary. It is enough to use the same-name "local"   
   variables in different functions, some of which throw exceptions, and   
   other catch exceptions.   
      
   An artificial example:   
      
      
   : local ( x2 addr1 -- ; R: nest-sys1 -- x1 addr1 nest-sys.xt nest-sys1 )   
      \ This definition assumes that nest-sys size is 1 cell,   
      \ and xt is a subtype of nest-sys   
      r>  ( x2 addr nest-sys1 )   
      over dup @ >r >r  [: 2r> ! ;] >r   
      ( x2 addr1  nest-sys1 ) >r  !   
      
      
      
   : idiv ( n1 n2\0 -- n3  |  n1 0 -- never )   
      dup if / exit then -10 throw   
      
      
   variable a   
   variable b   
      
   : foo ( n1 n2 -- )   
      b local  a local   
      a @  b @  idiv   
      ."  idiv result is " . cr   
      
   : bar ( u1 -- u1 )   
      a local   
      100  a @  ['] foo catch if 2drop then   
      a @   
      
      
   0 bar .   
   \ this must print 0, but will print 10   
      
      
      
   --   
   Ruvim   
      
   --- SoupGate-DOS v1.05   
    * Origin: you cannot sedate... all the things you hate (1:229/2)   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]


(c) 1994,  bbs@darkrealms.ca