GEnie@willett.UUCP (ForthNet articles from GEnie) (12/22/89)
Message 15 Thu Dec 21, 1989 R.BERKEY [Robert] at 05:02 PST To: Dan Miller Re: Forth-83 coded do-loop built on for-next opcode Here's a Forth-83 version which should work on TFORTH. ( Block 1 ) ( Forth-83 do-loop built on Harris for-next opcode ) : (DO) ( limit index -- for-index index-offset ) OVER >R - 1- R> 1- ; : DO ( runtime: limit index -- ) COMPILE (DO) COMPILE >R [COMPILE] FOR ; IMMEDIATE : LOOP ( runtime: -- ;R x1 x2 -- x1 x2 | x1 x2 -- ) [COMPILE] NEXT COMPILE R> COMPILE DROP ; IMMEDIATE : I ( -- x ) COMPILE 2R@ COMPILE - ; IMMEDIATE \ An immediate I is non-compliant with the Forth-83 Standard The immediacy here is due to my ignorance of the chip. Any assembly-level RTX programmer should be able fix this. There's probably several ways to improve on the speed of the I given here. ---------------------------------------------------------------- ---------------------------------------------------------------- The TFORTH loop implementation helps explain things. The problem is I needs to have two different behaviours. Since both are tied to the for-next opcode, the options are more limited than on an 8086. Implementors can either play compiler games, slow down the FOR-NEXT I , or do what TFORTH did: slow down do-loop. Or, the simple solution is to use another name for the loop index with FOR-NEXT. Who would object to say H , for example? ---------------------------------- ' R@ ALIAS H \ The simple solution \ (Whether or not TFORTH has ALIAS isn't the point.) ---------------------------------- \ A supports-existing-FOR-I-NEXT-source-code solution ( Block 2 ) ( I compatible with both do-loop and for-next ) ( For RTX chip with for-next opcode ) VARIABLE I? \ Contains the current I compile state : I I? @ IF [COMPILE] I ELSE COMPILE R@ THEN ; IMMEDIATE \ An immediate I is non-compliant with the Forth-83 Standard \ Note that if the previous I is made non-immediate \ the [COMPILE] needs to be changed here to COMPILE : FOR I? @ FALSE I? ! [COMPILE] FOR ; IMMEDIATE : DO I? @ TRUE I? ! [COMPILE] DO ; IMMEDIATE : NEXT [COMPILE] NEXT I? ! ; IMMEDIATE : LOOP [COMPILE] LOOP I? ! ; IMMEDIATE : +LOOP [COMPILE] +LOOP I? ! ; IMMEDIATE ---------- ------------ ----- This message came from GEnie via willett through a semi-automated program. Report problems to: 'uunet!willett!dwp' or 'willett!dwp@gateway.sei.cmu.edu'