Anton,

Although the comp.lang.forth discussion has taken a different path, here is the changes I mentioned.

DaR

diff -u ttester-HEAD.fs ttester.fs
--- ttester-HEAD.fs     2008-02-25 15:59:54.000000000 -0700
+++ ttester.fs  2008-02-25 15:55:25.000000000 -0700
@@ -67,8 +67,8 @@
 VARIABLE VERBOSE
    FALSE VERBOSE !

-VARIABLE ACTUAL-DEPTH                  \ STACK RECORD
-CREATE ACTUAL-RESULTS 20 CELLS ALLOT
+CREATE ACTUAL-RESULTS 21 CELLS ALLOT
+CREATE EXPECT-RESULTS 21 CELLS ALLOT
 VARIABLE START-DEPTH
 VARIABLE XCURSOR \ FOR ...}T
 VARIABLE ERROR-XT
@@ -155,8 +155,8 @@
 [THEN]

 HAS-FLOATING-STACK [IF]
-    VARIABLE ACTUAL-FDEPTH
-    CREATE ACTUAL-FRESULTS 20 FLOATS ALLOT
+    CREATE ACTUAL-FRESULTS 21 FLOATS ALLOT
+    CREATE EXPECT-FRESULTS 21 FLOATS ALLOT
     VARIABLE START-FDEPTH
     VARIABLE FCURSOR

@@ -168,30 +168,42 @@
             FDEPTH START-FDEPTH @ DO FDROP LOOP
         THEN ;

+ : SAVE-FSTACK ( ... addr -- ) \ Save stack contents (up to 20 items) at addr.
+        DUP >R FDEPTH DUP S>D D>F R> F!      \ Record depth
+        DUP 0 20 WITHIN 0= ABORT" Invalid DEPTH"
+        ?DUP IF                              \ If something is on stack
+            0 DO                             \ For each stack item
+                FLOAT+ DUP >R F! R>          \ Save them
+        LOOP THEN DROP ;
+
+    : SHOW-FSTACK ( addr -- ... ) \ Display saved stack contents.
+        ." -> " DUP @                        \ Get depth
+        DUP 0 20 WITHIN 0= ABORT" Invalid DEPTH"
+ ?DUP IF \ If something was on stack
+            SWAP OVER FLOATS +
+            SWAP 0 DO                        \ For each stack item
+                DUP F@ F. 1 FLOATS -         \ Display them
+        LOOP THEN DROP ." <- Top " CR ;
+
     : F{ ( -- )
         FDEPTH START-FDEPTH ! 0 FCURSOR ! ;

-    : F-> ( ... -- ... )
-        FDEPTH DUP ACTUAL-FDEPTH !
-        START-FDEPTH @ > IF
- FDEPTH START-FDEPTH @ - 0 DO ACTUAL-FRESULTS I FLOATS + F! LOOP
-        THEN ;
+    : F-> ( ... -- ... )   ACTUAL-FRESULTS SAVE-FSTACK ;

     : F} ( ... -- ... )
-        FDEPTH ACTUAL-FDEPTH @ = IF
-            FDEPTH START-FDEPTH @ > IF
-                FDEPTH START-FDEPTH @ - 0 DO
-                    ACTUAL-FRESULTS I FLOATS + F@ FCONF= INVERT IF
-                        S" INCORRECT FP RESULT: " ERROR LEAVE
-                    THEN
-                LOOP
-            THEN
-        ELSE
-            S" WRONG NUMBER OF FP RESULTS: " ERROR
-        THEN ;
+        EXPECT-FRESULTS FDEPTH >R SAVE-FSTACK
+        EXPECT-FRESULTS ACTUAL-FRESULTS
+        R> 0 ?DO
+            OVER I FLOATS + F@
+            OVER I FLOATS + F@ FCONF= INVERT IF  \ If not the same
+                S" INCORRECT FP RESULT: " ERROR
+                ." ACTUAL: " ACTUAL-FRESULTS SHOW-FSTACK
+                ." EXPECT: " EXPECT-FRESULTS SHOW-FSTACK
+                0 0 LEAVE
+        THEN LOOP 2DROP ;

     : F...}T ( -- )
-        FCURSOR @ START-FDEPTH @ + ACTUAL-FDEPTH @ <> IF
+        FCURSOR @ START-FDEPTH @ + ACTUAL-FRESULTS @ <> IF
S" NUMBER OF FLOAT RESULTS BEFORE '->' DOES NOT MATCH ...}T SPRECIFICATION: " ERROR
         ELSE FDEPTH START-FDEPTH @ = 0= IF
S" NUMBER OF FLOAT RESULTS BEFORE AND AFTER '->' DOES NOT MATCH: " ERROR
@@ -199,9 +211,9 @@


     : FTESTER ( R -- )
-        FDEPTH 0= ACTUAL-FDEPTH @ FCURSOR @ START-FDEPTH @ + 1+ < OR IF
+ FDEPTH 0= ACTUAL-FRESULTS @ FCURSOR @ START-FDEPTH @ + 1+ < OR IF S" NUMBER OF FLOAT RESULTS AFTER '->' BELOW ...}T SPECIFICATION: " ERROR
-        ELSE ACTUAL-FRESULTS FCURSOR @ FLOATS + F@ FCONF= 0= IF
+        ELSE ACTUAL-FRESULTS FCURSOR @ 1+ FLOATS + F@ FCONF= 0= IF
             S" INCORRECT FP RESULT: " ERROR
         THEN THEN
         1 FCURSOR +! ;
@@ -221,9 +233,9 @@
     COMPUTE-CELLS-PER-FP CONSTANT CELLS-PER-FP

     : FTESTER ( R -- )
- DEPTH CELLS-PER-FP < ACTUAL-DEPTH @ XCURSOR @ START-DEPTH @ + CELLS-PER-FP + < OR IF + DEPTH CELLS-PER-FP < ACTUAL-RESULTS @ XCURSOR @ START-DEPTH @ + CELLS-PER-FP + < OR IF S" NUMBER OF RESULTS AFTER '->' BELOW ...}T SPECIFICATION: " ERROR EXIT
-        ELSE ACTUAL-RESULTS XCURSOR @ CELLS + F@ FCONF= 0= IF
+        ELSE ACTUAL-RESULTS XCURSOR @ 1+ CELLS + F@ FCONF= 0= IF
             S" INCORRECT FP RESULT: " ERROR
         THEN THEN
         CELLS-PER-FP XCURSOR +! ;
@@ -238,6 +250,23 @@
     THEN
     EMPTY-FSTACK ;

+: SAVE-STACK ( ... addr -- ) \ Save stack contents (up to 64 items) at addr.
+   DEPTH 1- 2DUP SWAP !                 \ Record depth
+   DUP 0 20 WITHIN 0= ABORT" Invalid DEPTH"
+   ?DUP IF                              \ If something is on stack
+      0 DO                              \ For each stack item
+         CELL+ TUCK !                   \ Save them
+   LOOP THEN DROP ;
+
+: SHOW-STACK ( addr -- ... ) \ Display saved stack contents.
+   ." -> " DUP @                        \ Get depth
+   DUP 0 20 WITHIN 0= ABORT" Invalid DEPTH"
+   ?DUP IF                              \ If something was on stack
+      SWAP OVER CELLS +
+      SWAP 0 DO                         \ For each stack item
+         DUP ? 1 CELLS -                \ Display them
+   LOOP THEN DROP ." <- Top " CR ;
+
 : ERROR1       \ ( C-ADDR U -- ) DISPLAY AN ERROR MESSAGE FOLLOWED BY
                \ THE LINE THAT HAD THE ERROR.
TYPE SOURCE TYPE CR \ DISPLAY LINE CORRESPONDING TO ERROR
@@ -250,28 +279,24 @@
    DEPTH START-DEPTH ! 0 XCURSOR ! F{ ;

 : ->           \ ( ... -- ) RECORD DEPTH AND CONTENT OF STACK.
-   DEPTH DUP ACTUAL-DEPTH !            \ RECORD DEPTH
-   START-DEPTH @ > IF          \ IF THERE IS SOMETHING ON STACK
- DEPTH START-DEPTH @ - 0 DO ACTUAL-RESULTS I CELLS + ! LOOP \ SAVE THEM
-   THEN
+   ACTUAL-RESULTS SAVE-STACK
    F-> ;

: }T \ ( ... -- ) COMPARE STACK (EXPECTED) CONTENTS WITH SAVED
-               \ (ACTUAL) CONTENTS.
-   DEPTH ACTUAL-DEPTH @ = IF           \ IF DEPTHS MATCH
- DEPTH START-DEPTH @ > IF \ IF THERE IS SOMETHING ON THE STACK
-         DEPTH START-DEPTH @ - 0 DO    \ FOR EACH STACK ITEM
-           ACTUAL-RESULTS I CELLS + @  \ COMPARE ACTUAL WITH EXPECTED
-           <> IF S" INCORRECT RESULT: " ERROR LEAVE THEN
-        LOOP
-      THEN
-   ELSE                                        \ DEPTH MISMATCH
-      S" WRONG NUMBER OF RESULTS: " ERROR
-   THEN
+   EXPECT-RESULTS DEPTH >R SAVE-STACK
+   EXPECT-RESULTS ACTUAL-RESULTS
+   R> 0 DO
+      OVER I CELLS + @
+      OVER I CELLS + @ - IF             \ If not the same
+         S" INCORRECT RESULT: " ERROR
+         ." ACTUAL: " ACTUAL-RESULTS SHOW-STACK
+         ." EXPECT: " EXPECT-RESULTS SHOW-STACK
+         0 0 LEAVE
+   THEN LOOP 2DROP
    F} ;

 : ...}T ( -- )
-    XCURSOR @ START-DEPTH @ + ACTUAL-DEPTH @ <> IF
+    XCURSOR @ START-DEPTH @ + ACTUAL-RESULTS @ <> IF
S" NUMBER OF CELL RESULTS BEFORE '->' DOES NOT MATCH ...}T SPECIFICATION: " ERROR
     ELSE DEPTH START-DEPTH @ = 0= IF
S" NUMBER OF CELL RESULTS BEFORE AND AFTER '->' DOES NOT MATCH: " ERROR
@@ -279,9 +304,9 @@
     F...}T ;

 : XTESTER ( X -- )
-    DEPTH 0= ACTUAL-DEPTH @ XCURSOR @ START-DEPTH @ + 1+ < OR IF
+    DEPTH 0= ACTUAL-RESULTS @ XCURSOR @ START-DEPTH @ + 1+ < OR IF
S" NUMBER OF CELL RESULTS AFTER '->' BELOW ...}T SPECIFICATION: " ERROR EXIT
-    ELSE ACTUAL-RESULTS XCURSOR @ CELLS + @ <> IF
+    ELSE ACTUAL-RESULTS XCURSOR @ 1+ CELLS + @ <> IF
         S" INCORRECT CELL RESULT: " ERROR
     THEN THEN
     1 XCURSOR +! ;


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to