[comp.lang.forth] Comments on START:

ir230@sdcc6.ucsd.edu (john wavrik) (09/14/90)

John Hayes recently posted information on the new word START: and
asked for comments. I would like to show how two fairly common and 
substantial problems are solved with it.

For those using traditional Forth systems, the definition of
START: is
           : START:  HERE  DOCOL  ,  ; 

Where DOCOL is the address of the inner interpreter. It can be 
defined by  ' : @  CONSTANT DOCOL.

I. [: and ;]
   Late last year I posted code for this pair of words and gave 
   examples of their use. They work like : and ;. They compile the 
   code between them but they do not generate a header -- instead they 
   return the CFA of the generated code. They are state smart.
   
   The original use of these words was to make it easy to generate a 
   family of special words which are obtained from a general word by 
   changing the runtime environment (which may depend on executable as 
   well as numerical parameters).

              : SPECIAL  ( *  Runtime Environment *)
                          [: ..special code 1 ;]
                          [: ..special code 2 ;]
                               .....
                          n1 n2 ...  ( numerical parameters )
                         ( *  End of Runtime Environment * )
                          GENERAL-WORD ;

   (Imagine, for example, a collection of sorting programs all derived 
   from a general template by changing parameters describing the 
   comparison function, how data items are exchange, how they are 
   stored, etc.)

   The code posted last year was this:

   Blk # 1                        File: environs.blk
     0.  \     Headerless code fragments                04Nov88jjw
     1.  \   Use like : and ;  --  they return the cfa of the code
     2.
     3.  VARIABLE OSTATE      ' : @ CONSTANT DOCOL
     4.  : <[:>   R> DUP @ >R  2+  ;
     5.
     6.  : [:   STATE @  DUP OSTATE !
     7.            IF    COMPILE <[:>  ?>MARK  DOCOL ,
     8.            ELSE  HERE DOCOL ,  !CSP ]    THEN ; IMMEDIATE
     9.
    10.  : ;]   OSTATE @
    11.            IF    COMPILE EXIT ?>RESOLVE
    12.            ELSE  ?CSP  COMPILE EXIT
    13.                  [COMPILE] [             THEN ; IMMEDIATE
    14.
    15.

    This code assumes a traditional Forth (indirect threaded code, IP sent 
    to the return stack, HERE marks the start of code, etc.). Using START:
    these words can be coded this.

    : [:  STATE @ DUP OSTATE !
          IF  POSTPONE FALSE  POSTPONE IF  START:
          ELSE  START: ]  THEN  ;  IMMEDIATE
    
    : ;]  POSTPONE EXIT   OSTATE @
          IF  >R  POSTPONE THEN R>  POSTPONE LITERAL
          ELSE  POSTPONE [  THEN ;  IMMEDIATE

    Therefore this structure will be portable in the proposed ANSI 
    Standards. (John Hayes gets the credit for suggesting the replacement 
    of the inline handler <[:> by an IF .. THEN control structure). 
  
II. Inline Data Handlers
   
   Some are disturbed by what they regard as the dual pre/postfix 
   nature of Forth. There is a very simple rule for making sense of 
   this:
   
   RULE:  You know what the interpreter is going to do with a string.
          If that's not what you want done, you must precede the 
          string by a handler. 
   
          (Simiarly numbers in a dictionary body which are not 
          addresses to be executed are preceded by a handler.)

   Here is an example from a system designed to handle very large
   integers and rationals (BIGNUMS).

   v%  123456789
   dup v*  v. 15241578750190521  
     
   q% 1/2  q% 1/3  q+ q. 5/6  
   q% 1/2  q% 2/3  q* q. 1/3  
   
   : pi  q% 355/113 ;  
   pi q. 355/113  
   v1 v.
     
   vnum 20!  
   : factorials  v1 21 1 do  i . 2 spaces
                             i s>v v*
                             dup v. cr
                         loop  20! vmove  ;  

   factorials
   20! v. 2432902008176640000  
   20! dup v* v. 5919012181389927685417441689600000000  
   
   In this language integer operations are prefaced by v (v+, v. etc)
   and rational number operations by q. v% and q% are handlers for 
   these data types. The handler converts a string to a big integer.
   When used in interpretation, a pointer to the data (in its 
   converted form) is return to the stack. If used during compilation
   the internal representation is stored in the dictionary preceded by 
   a handler VLIT. This is precisely how traditional Forth handles its 
   standard numerical types. Here are the definitions in tradition 
   Forth.
   
   
     4 : VLIT  R> DUP VSIZE + >R  ;
     5 : V%  STATE @  IF  COMPILE VLIT  BL WORD VNUMBER
     6                    HERE VSIZE ALLOT VMOVE
     7                ELSE  BL WORD VNUMBER  THEN ;  IMMEDIATE

   The same assumptions are made about how Forth works as are made 
   above.

   In this case, too, START: allows the handler V% to be defined 
   portably in the proposed ANSI Standard.

     2 : V%  STATE @
     3       IF   POSTPONE FALSE   POSTPONE IF  START:  >BODY
     4            BL WORD VNUMBER   VSIZE ALLOT
     5            OVER VMOVE  >R   POSTPONE THEN  R>
     6            POSTPONE LITERAL
     7       ELSE  BL WORD VNUMBER   THEN  ;  IMMEDIATE

 I think that there is some reason to be enthusiastic about John 
Hayes' efforts in getting this word accepted.

 It would be excessive to claim that this solves all the major 
problems of designing application oriented programming languages. 
But it is fair to say that it provides ANSI Forth with a little more 
of the power that traditional Forth has.

                                                  John J Wavrik 
             jjwavrik@ucsd.edu                    Dept of Math  C-012 
                                                  Univ of Calif - San Diego 
                                                  La Jolla, CA  92093 

dwp@willett.pgh.pa.us (Doug Philips) (09/19/90)

In <12658@sdcc6.ucsd.edu>, ir230@sdcc6.ucsd.edu (john wavrik) writes:
> II. Inline Data Handlers
>    
>    Some are disturbed by what they regard as the dual pre/postfix 
>    nature of Forth. There is a very simple rule for making sense of 
>    this:
>    
>    RULE:  You know what the interpreter is going to do with a string.
>           If that's not what you want done, you must precede the 
>           string by a handler. 
>    
>           (Simiarly numbers in a dictionary body which are not 
>           addresses to be executed are preceded by a handler.)

The RULE you state is good for deciding how to write more prefix words.
However, the reason your RULE fails to quell the disquiet is because of an
equivocation about "the dual pre/postfix nature of Forth."  As you have
pointed out extremely effectively in previous messages, one of Forth's
strong points is in being a "language lab".  I have no qualms with
an increasing proliferation of prefix words in the derived application.
My concern is with the duality in the core of Forth itself.

-Doug
---
Preferred:  dwp@willett.pgh.pa.us    Daily:  {uunet,nfsun}!willett!dwp