Path: utzoo!attcan!uunet!willett!ForthNet From: ForthNet@willett.UUCP (ForthNet articles from GEnie) Newsgroups: comp.lang.forth Subject: All Sorts of Sorts Message-ID: <645.UUL1.3#5129@willett.UUCP> Date: 12 Mar 90 04:01:20 GMT Organization: Latest link in the ForthNet chain. (Pgh, PA) Lines: 106 Category 3, Topic 37 Message 33 Sun Mar 11, 1990 F.SERGEANT [Frank] at 10:41 CST Ian, you asked about nested FOR-NEXT loops. Suppose we have a two dimensional array of quarterly net profit figures for the years 1970 thru 1975. Suppose further that we made very small profits (so they will fit in 16-bits). We'll hard-code the values to start with. CREATE PROFITS ( year 1stQ 2ndQ 3rdQ 4thQ ) ( 1970) 10 , 5 , 3 , 7 , ( each entry takes 2 bytes) ( 1971) 8 , 9 , -3 , -4 , ( each year takes 8 bytes) ( 1972) 2 , 3 , 4 , 8 , ( 1973) 6 , 6 , 6 , 6 , ( 1974) 5 , 3 , 3 , -7 , ( 1975) 12 , 11 , 9 , 10 , We can address the array various ways. Suppose we want to say 3rdQ 1972 PROFIT and thereby place the number 4 on the stack. We could do it with the following definitions: 1 CONSTANT 1stQ 2 CONSTANT 2ndQ 3 CONSTANT 3rdQ 4 CONSTANT 4thQ : PROFIT ( quarter year - n) 1970 - 8 * ( quarter offset-to-start-of-the-year) 1- SWAP 2* + ( offset-to-quarter) PROFITS ( offset-to-quarter starting-addr-of-the-array) + @ ; ( profit-for-the-quarter) In memory, if you were to dump the contents of the array, on a PC with Intel-like byte order, you would see HEX PROFITS DUMP DUMP DUMP ( one way to do it in Pygmy) XXXX 0A 00 05 00 03 00 07 00 08 00 09 00 FD FF FC FF XXXX 02 00 03 00 04 00 08 00 06 00 06 00 06 00 06 00 XXXX 05 00 03 00 03 00 F9 FF 0C 00 0B 00 09 00 0A 00 (The XXXXs stand for the actual addresses where the array is stored.) Now let's step thru the entire array using FOR-NEXT loops. : PRINT-PROFITS ( -) CR ." Quarterly Profits for 6 Years" CR CR 1970 ( starting-year) 5 FOR ( we'll do this outer loop 6 times) 1 ( starting-quarter) 3 FOR ( we'll do this inner loop 4 times) ( year quarter) 2DUP SWAP ( y q q y) PROFIT ( y q profit) . ( y q ) ( year old-quarter) 1+ ( year new-quarter) NEXT ( old-year old-quarter) DROP ( old-year) 1+ ( new-year) CR ( so each year will get a separate line) NEXT DROP ( ) ; Notice that I have used nested loops, but I haven't used the built in "control variables" named 'I' and perhaps 'J'. But, I have used control variables that are kept on the stack. The above should work in Pygmy ver 1.2 and with most Forths that have FOR- NEXT. My latest thinking is that I prefer 5 FOR to do it 5 times, not 6, so I have changed my copy of Pygmy to do it the new way. Robert Berkey thinks we should call the new word ?FOR. Pygmy has the word 'I' that returns the value of the built-in index in the current loop. This index counts down. : TST1 5 FOR I . NEXT ; TST1 would print 5 4 3 2 1 0 : TST2 5 FOR I . NEXT ; TST2 would print 4 3 2 1 0 Also you can't directly get to the built-in index of outer loops from within inner loops (but, you can get it from the outer loop while just in the outer loop and save it on the stack for later use by the inner loop). This facility could be built into Pygmy (named 'J' 'K' etc) just as it is built in to some DO-LOOP implementations. Because of the downward counting nature, you might not always want to use 'I' in a FOR-NEXT loop. Here is a re-write using DO-LOOP where J accesses the outer loop's index: : PRINT-PROFITS2 ( -) CR ." Quarterly Profits for 6 Years" CR CR 1976 1970 DO ( we'll do this outer loop 6 times) 5 1 DO ( we'll do this inner loop 4 times) I J PROFIT ( profit) . ( ) LOOP CR ( so each year will get a separate line) LOOP ( ) ; I've presented all of this in hopes of making it clear how it all works rather than to convince you that FOR-NEXT is better than DO-LOOP. Even I have to admit that the example with DO-LOOP looks more straight forward. I just immediately switched to FOR-NEXT loops and never use DO-LOOP loops any more. I'm pointing this out as a curiosity as I don't fully understand why I've done it, but am content with the situation. Naturally I haven't tested any of the above examples. -- Frank ----- This message came from GEnie via willett through a semi-automated process. Report problems to: 'uunet!willett!dwp' or 'willett!dwp@gateway.sei.cmu.edu'