Annotation of gforth/fsl-util.fs, revision 1.1

1.1     ! pazsan      1: \ fsl-utilg.fth      An auxiliary file for the Forth Scientific Library
        !             2: \                    For GForth
        !             3: 
        !             4: \ Contains commonly needed definitions for the FSL modules.
        !             5: 
        !             6: \ S>F  F>S                 conversion between (single) integer and float
        !             7: \ -FROT                    reverse the effect of FROT
        !             8: \ cell-                    back up one cell
        !             9: \ F2DUP                    FDUP two floats
        !            10: \ F2DROP                   FDROP two floats
        !            11: \ PI  F1.0                 floating point constants
        !            12: \ dxor, dor, dand          double xor, or, and
        !            13: \ sd*                      single * double = double_product
        !            14: \ %                        parse next token as a FLOAT
        !            15: \ v: defines use( &        for defining and settting execution vectors
        !            16: \ Public: Private: Reset_Search_Order   control the visibility of words
        !            17: \ INTEGER, DOUBLE          for setting up array types
        !            18: \ ARRAY DARRAY             for declaring static and dynamic arrays
        !            19: \ }                        for getting an ARRAY or DARRAY element address
        !            20: \ &!                       for storing ARRAY aliases in a DARRAY
        !            21: \ PRINT-WIDTH              number of elements per line for printing arrays
        !            22: \ }IPRINT  }FPRINT         print out integer or fp arrays
        !            23: \ }FCOPY                   copy one array into another
        !            24: \ }FPUT                    move values from fp stack into an array
        !            25: \ MATRIX  DMATRIX          for declaring a static or dynamic 2-D array
        !            26: \ }}                       gets a Matrix element address
        !            27: \ }}IPRINT  }}FPRINT       print out an integer or fp matrix
        !            28: \ }}FCOPY                  copy one matrix into another
        !            29: \ }}FPUT                   move values from fp stack into a matrix
        !            30: \ FRAME| |FRAME            set up/remove a local variable frame
        !            31: \ a b c d e f g h          local FVARIABLE values
        !            32: \ &a &b &c &d &e &f &g &h  local FVARIABLE addresses
        !            33: \    The words  F,  F=  F2*  F2/  PI  FLOAT  are already present in Gforth
        !            34: 
        !            35: \ This code is released to the public domain Everett Carter July 1994
        !            36: 
        !            37: \ CR .( FSL-UTILG.FTH    V1.17        12 Jun 1996 10:13:12      EFC )
        !            38: CR .(  fsl-utilg.fth     V2.0         Thursday 16 October 2008  )
        !            39: \    cgm:   reorganized file,
        !            40: \           removed words already in Gforth,
        !            41: \           Gforth DEFER and IS used for vectoring,
        !            42: \           alternative definition for fp locals.
        !            43: 
        !            44: \ The code conforms with ANS requiring:
        !            45: \   1. Words from the wordsets CORE, CORE-EXT, BLOCK-EXT, EXCEPTION-EXT,
        !            46: \       FILE, FLOAT, FLOAT-EXT, LOCAL, SEARCH, SEARCH-EXT, and TOOLS-EXT
        !            47: \   2. Gforth words  Defer  Alias  -rot  float  f,
        !            48: \
        !            49: 
        !            50: BASE @ DECIMAL
        !            51: 
        !            52: \ ================= compilation control =============================
        !            53: 
        !            54: \ for control of conditional compilation of test code
        !            55: FALSE VALUE TEST-CODE?
        !            56: FALSE VALUE ?TEST-CODE          \ obsolete, for backward compatibility
        !            57: 
        !            58: \ for control of conditional compilation of Dynamic memory
        !            59: TRUE CONSTANT HAS-MEMORY-WORDS?
        !            60: 
        !            61: \ ================= FSL NonANS words ================================
        !            62: 
        !            63: : -frot FROT FROT  ;
        !            64: : cell-  [ 1 CELLS ] LITERAL - ;   \ back up one cell
        !            65: : F2DUP   FOVER FOVER ;
        !            66: : F2DROP  FDROP FDROP ;
        !            67: 1.0E0 FCONSTANT F1.0
        !            68: 
        !            69: : dxor  ( d1 d2 -- d )  ROT XOR >R XOR R>  ;          \ double xor
        !            70: : dor   ( d1 d2 -- d )  ROT OR >R OR R>    ;          \ double or
        !            71: : dand  ( d1 d2 -- d )  ROT AND >R AND R>  ;          \ double and
        !            72: 
        !            73: : sd*   ( multiplicand multiplier_double -- product_double )
        !            74:       2 PICK * >R   UM*   R> +  ;                \ single * double = double
        !            75: 
        !            76: : % BL WORD COUNT >FLOAT 0= ABORT" NAN"
        !            77:                   STATE @ IF POSTPONE FLITERAL THEN ; IMMEDIATE
        !            78: 
        !            79: \ ================= function vector definition ======================
        !            80: \  use Forth200x words  DEFER  and  IS  for FSL words  v: and  defines
        !            81: \  defines  is already a synonym for  IS  in Gforth
        !            82: 
        !            83: ' Defer Alias v:
        !            84: 
        !            85: : use(  STATE @ IF POSTPONE ['] ELSE ' THEN ;  IMMEDIATE
        !            86: : &     POSTPONE use( ; IMMEDIATE
        !            87: 
        !            88: \ ================= vocabulary management ===========================
        !            89: 
        !            90: WORDLIST CONSTANT hidden-wordlist
        !            91: 
        !            92: : Reset-Search-Order
        !            93:         FORTH-WORDLIST 1 SET-ORDER
        !            94:         FORTH-WORDLIST SET-CURRENT
        !            95: ;
        !            96: 
        !            97: : Public:
        !            98:         FORTH-WORDLIST hidden-wordlist 2 SET-ORDER
        !            99:         FORTH-WORDLIST SET-CURRENT
        !           100: ;
        !           101: 
        !           102: : Private:
        !           103:         FORTH-WORDLIST hidden-wordlist 2 SET-ORDER
        !           104:         hidden-wordlist SET-CURRENT
        !           105: ;
        !           106: 
        !           107: : Reset_Search_Order   Reset-Search-Order ;     \ for backward compatibility
        !           108: 
        !           109: \ ================= array words =====================================
        !           110: 
        !           111: 0 VALUE TYPE-ID               \ for building structures
        !           112: FALSE VALUE STRUCT-ARRAY?
        !           113: 
        !           114: \ for dynamically allocating a structure or array
        !           115: TRUE  VALUE is-static?     \ TRUE for statically allocated structs and arrays
        !           116: : dynamic ( -- )     FALSE TO is-static? ;
        !           117: 
        !           118: 1 CELLS CONSTANT INTEGER        \ size of a regular integer
        !           119: 2 CELLS CONSTANT DOUBLE         \ size of a double integer
        !           120: \  1 FLOATS CONSTANT FLOAT      \ size of a regular float
        !           121: 1 CELLS CONSTANT POINTER        \ size of a pointer (for readability)
        !           122: 
        !           123: \ 1-D array definition
        !           124: \    -----------------------------
        !           125: \    | cell_size | data area     |
        !           126: \    -----------------------------
        !           127: 
        !           128: : MARRAY ( n cell_size -- | -- addr )             \ monotype array
        !           129:      CREATE
        !           130:        DUP , * ALLOT
        !           131:      DOES> CELL+
        !           132: ;
        !           133: 
        !           134: \    -----------------------------
        !           135: \    | id | cell_size | data area |
        !           136: \    -----------------------------
        !           137: 
        !           138: : SARRAY ( n cell_size -- | -- id addr )          \ structure array
        !           139:      CREATE
        !           140:        TYPE-ID ,
        !           141:        DUP , * ALLOT
        !           142:      DOES> DUP @ SWAP [ 2 CELLS ] LITERAL +
        !           143: ;
        !           144: 
        !           145: : ARRAY
        !           146:      STRUCT-ARRAY? IF   SARRAY FALSE TO STRUCT-ARRAY?
        !           147:                    ELSE MARRAY
        !           148:                    THEN
        !           149: ;
        !           150: 
        !           151: \ word for creation of a dynamic array (no memory allocated)
        !           152: 
        !           153: \ Monotype
        !           154: \    ------------------------
        !           155: \    | data_ptr | cell_size |
        !           156: \    ------------------------
        !           157: 
        !           158: : DMARRAY   ( cell_size -- )  CREATE  0 , ,
        !           159:                               DOES>
        !           160:                                     @ CELL+
        !           161: ;
        !           162: 
        !           163: \ Structures
        !           164: \    ----------------------------
        !           165: \    | data_ptr | cell_size | id |
        !           166: \    ----------------------------
        !           167: 
        !           168: : DSARRAY   ( cell_size -- )  CREATE  0 , , TYPE-ID ,
        !           169:                               DOES>
        !           170:                                     DUP [ 2 CELLS ] LITERAL + @ SWAP
        !           171:                                     @ CELL+
        !           172: ;
        !           173: 
        !           174: : DARRAY   ( cell_size -- )
        !           175:      STRUCT-ARRAY? IF   DSARRAY FALSE TO STRUCT-ARRAY?
        !           176:                    ELSE DMARRAY
        !           177:                    THEN
        !           178: ;
        !           179: 
        !           180: \ word for aliasing arrays,
        !           181: \  typical usage:  a{ & b{ &!  sets b{ to point to a{'s data
        !           182: 
        !           183: : &!    ( addr_a &b -- )
        !           184:         SWAP cell- SWAP >BODY  !
        !           185: ;
        !           186: 
        !           187: 
        !           188: : }   ( addr n -- addr[n])       \ word that fetches 1-D array addresses
        !           189:           OVER [ 1 CELLS ] LITERAL -  @ * + 
        !           190: ;
        !           191: 
        !           192: VARIABLE print-width      6 print-width !
        !           193: 
        !           194: : }iprint ( n addr -- )       \ print n elements of an integer array
        !           195:         SWAP 0 DO I print-width @ MOD 0= I AND IF CR THEN
        !           196:                   DUP I } @ . LOOP
        !           197:         DROP
        !           198: ;
        !           199: 
        !           200: : }fprint ( n addr -- )       \ print n elements of a float array
        !           201:         SWAP 0 DO I print-width @ MOD 0= I AND IF CR THEN
        !           202:                   DUP I } F@ F. LOOP
        !           203:         DROP
        !           204: ;
        !           205: 
        !           206: : }fcopy ( 'src 'dest n -- )         \ copy one array into another
        !           207:      0 DO      OVER I } F@     DUP  I } F!    LOOP
        !           208:         2DROP
        !           209: ;
        !           210: 
        !           211: : }fput ( r1 ... r_n n 'a -- )   \ store r1 ... r_n into array of size n
        !           212:      SWAP DUP 0 ?DO   1- 2DUP 2>R } F! 2R>   LOOP  2DROP ;
        !           213: 
        !           214: \ 2-D array definition,
        !           215: 
        !           216: \ Monotype
        !           217: \    ------------------------------
        !           218: \    | m | cell_size |  data area |
        !           219: \    ------------------------------
        !           220: 
        !           221: : MMATRIX  ( n m size -- )           \ defining word for a 2-d matrix
        !           222:         CREATE
        !           223:            OVER , DUP ,
        !           224:            * * ALLOT
        !           225:         DOES>  [ 2 CELLS ] LITERAL +
        !           226: ;
        !           227: 
        !           228: \ Structures
        !           229: \    -----------------------------------
        !           230: \    | id | m | cell_size |  data area |
        !           231: \    -----------------------------------
        !           232: 
        !           233: : SMATRIX  ( n m size -- )           \ defining word for a 2-d matrix
        !           234:         CREATE TYPE-ID ,
        !           235:            OVER , DUP ,
        !           236:            * * ALLOT
        !           237:         DOES>  DUP @ TO TYPE-ID
        !           238:                [ 3 CELLS ] LITERAL +
        !           239: ;
        !           240: 
        !           241: 
        !           242: : MATRIX  ( n m size -- )           \ defining word for a 2-d matrix
        !           243:      STRUCT-ARRAY? IF   SMATRIX FALSE TO STRUCT-ARRAY?
        !           244:                    ELSE MMATRIX
        !           245:                    THEN
        !           246: ;
        !           247: 
        !           248: : DMATRIX ( size -- )      DARRAY ;
        !           249: 
        !           250: : }}    ( addr i j -- addr[i][j] )    \ word to fetch 2-D array addresses
        !           251:                >R >R
        !           252:                DUP cell- cell- 2@     \ &a[0][0] size m
        !           253:                R> * R> + *
        !           254:                +
        !           255: ;
        !           256: 
        !           257: : }}iprint ( n m addr -- )       \ print nXm elements of an integer 2-D array
        !           258:         ROT ROT SWAP 0 DO    DUP 0 DO    OVER J I  }} @ .
        !           259:                                    LOOP
        !           260:                              CR
        !           261:                        LOOP
        !           262:         2DROP
        !           263: ;
        !           264: 
        !           265: 
        !           266: : }}fprint ( n m addr -- )       \ print nXm elements of a float 2-D array
        !           267:         ROT ROT SWAP 0 DO    DUP 0 DO    OVER J I  }} F@ F.
        !           268:                                    LOOP
        !           269:                              CR
        !           270:                        LOOP
        !           271:         2DROP
        !           272: ;
        !           273: 
        !           274: : }}fcopy ( 'src 'dest n m  -- )      \ copy nXm elements of 2-D array src to dest
        !           275:         SWAP 0 DO    DUP 0 DO    2 PICK J I  }} F@
        !           276:                                  OVER   J I  }} F!
        !           277:                            LOOP
        !           278:                LOOP
        !           279:         DROP 2DROP
        !           280: ;
        !           281: 
        !           282: : }}fput ( r11 r12 ... r_nm  n m 'A -- | store r11 ... r_nm into nxm matrix )
        !           283:       -ROT 2DUP * >R 1- SWAP 1- SWAP }} R> 
        !           284:       0 ?DO  DUP >R F! R> FLOAT -  LOOP  DROP ;
        !           285: 
        !           286: \ ================= Floating-point local variables ==================
        !           287: (
        !           288:   loosely based upon Wil Baden's idea presented at FORML 1992.
        !           289:   The idea is to have a fixed number of variables with fixed names.
        !           290: 
        !           291:   example:  : test  2e 3e FRAME| a b |  a F. b F. |FRAME ;
        !           292:             test <cr> 3.0000 2.0000 ok
        !           293: 
        !           294:   Don't forget to use |FRAME before leaving a word that uses FRAME|.
        !           295: )
        !           296: 
        !           297: 8 CONSTANT /FLOCALS       \ number of variables provided
        !           298: 
        !           299: : (frame) ( n -- ) FLOATS ALLOT ;
        !           300: : (unframe) ( addr -- ) HERE - ALLOT ;
        !           301: 
        !           302: : FRAME|
        !           303:         POSTPONE HERE POSTPONE FALIGN POSTPONE >R
        !           304:         0 >R
        !           305:         BEGIN   BL WORD  COUNT  1 =
        !           306:                 SWAP C@  [CHAR] | =
        !           307:                 AND 0=
        !           308:         WHILE   POSTPONE F,  R> 1+ >R
        !           309:         REPEAT
        !           310:         /FLOCALS R> - DUP 0< ABORT" too many flocals"
        !           311:         POSTPONE LITERAL  POSTPONE (frame) ; IMMEDIATE
        !           312: 
        !           313: : |FRAME ( -- ) POSTPONE R> POSTPONE  (unframe) ; IMMEDIATE
        !           314: 
        !           315: \ use a defining word to build locals   cgm
        !           316: : lcl  ( n -- ) CREATE ,
        !           317:                 DOES>  @ FLOATS NEGATE HERE +
        !           318: ;
        !           319: 
        !           320: 8 lcl &a      7 lcl &b      6 lcl &c      5 lcl &d
        !           321:   : a &a F@ ;   : b &b F@ ;   : c &c F@ ;   : d &d F@ ; 
        !           322: 4 lcl &e      3 lcl &f      2 lcl &g      1 lcl &h
        !           323:   : e &e F@ ;   : f &f F@ ;   : g &g F@ ;   : h &h F@ ; 
        !           324: 
        !           325: BASE !
        !           326: \                   end of file

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