( The following sample code comes from the Forth Tutorial ) ( found at www.softsynth.com/pforth/pf_tut.htm and is taken with permission. ) 23 7 9182 . .S 0SP .S \ That's a 'zero' 0, not an 'oh' 0. 777 DUP .S 0SP 23 7 .S SWAP .S SWAP .S OVER .S OVER .S 0SP 11 22 .S DROP .S 0SP 11 22 33 44 .S ROT .S 0SP 14 13 12 11 10 3 PICK . ( prints 13 ) 0 PICK . ( prints 10 ) 4 PICK . 0SP 5 ?DUP 0SP 0 ?DUP 0SP 1 2 3 4 2SWAP 0SP 11 22 33 44 2OVER 0SP 1 2 3 4 2DROP 0SP 5 6 NIP 0SP 10 20 TUCK 0SP 11 22 33 SWAP DUP 0SP 11 22 33 ROT DROP 0SP 11 22 33 ROT DUP 3 PICK 0SP 11 22 33 SWAP OVER 3 PICK 0SP 11 22 33 -ROT 2DUP 0SP 2 3 + . 2 3 + 10 + . 30 5 - . 30 5 / . 30 5 * . 30 5 + 7 / . 10 1- . 7 2* 1+ . 15 5 / . 27 5 / . : AVERAGE ( a b -- avg ) + 2/ ; 10 20 AVERAGE . : TEST ( --) 50 60 AVERAGE . ; TEST 0SP 53 10 /MOD .S 0SP 7 5 MOD .S 56 34 MAX . 56 34 MIN . -17 0 MIN . -17 ABS . 10 NEGATE . -3 NEGATE . 25 3 LSHIFT . 25 2 RSHIFT . : 256* 8 LSHIFT ; 3 256* . 3 4 * 20 + 0SP 20 17 - 12 * . 1 4 -18 * 6 / - . 6 13 * 4 2 * 7 * - . : SQUARE ( N -- N*N ) DUP * ; 5 SQUARE . : DIFF.SQUARES ( A B -- A*A-B*B ) SWAP SQUARE SWAP SQUARE - ; 5 3 DIFF.SQUARES . : AVERAGE4 ( A B C D -- [A+B+C+D]/4 ) + + + ( add'em up) 4/ ; 0SP 1 2 4 5 AVERAGE4 . : HMS>SECONDS ( HOURS MINUTES SECONDS -- TOTAL-SECONDS ) -ROT SWAP ( -- seconds minutes hours ) 60 * + ( -- seconds total-minutes ) 60 * + ( -- seconds ) ; 0SP 2 33 45 HMS>SECONDS . 72 EMIT 105 EMIT CHAR W . CHAR % DUP . EMIT CHAR A DUP . 32 + EMIT : TOFU ." Yummy bean curd!" ; TOFU : SPROUTS ." Miniature vegetables." ; : MENU CR TOFU CR SPROUTS CR ; MENU CR TOFU SPROUTS CR TOFU SPACE SPROUTS CR 10 SPACES TOFU CR 20 SPACES SPROUTS INCLUDE ForthTst.uc TEST.SQUARE VARIABLE MY-VAR MY-VAR . ( normal for this to be different each for test) 513 MY-VAR ! MY-VAR @ . : ? ( address -- , look at variable ) @ . ; MY-VAR ? 123 REPORT.SCORE 9845 REPORT.SCORE 534 REPORT.SCORE 20 MY-VAR ! 5 MY-VAR +! MY-VAR @ . 23 71 = . 18 18 = . 23 198 < . 23 198 > . 254 15 > . : DRINK? ( age -- flag , can this person drink? ) 20 > ; 20 DRINK? . 21 DRINK? . 43 DRINK? . 23 0> . -23 0> . 23 0= . TRUE TRUE OR . TRUE FALSE OR . FALSE FALSE OR . TRUE TRUE AND . TRUE FALSE AND . TRUE . TRUE NOT . 56 3 > 56 123 < AND . 23 45 = 23 23 = OR . : LOWERCASE? ( CHAR -- FLAG , true if lowercase ) DUP 123 < SWAP 96 > AND ; CHAR A LOWERCASE? . CHAR a LOWERCASE? . : .L ( flag -- , print logical value ) IF ." True value on stack!" ELSE ." False value on stack!" THEN ; 0 .L FALSE .L TRUE .L 23 7 < .L 23 .L : BIGBUCKS? ( amount -- ) 1000 > IF ." That's TOO expensive!" THEN ; 531 BIGBUCKS? 1021 BIGBUCKS? VARIABLE ACCOUNT : DEDUCT ( n -- , subtract from account ) ACCOUNT @ ( -- n acc ) SWAP - DUP ACCOUNT ! ( -- acc' , update variable ) ." Balance = $" DUP . CR ( -- acc' ) 0< ( are we broke? ) IF ." Warning!! Your account is overdrawn!" CR THEN ; 300 ACCOUNT ! 40 DEDUCT 200 DEDUCT 100 DEDUCT : COUNTDOWN ( N -- ) BEGIN DUP . CR ( print number on top of stack ) 1- DUP 0< ( loop until we go negative ) UNTIL ; 16 COUNTDOWN 0SP : SPELL ." ba" 4 0 DO ." na" LOOP ; SPELL : .ASCII ( end start -- , dump characters ) DO CR I . I EMIT LOOP CR ; 80 64 .ASCII : SUM.OF.N.1 ( N -- SUM[N] ) 0 SWAP 1+ 0 DO I + LOOP ; 4 SUM.OF.N.1 . 5 SUM.OF.N.1 . : SUM.OF.N.2 0 BEGIN ( -- N' SUM ) OVER + SWAP 1- SWAP OVER 0< UNTIL SWAP DROP ; 4 SUM.OF.N.2 . 5 SUM.OF.N.2 . : SUM.OF.N.3 ( NUM -- SUM[N] , Gauss' method ) DUP 1+ * 2/ ; 4 SUM.OF.N.3 . 5 SUM.OF.N.3 .