Annotation of gforth/fsl-util.4th, revision 1.2

1.1       anton       1: \ fsl-utilg.fth      An auxiliary file for the Forth Scientific Library
                      2: \                    For GForth
                      3: \
                      4: \                       contains commonly needed definitions.
                      5: \ Revisions:
                      6: \      2003-11-16      Fixed bug in }}, added }}FCOPY  KM
                      7: \      2004-02-12      Applied fixes to } and }} given by Marcel Hendrix
                      8: \
                      9: \ dxor, dor, dand       double xor, or, and
                     10: \ sd*                   single * double = double_product
                     11: \ v: defines use( &     For defining and settting execution vectors
                     12: \ %                     Parse next token as a FLOAT
                     13: \ S>F  F>S              Conversion between (single) integer and float
                     14: \ F,                    Store FLOAT at (aligned) HERE
                     15: \ F=                    Test for floating point equality
                     16: \ -FROT                 Reverse the effect of FROT
                     17: \ F2*  F2/              Multiply and divide float by two
                     18: \ F2DUP                 FDUP two floats
                     19: \ F2DROP                FDROP two floats
                     20: \ INTEGER, DOUBLE, FLOAT   For setting up ARRAY types
                     21: \ ARRAY DARRAY              For declaring static and dynamic arrays
                     22: \ }                         For getting an ARRAY or DARRAY element address
                     23: \ &!                        For storing ARRAY aliases in a DARRAY
                     24: \ PRINT-WIDTH               The number of elements per line for printing arrays
                     25: \ }FPRINT                   Print out a given array
                     26: \ Matrix                    For declaring a 2-D array
                     27: \ }}                        gets a Matrix element address
                     28: \ Public: Private: Reset_Search_Order   controls the visibility of words
                     29: \ frame unframe             sets up/removes a local variable frame
                     30: \ a b c d e f g h           local FVARIABLE values
                     31: \ &a &b &c &d &e &f &g &h   local FVARIABLE addresses
                     32: 
                     33: 
                     34: \ This code conforms with ANS requiring:
                     35: \      1. The Floating-Point word set
                     36: \       2. The words umd* umd/mod and d* are implemented
                     37: \          for ThisForth in the file umd.fo
                     38: 
                     39: \ This code is released to the public domain Everett Carter July 1994
                     40: 
1.2     ! dbane      41: \ CR .( FSL-UTILG.FTH    $Revision: 1.1 $       $Date: 2004-05-08 17:14:30 $   EFC )
1.1       anton      42: 
                     43: CR .( FSL-UTIL          V1.17c        12 February 2004  EFC, KM )
                     44: 
                     45: \ ================= compilation control ==============================
                     46: 
                     47: \ for control of conditional compilation of test code
                     48: FALSE VALUE TEST-CODE?
                     49: FALSE VALUE ?TEST-CODE          \ obsolete, for backward compatibility
                     50: 
                     51: 
                     52: \ for control of conditional compilation of Dynamic memory
                     53: TRUE CONSTANT HAS-MEMORY-WORDS?
                     54: 
                     55: \ ====================================================================
                     56: 
                     57: 
                     58: 
                     59: \ FSL NonANS words
                     60: 
1.2     ! dbane      61: [UNDEFINED] S>F [IF] : S>F    S>D D>F ; [THEN]
1.1       anton      62: 
                     63: \ Words to control nested includes.  Use as follows:
                     64: \ C" filename" ~INCLUDED [IF]
                     65: \ FILE: filename
                     66: \ ......the file contents...
                     67: \ [THEN]
                     68: 
                     69: TRUE VALUE verbose_file?       \ true to echo comment string on load
                     70: 
                     71: WORDLIST CONSTANT <file-list>
                     72: 
                     73: \ file name in <file-list>
                     74: : FILE:   <file-list> SET-CURRENT CREATE  FORTH DEFINITIONS
                     75:         [CHAR] ) WORD
                     76:        verbose_file? IF COUNT DUP IF CR TYPE ELSE 2DROP THEN
                     77:                      ELSE DROP THEN
                     78: ;
                     79: 
                     80: \ check for included file name
                     81: : ~INCLUDED  COUNT <file-list> SEARCH-WORDLIST
                     82:              IF DROP FALSE ELSE TRUE THEN
                     83: ;
                     84: 
                     85: 
                     86: WORDLIST CONSTANT hidden-wordlist
                     87: 
                     88: : Reset-Search-Order
                     89:        FORTH-WORDLIST 1 SET-ORDER
                     90:        FORTH-WORDLIST SET-CURRENT
                     91: ;
                     92: 
                     93: : Public:
                     94:        FORTH-WORDLIST hidden-wordlist 2 SET-ORDER
                     95:        FORTH-WORDLIST SET-CURRENT
                     96: ;
                     97: 
                     98: : Private:
                     99:        FORTH-WORDLIST hidden-wordlist 2 SET-ORDER
                    100:        hidden-wordlist SET-CURRENT
                    101: ;
                    102: 
                    103: : Reset_Search_Order   Reset-Search-Order ;     \ these are
                    104: \ : reset-search-order   Reset-Search-Order ;  \ for backward compatibility
                    105: 
                    106: 
                    107: CREATE fsl-pad 84 CHARS ( or more ) ALLOT
                    108: 
                    109: : dxor       ( d1 d2 -- d )             \ double xor
                    110:        ROT XOR >R XOR R>
                    111: ;
                    112: 
                    113: : dor       ( d1 d2 -- d )              \ double or
                    114:        ROT OR >R OR R>
                    115: ;
                    116: 
                    117: : dand     ( d1 d2 -- d )               \ double and
                    118:        ROT AND >R AND R>
                    119: ;
                    120: 
                    121: \ : >=     < 0= ;                        \ greater than or equal to
                    122: 
                    123: \ : <=       > 0= ;                        \ less than or equal to
                    124: 
                    125: \ single * double = double
                    126: : sd*   ( multiplicand  multiplier_double  -- product_double  )
                    127:              2 PICK * >R   UM*   R> +
                    128: ;
                    129: 
                    130: 
                    131: : CELL-    [ 1 CELLS ] LITERAL - ;           \ backup one cell
                    132: 
                    133: 
                    134: 0 VALUE TYPE-ID               \ for building structures
                    135: FALSE VALUE STRUCT-ARRAY?
                    136: 
                    137: \ for dynamically allocating a structure or array
                    138: 
                    139: TRUE  VALUE is-static?     \ TRUE for statically allocated structs and arrays
                    140: : dynamic ( -- )     FALSE TO is-static? ;
                    141: 
                    142: \ size of a regular integer
                    143: 1 CELLS CONSTANT INTEGER
                    144: 
                    145: \ size of a double integer
                    146: 2 CELLS CONSTANT DOUBLE
                    147: 
                    148: \ size of a regular float
                    149: \ 1 FLOATS CONSTANT FLOAT
                    150: 
                    151: \ size of a pointer (for readability)
                    152: 1 CELLS CONSTANT POINTER
                    153: 
                    154: : % BL WORD COUNT >FLOAT 0= ABORT" NAN"
                    155:                   STATE @ IF POSTPONE FLITERAL THEN ; IMMEDIATE
                    156:                   
                    157: \ 3.1415926536E0 FCONSTANT PI
                    158: 1.0E0 FCONSTANT F1.0
                    159: 
                    160: \ 1-D array definition
                    161: \    -----------------------------
                    162: \    | cell_size | data area     |
                    163: \    -----------------------------
                    164: 
                    165: : MARRAY ( n cell_size -- | -- addr )             \ monotype array
                    166:      CREATE
                    167:        DUP , * ALLOT
                    168:      DOES> CELL+
                    169: ;
                    170: 
                    171: \    -----------------------------
                    172: \    | id | cell_size | data area |
                    173: \    -----------------------------
                    174: 
                    175: : SARRAY ( n cell_size -- | -- id addr )          \ structure array
                    176:      CREATE
                    177:        TYPE-ID ,
                    178:        DUP , * ALLOT
                    179:      DOES> DUP @ SWAP [ 2 CELLS ] LITERAL +
                    180: ;
                    181: 
                    182: : ARRAY
                    183:      STRUCT-ARRAY? IF   SARRAY FALSE TO STRUCT-ARRAY?
                    184:                    ELSE MARRAY
                    185:                    THEN
                    186: ;
                    187: 
                    188: 
                    189: \ : Array   ARRAY ;
                    190: 
                    191: \ word for creation of a dynamic array (no memory allocated)
                    192: 
                    193: \ Monotype
                    194: \    ------------------------
                    195: \    | data_ptr | cell_size |
                    196: \    ------------------------
                    197: 
                    198: : DMARRAY   ( cell_size -- )  CREATE  0 , ,
                    199:                               DOES>
                    200:                                     @ CELL+
                    201: ;
                    202: 
                    203: \ Structures
                    204: \    ----------------------------
                    205: \    | data_ptr | cell_size | id |
                    206: \    ----------------------------
                    207: 
                    208: : DSARRAY   ( cell_size -- )  CREATE  0 , , TYPE-ID ,
                    209:                               DOES>
                    210:                                     DUP [ 2 CELLS ] LITERAL + @ SWAP
                    211:                                     @ CELL+
                    212: ;
                    213: 
                    214: 
                    215: : DARRAY   ( cell_size -- )
                    216:      STRUCT-ARRAY? IF   DSARRAY FALSE TO STRUCT-ARRAY?
                    217:                    ELSE DMARRAY
                    218:                    THEN
                    219: ;
                    220: 
                    221: 
                    222: \ word for aliasing arrays,
                    223: \  typical usage:  a{ & b{ &!  sets b{ to point to a{'s data
                    224: 
                    225: : &!    ( addr_a &b -- )
                    226:         SWAP CELL- SWAP >BODY  !
                    227: ;
                    228: 
                    229: 
                    230: : }   ( addr n -- addr[n])       \ word that fetches 1-D array addresses
                    231:           OVER CELL-  @
                    232:           * SWAP + ( ALIGNED FALIGNED )
                    233:          \        ^^^^^^ commented out per bug fix of Marcel Hendrix 2/12/04
                    234: ;
                    235: 
                    236: VARIABLE print-width      6 print-width !
                    237: 
                    238: : }fprint ( n addr -- )       \ print n elements of a float array
                    239:         SWAP 0 DO I print-width @ MOD 0= I AND IF CR THEN
                    240:                   DUP I } F@ F. LOOP
                    241:         DROP
                    242: ;
                    243: 
                    244: : }iprint ( n addr -- )       \ print n elements of an integer array
                    245:         SWAP 0 DO I print-width @ MOD 0= I AND IF CR THEN
                    246:                   DUP I } @ . LOOP
                    247:         DROP
                    248: ;
                    249: 
                    250: : }fcopy ( 'src 'dest n -- )         \ copy one array into another
                    251: 
                    252:      0 DO
                    253:                 OVER I } F@
                    254:                 DUP  I } F!
                    255:           LOOP
                    256: 
                    257:           2DROP
                    258: ;
                    259: 
                    260: \ 2-D array definition,
                    261: 
                    262: \ Monotype
                    263: \    ------------------------------
                    264: \    | m | cell_size |  data area |
                    265: \    ------------------------------
                    266: 
                    267: : MMATRIX  ( n m size -- )           \ defining word for a 2-d matrix
                    268:         CREATE
                    269:            OVER , DUP ,
                    270:            * * ALLOT
                    271:         DOES>  [ 2 CELLS ] LITERAL +
                    272: ;
                    273: 
                    274: \ Structures
                    275: \    -----------------------------------
                    276: \    | id | m | cell_size |  data area |
                    277: \    -----------------------------------
                    278: 
                    279: : SMATRIX  ( n m size -- )           \ defining word for a 2-d matrix
                    280:         CREATE TYPE-ID ,
                    281:            OVER , DUP ,
                    282:            * * ALLOT
                    283:         DOES>  DUP @ TO TYPE-ID
                    284:                [ 3 CELLS ] LITERAL +
                    285: ;
                    286: 
                    287: 
                    288: : MATRIX  ( n m size -- )           \ defining word for a 2-d matrix
                    289:      STRUCT-ARRAY? IF   SMATRIX FALSE TO STRUCT-ARRAY?
                    290:                    ELSE MMATRIX
                    291:                    THEN
                    292: 
                    293: ;
                    294: 
                    295: 
                    296: : DMATRIX ( size -- )      DARRAY ;
                    297: 
                    298: 
                    299: : }}    ( addr i j -- addr[i][j] )    \ word to fetch 2-D array addresses
                    300:                \ 2>R                    \ indices to return stack temporarily
                    301:               \ ^^^ above is bug in v1.17; replaced with line below  KM
                    302:               >R >R
                    303:                DUP CELL- CELL- 2@     \ &a[0][0] size m
                    304:                R> * R> + *
                    305:                +
                    306:                ( ALIGNED FALIGNED ) \ <-- MH bug fix 2/12/04
                    307: ;
                    308: 
                    309: 
                    310: : }}fprint ( n m addr -- )       \ print nXm elements of a float 2-D array
                    311:         ROT ROT SWAP 0 DO
                    312:                          DUP 0 DO
                    313:                                   OVER J I  }} F@ F.
                    314:                          LOOP
                    315: 
                    316:                          CR
                    317:                   LOOP
                    318:         2DROP
                    319: ;
                    320: 
                    321: 
                    322: : }}fcopy ( 'src 'dest n m  -- )      \ copy n×m elements of 2-D array src to dest
                    323:         SWAP 0 DO
                    324:                  DUP 0 DO
                    325:                             2 PICK J I  }} F@
                    326:                             OVER   J I  }} F!
                    327:                         LOOP
                    328:                   LOOP
                    329:         DROP 2DROP
                    330: ;
                    331: 
                    332: 
                    333: \ function vector definition
                    334: 
                    335: \ : noop ; 
                    336: 
                    337: : v: CREATE ['] noop , DOES> @ EXECUTE ;
                    338: : defines   ' >BODY STATE @ IF POSTPONE LITERAL POSTPONE !
                    339:                             ELSE ! THEN ;   IMMEDIATE
                    340: 
                    341: : use(  STATE @ IF POSTPONE ['] ELSE ' THEN ;  IMMEDIATE
                    342: : &     POSTPONE use( ; IMMEDIATE
                    343: 
                    344: 
                    345: 
                    346: (
                    347:   CODE for local fvariables, loosely based upon Wil Baden's idea presented
                    348:   at FORML 1992.
                    349:   The idea is TO have a fixed number OF variables with fixed names.
                    350:   I believe the CODE shown HERE will work with any, CASE insensitive,
                    351:   ANS Forth.
                    352: 
                    353:   i/tForth users are advised TO use FLOCALS| instead.
                    354: 
                    355:   example:  : test  2e 3e FRAME| a b |  a F. b F. |FRAME ;
                    356:             test <cr> 3.0000 2.0000 ok
                    357: 
                    358:   PS: Don't FORGET TO use |FRAME before an EXIT .
                    359: )
                    360: 
                    361: 8 CONSTANT /flocals
                    362: 
                    363: : (frame) ( n -- ) FLOATS ALLOT ;
                    364: 
                    365: : FRAME|
                    366:         0 >R
                    367:         BEGIN   BL WORD  COUNT  1 =
                    368:                 SWAP C@  [CHAR] | =
                    369:                 AND 0=
                    370:         WHILE   POSTPONE F,  R> 1+ >R
                    371:         REPEAT
                    372:         /FLOCALS R> - DUP 0< ABORT" too many flocals"
                    373:         POSTPONE LITERAL  POSTPONE (frame) ; IMMEDIATE
                    374: 
                    375: : |FRAME ( -- ) [ /FLOCALS NEGATE ] LITERAL (FRAME) ;
                    376: 
                    377: : &h            HERE [ 1 FLOATS ] LITERAL - ;
                    378: : &g            HERE [ 2 FLOATS ] LITERAL - ;
                    379: : &f            HERE [ 3 FLOATS ] LITERAL - ;
                    380: : &e            HERE [ 4 FLOATS ] LITERAL - ;
                    381: : &d            HERE [ 5 FLOATS ] LITERAL - ;
                    382: : &c            HERE [ 6 FLOATS ] LITERAL - ;
                    383: : &b            HERE [ 7 FLOATS ] LITERAL - ;
                    384: : &a            HERE [ 8 FLOATS ] LITERAL - ;
                    385: 
                    386: : a             &a F@ ;
                    387: : b             &b F@ ;
                    388: : c             &c F@ ;
                    389: : d             &d F@ ;
                    390: : e             &e F@ ;
                    391: : f             &f F@ ;
                    392: : g             &g F@ ;
                    393: : h             &h F@ ;
                    394: 
                    395: \ stuff from jvn-util.fo
                    396: 
                    397: : FINIT ;

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>