home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / magazine / drdobbs / 1986 / 07 / shaw.jul < prev    next >
Text File  |  1986-07-31  |  13KB  |  379 lines

  1. NOTE: SHOULD SCREENS BE RENUMBERED?????
  2.  
  3.  
  4.  
  5. Listing One
  6.  
  7. B:PAPERS.BLK
  8.  
  9. Screen   12*
  10.  0 \ FORTH-83 Standard type control structures          GWS 86Mar31
  11.  1 \ note: !0 is 0 SWAP !   ADDR, is ,   (S is (
  12.  2 
  13.  3 : >MARK   HERE 2 ALLOT   ;       (S - a )( mark forward branch )
  14.  4 : >RESOLVE   HERE SWAP !   ;    (S a - )( patch forward branch )
  15.  5 : <MARK   HERE   ;       (S - a )( destination for back branch )
  16.  6 : <RESOLVE   ADDR,   ;        (S a - )( compile reference to a )
  17.  7 
  18.  8 VARIABLE LEAVE-LIST
  19.  9 : >MARKLIST     (S a - )( extend list at a, link in dictionary )
  20. 10    HERE SWAP DUP @ ADDR, ( link) ! ( new head) ;
  21. 11 : >RESOLVESLIST       (S a - )( resolve all nodes in a to here )
  22. 12    DUP @ BEGIN   DUP WHILE   DUP @ SWAP >RESOLVE   REPEAT
  23. 13    DROP !0   ;   1 2 +THRU
  24. 14 
  25. 15 
  26.  
  27.  
  28. Screen   13 
  29.  0 \   conditional compilers - if/else/then begin/while GWS 86Mar31
  30.  1 
  31.  2 : IF           (S - a / f - )( compile to branch if f is false )
  32.  3    COMPILE ?BRANCH   >MARK   ; IMMEDIATE
  33.  4 : ELSE        (S a1 - a2 / - )( compile alternate to IF clause )
  34.  5    COMPILE BRANCH   >MARK   SWAP >RESOLVE   ; IMMEDIATE
  35.  6 : THEN          (S a - / - )( resolve latest forward reference )
  36.  7    >RESOLVE   ; IMMEDIATE
  37.  8 
  38.  9 : BEGIN   <MARK   ; IMMEDIATE    (S - a / - )( mark loop start )
  39. 10 : WHILE   [COMPILE] IF   ; IMMEDIATE (S - a / f - )( loop exit )
  40. 11 : REPEAT         (S a1 a2 - / - )( branch to beginning of loop )
  41. 12    COMPILE BRANCH   SWAP <RESOLVE   >RESOLVE   ; IMMEDIATE
  42. 13 : UNTIL (S a - / f - )( branch to beginning of loop until true )
  43. 14    COMPILE ?BRANCH   <RESOLVE   ; IMMEDIATE
  44. 15 
  45.  
  46.  
  47. Screen   14 
  48.  0 \   do loops                                         GWS 86Mar31
  49.  1 
  50.  2 : LEAVE                (S - / - )( compile exit from structure )
  51.  3    COMPILE (LEAVE)   LEAVE-LIST >MARKLIST   ; IMMEDIATE
  52.  4 
  53.  5 : DO               (S - n a / n1 n2 - )( initiate counted loop )
  54.  6    COMPILE (DO)   LEAVE-LIST @   LEAVE-LIST !0   <MARK   ;
  55.  7    IMMEDIATE
  56.  8 : LOOP              (S n a - / - )( compile increment loop end )
  57.  9    COMPILE (LOOP)   <RESOLVE   LEAVE-LIST >RESOLVESLIST
  58. 10    LEAVE-LIST !   ; IMMEDIATE
  59. 11 : +LOOP       (S n a - / u - )( compile u incremented loop end )
  60. 12    COMPILE (+LOOP)   <RESOLVE   LEAVE-LIST >RESOLVESLIST
  61. 13    LEAVE-LIST !   ; IMMEDIATE
  62. 14 
  63. 15 
  64.  
  65.  
  66.  
  67. Listing Two
  68.  
  69. B:PAPERS.BLK
  70.  
  71. Screen   15*
  72.  0 \   typical BEGIN loop extensions                    GWS 86Mar31
  73.  1 
  74.  2 : RESOLVES     (S 0..a - )( resolve forward branches a until 0 )
  75.  3    BEGIN   ?DUP WHILE   >RESOLVE   REPEAT   ;
  76.  4 
  77.  5 : BEGIN   0 <MARK   ; IMMEDIATE    (S 0 a - )( mark loop start )
  78.  6 
  79.  7 : WHILE           (S a1 - a2 a1 / f - )( conditional loop exit )
  80.  8    [COMPILE] IF   SWAP   ; IMMEDIATE
  81.  9 
  82. 10 : REPEAT          (S 0..an a - / - )( terminate repeating loop )
  83. 11    COMPILE BRANCH <RESOLVE   RESOLVES   ; IMMEDIATE
  84. 12 : UNTIL       (S 0..an a - / f - )( terminate conditional loop )
  85. 13    COMPILE ?BRANCH <RESOLVE   RESOLVES   ; IMMEDIATE
  86. 14 
  87. 15 
  88.  
  89.  
  90.  
  91.  
  92. Listing Three
  93.  
  94. B:PAPERS.BLK
  95.  
  96. Screen    3*
  97.  0 \ Proposed Standard Control Structures               GWS 86Mar31
  98.  1 \ note: !0 is 0 SWAP !   ADDR, is ,   (S is (
  99.  2 
  100.  3 : >MARK   HERE 2 ALLOT   ;       (S - a )( mark forward branch )
  101.  4 : >RESOLVE   HERE SWAP !   ;    (S a - )( patch forward branch )
  102.  5 : <MARK   HERE   ;       (S - a )( destination for back branch )
  103.  6 : <RESOLVE   ADDR,   ;        (S a - )( compile reference to a )
  104.  7 
  105.  8 : >MARKLIST     (S a - )( extend list at a, link in dictionary )
  106.  9    HERE SWAP DUP @ ADDR, ( link) ! ( new head) ;
  107. 10 : >RESOLVELIST         (S a - )( resolve top node in a to here )
  108. 11    DUP @ DUP @ ROT ! ( unlink top node) >RESOLVE   ;
  109. 12 : >RESOLVESLIST       (S a - )( resolve all nodes in a to here )
  110. 13    DUP @ BEGIN   DUP WHILE   DUP @ SWAP >RESOLVE   REPEAT
  111. 14    DROP !0   ;   1 6 +THRU
  112. 15 
  113.  
  114.  
  115. Screen    4 
  116.  0 \   compilation list initialization                  GWS 86Mar31
  117.  1 ORPHAN                                   ( make headless words )
  118.  2 VARIABLE IF-LIST   VARIABLE LEAVES-LIST   VARIABLE LEAVE-LIST
  119.  3 VARIABLE LEAVE-CF
  120.  4 : INIT-LISTS                   (S - )( reset all list pointers )
  121.  5    IF-LIST !0   LEAVE-LIST !0   LEAVES-LIST !0   ;
  122.  6 
  123.  7 : SAVE-LISTS        (S - x x x x )( save current list pointers )
  124.  8    LEAVE-CF @   IF-LIST @   LEAVE-LIST @   LEAVES-LIST @
  125.  9    INIT-LISTS   ;
  126. 10 : RESTORE-LISTS  (S - x x x x )( restore current list pointers )
  127. 11   ( could check here for unresolved structures)
  128. 12    LEAVES-LIST !   LEAVE-LIST !   IF-LIST !   LEAVE-CF !   ;
  129. 13 
  130. 14 ADOPT                                      ( make headed words )
  131. 15 
  132.  
  133.  
  134. Screen    5 
  135.  0 \ Conditional compilers - if/else/then & case        GWS 86Mar31
  136.  1 
  137.  2 : IF             (S - / f - )( compile to branch if f is false )
  138.  3    COMPILE ?BRANCH   IF-LIST >MARKLIST   ; IMMEDIATE
  139.  4 : ELSE              (S - / - )( compile alternate to IF clause )
  140.  5    COMPILE BRANCH   IF-LIST >MARKLIST   IF-LIST @ ( if branch)
  141.  6    >RESOLVELIST   ; IMMEDIATE
  142.  7 : THEN            (S - / - )( resolve latest forward reference )
  143.  8    IF-LIST >RESOLVELIST   ; IMMEDIATE
  144.  9 
  145. 10 : CASE        (S - x x x x / ? - ? )( setup for case statement )
  146. 11    SAVE-LISTS   ['] BRANCH LEAVE-CF !   ; IMMEDIATE
  147. 12 : ENDCASE    (S - / x x x x - )( restore lists, resolve leaves )
  148. 13    LEAVES-LIST >RESOLVESLIST   RESTORE-LISTS   ; IMMEDIATE
  149. 14 
  150. 15 
  151.  
  152.  
  153.  
  154.  
  155.  
  156. B:PAPERS.BLK
  157.  
  158. Screen    6*
  159.  0 \   common loop end and exit                         GWS 86Mar31
  160.  1 
  161.  2 ORPHAN                                   ( make headless words )
  162.  3 : LOOPEND       (S x x x x a1 a2 - )( resolve list a2 & branch )
  163.  4 ( a1, restore values x, transfer leaves-list to if-list )
  164.  5    SWAP <RESOLVE ( back branch) >RESOLVESLIST ( forward branch)
  165.  6    LEAVES-LIST @ ?DUP IF   >R   RESTORE-LISTS   IF-LIST @   R@
  166.  7    BEGIN   DUP @ WHILE   @   REPEAT ( find leaves list end) !
  167.  8    ( link to if list) R> IF-LIST !   ELSE   RESTORE-LISTS
  168.  9    THEN   ;
  169. 10 ADOPT                                      ( make headed words )
  170. 11 : OUTSIDE   (S - / - )( allow LEAVES outside current loop level)
  171. 12    IF-LIST @ DUP @ IF-LIST ! ( unlink) LEAVES-LIST @ OVER !
  172. 13    COMPILE-UNNEST   LEAVES-LIST ! ( relink) ; IMMEDIATE
  173. 14 
  174. 15 
  175.  
  176.  
  177.  
  178. Screen    7 
  179.  0 \   do loops                                         GWS 86Mar31
  180.  1 
  181.  2 : LEAVE                (S - / - )( compile exit from structure )
  182.  3    LEAVE-CF @ ADDR,   LEAVE-LIST >MARKLIST   ; IMMEDIATE
  183.  4 : LEAVES         (S - / - )( compile exit to outside structure )
  184.  5    LEAVE-CF @ ADDR,   LEAVES-LIST >MARKLIST   [COMPILE] THEN ;
  185.  6    IMMEDIATE
  186.  7 
  187.  8 : DO           (S - x x x x a / u u - )( initiate counted loop )
  188.  9    SAVE-LISTS   ['] (LEAVE) LEAVE-CF !   COMPILE (DO)
  189. 10    <MARK   ; IMMEDIATE
  190. 11 : LOOP        (S x x x x a - / - )( compile increment loop end )
  191. 12    COMPILE (LOOP)   LEAVE-LIST LOOPEND   ; IMMEDIATE
  192. 13 : +LOOP          (S x x x x x a - / u - )( compile u+ loop end )
  193. 14    COMPILE (+LOOP)   LEAVE-LIST LOOPEND   ; IMMEDIATE
  194. 15 
  195.  
  196.  
  197.  
  198. Screen    8 
  199.  0 \   more loops                                       GWS 86Mar31
  200.  1 
  201.  2 : BEGIN             (S - x x x x a / - )( mark start of a loop )
  202.  3    [COMPILE] CASE   <MARK   ; IMMEDIATE
  203.  4 
  204.  5 : REPEAT        (S x x x x a - / - )( terminate repeating loop )
  205.  6    COMPILE BRANCH   IF-LIST LOOPEND
  206.  7    LEAVE-LIST >RESOLVESLIST   ; IMMEDIATE
  207.  8 : UNTIL         (S x x x x a - / - )( terminate repeating loop )
  208.  9    COMPILE ?BRANCH   IF-LIST LOOPEND
  209. 10    LEAVE-LIST >RESOLVESLIST   ; IMMEDIATE
  210. 11 
  211. 12 : WHILE   [COMPILE] IF   ; IMMEDIATE  (S - )( for compatibility)
  212. 13 
  213. 14 
  214. 15 
  215.  
  216.  
  217.  
  218.  
  219. Listing Four
  220.  
  221. B:PAPERS.BLK
  222.  
  223. Screen    9*
  224.  0 \   suggested extensions                             GWS 86Mar31
  225.  1 
  226.  2 : ?LEAVE                     (S - / f - )( leave do loop if tf )
  227.  3    COMPILE (?LEAVE)   LEAVE-LIST >MARKLIST   ; IMMEDIATE
  228.  4 : ?LEAVES                    (S - / f - )( leave do loop if tf )
  229.  5    COMPILE (?LEAVE)   LEAVES-LIST >MARKLIST   ; IMMEDIATE
  230.  6 
  231.  7 : THENS               (S - / - )(  resolve all outstanding IFs )
  232.  8    IF-LIST >RESOLVESLIST   ; IMMEDIATE
  233.  9 : ELSES  (S - / - )( resolve all outstanding IFs w/common ELSE )
  234. 10    [COMPILE] ELSE   IF-LIST @ >RESOLVESLIST   ; IMMEDIATE
  235. 11 
  236. 12 
  237. 13 
  238. 14 
  239. 15 
  240.  
  241.  
  242.  
  243.  
  244.  
  245.  
  246. Listing Five
  247.  
  248. Previously Proposed Solutions          Proposed Solution
  249.  
  250. BEGIN ...                              same
  251.    WHILE ...
  252.    WHILE ...
  253.    ...
  254. REPEAT
  255.  
  256.  
  257. BEGIN ...                              same
  258.    WHILE ...
  259.    WHILE ...
  260.    ...
  261. UNTIL
  262.  
  263.  
  264. BEGIN ...                              BEGIN ...
  265.    WHILE ...                              WHILE
  266.    ANDWHILE ...                           WHILE
  267.    ANDWHILE ...                           WHILE
  268.    ...                                    ...
  269. REPEAT                                 REPEAT
  270.  
  271.  
  272. BEGIN ...                              BEGIN ...
  273.    WHILE   aa                             NOT IF   ff   LEAVES   aa
  274.    WHILE   bb                             NOT IF   ee   LEAVES   bb
  275.    WHILE   cc                             WHILE   cc
  276.    ...                                    ...
  277. REPEAT   dd                            REPEAT   dd
  278.    <WHILE   ee
  279.    <WHILE   ff
  280. <END                                   THEN   THEN
  281.  
  282.  
  283. BEGIN ...                              see below
  284.    IF ... LEAVE THEN
  285.    IF ... LEAVE THEN
  286.    ...
  287. REPEAT
  288.  
  289. BEGIN ...                              BEGIN ...
  290.    UNLESS ... FINISH                      IF ... LEAVES
  291.    UNLESS ... FINISH                      IF ... LEAVES
  292.    ...
  293. AGAIN                                  REPEAT THEN THEN
  294.  
  295. DO ...                                 DO ...
  296.    PERHAPS ... ESCAPE                     IF ... LEAVES
  297.    PERHAPS ... ESCAPE                     IF ... LEAVES
  298.    ...                                    ...
  299. LOOP ...                               LOOP ...
  300. ESCAPED ...                            THEN THEN ... (or ELSE ... THEN)
  301.  
  302.  
  303. DO ...                                 DO ...
  304.    IF ... LEAVE THEN   aa                 IF ... LEAVES   aa
  305. LOOP--FALLTHRU:   bb                   LOOP   bb
  306. THEN   cc                              THEN   cc
  307.  
  308.  
  309. DO ...                                 DO ...
  310.    WHEN ...                               NOT IF   LEAVE THEN ...
  311. LOOP                                   LOOP
  312.  
  313.  
  314. DO ...                                 DO ...
  315.    NOTWHEN ...                            IF   LEAVE THEN ...
  316. LOOP                                   LOOP
  317.  
  318.  
  319. DO ...                                 DO ...
  320.    IF   LEAVE THEN ...                    IF   LEAVES
  321. EXITING LOOP                           LOOP
  322. ...                                    ...
  323. THEN                                   THEN
  324.  
  325.  
  326. none                                   DO ...
  327.                                           DO ...
  328.                                              IF   LEAVES
  329.                                              ...
  330.                                           LOOP OUTSIDE
  331.                                        LOOP
  332.                                        ...
  333.                                        THEN
  334.  
  335.  
  336. none                                   BEGIN ...
  337.                                           BEGIN ...
  338.                                              IF   LEAVES
  339.                                              ...
  340.                                           REPEAT OUTSIDE
  341.                                        REPEAT
  342.                                        ...
  343.                                        THEN
  344.  
  345.  
  346. <STEPS ...                             CASE
  347.    &IF ...                                IF ...
  348.    &IF ...                                IF ...
  349. STEPS>                                    THENS
  350.                                        ENDCASE
  351.  
  352.  
  353. IF ... ELSE ...                        IF ... ELSE ...
  354. THENIF ... ELSE                        IF ... ELSE ...
  355. THENIF ... ELSE                        IF ... ELSE ...
  356. ...                                    ...
  357. THEN                                   THENS   or
  358.  
  359.                                        CASE
  360.                                           IF ... LEAVES
  361.                                           IF ... LEAVES
  362.                                           ...
  363.                                        ENDCASE
  364.  
  365. IF ...                                 IF ...
  366.    ANDIF ...                              IF ...
  367.       ANDIF ...                              IF ...
  368.       ...                                    ...
  369. ( ELSE)                                ( ELSES)
  370. THEN                                   THENS ( THEN)
  371.  
  372.  
  373. CASE ...                               CASE ...
  374.    OF ... ENDOF                           OVER = IF ... LEAVES
  375.    OF ... ENDOF                           OVER = IF ... LEAVES
  376.    ...                                    ...
  377. ENDCASE                                DROP ENDCASE
  378.  
  379.