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,302 of 117,927   
   Ruvim to dxf   
   Re: QUIT and ABORT   
   07 May 25 21:52:36   
   
   From: ruvim.pinka@gmail.com   
      
   On 2025-05-06 14:12, dxf wrote:   
   > Irrespective of the merits such a change to the spec for THROW would   
   > be not be practical given most systems appear to use ANS' QUIT-based   
   > exception handler.  But for new implementers or the curious here is   
   > how I organised mine and which is readily changeable.   
   >   
   >   
   > \ return to OS with exit code   
   > : RETURN ( code -- ) ... ;   
   >   
   > \ perform ANS QUIT   
   > : (quit) ( -- )  r0 @ rp! reset normal /interpret   
   >    begin cr (refill) drop interpret state? 0= if (vstat)   
   >    @execute then again ;   
   >   
   > \ exit to OS or back to forth   
   > : ?return ( code -- )  turnkey? if return then drop (quit) ;   
      
   Returning to OS can be useful not only for a turnkey program, but also   
   for batch mode, in which the Forth system must return to the OS on any   
   uncaught error.   
      
   A possible use-case in Linux shell:   
      
      ./generate-forth-program params | forth --batch-mode   
      
   since you probably prefer not to interpret the following lines if there   
   an error occurs when defining a word in some line.   
      
      
   >   
   > \ clear data stacks   
   > : (abort) ( i*x -- )  s0 @ sp!  fs0 @ fsp !  1 ?return ;   
   >   
   > \ part of THROW   
   > : error ( n -- )   
   >    -1 of (abort) then   
   >    -2 of boot cell+ @ 0= if .error then   
   >       space errmsg 2@ type (abort) then   
   >    ."  THROW #" @base decimal swap . !base (abort) ;   
   >   
   > : QUIT ( -- )  0 ?return ;  \ QUIT not trapped   
   >   
   > \ QUIT is not trapped in DX-Forth but may be made so by   
   > \ adding  -56 of 1 ?return then  to 'error' and defining   
   > \ : QUIT  -56 throw ;   
      
      
   I use `quit` only for testing and debugging. And I expect to get into   
   the Forth text interpreter (Forth shell) exactly in the current program   
   state (as far as possible).   
      
   If `quit` simply calls `-56 throw`, the program state will probably   
   change (due to actions after `catch` in the program, including restoring   
   the data stack depth in `throw`) when you get into the Forth shell.   
   Also, there is a chance that you will not get into the Forth shell at   
   all if the program does not re-throw the error in some places.   
      
   So I would not recommend the suggested deviation in the `quit` behavior   
   even for new implementers, since this brakes the well-known expectation   
   from `quit`. A better way is to introduce another word with desired   
   behavior deviation.   
      
      
      
   >   
   > : ?ABORT ( flag c-addr u -- )   
   >    rot if errmsg 2! -2 throw then 2drop ;   
   >   
   > : (abort") ( flag -- )  r> count 2dup + >r ?abort ;   
   >   
   > : ABORT"  state @ if postpone (abort") ," end   
   >    postpone s" ?abort ; immediate   
   >   
   > : ABORT  -1 throw ;   
   >   
   >   
      
      
      
   --   
   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