Annotation of gforth/fsl-util.4th, revision 1.1
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:
! 41: \ CR .( FSL-UTILG.FTH $Revision: 1.17 $ $Date: 12 Jun 1996 10:13:12 $ EFC )
! 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:
! 61: : S>F S>D D>F ;
! 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>