[comp.lang.forth] SORTS and "I" - pt3

ForthNet@willett.UUCP (ForthNet articles from GEnie) (01/05/90)

 Date: 12-23-89 (17:19)              Number: 2706 (Echo)
   To: ALL                           Refer#: NONE
 From: STEVE PALINCSAR                 Read: (N/A)
 Subj: SORTS and "I" - pt3           Status: PUBLIC MESSAGE

 The biggest difficulty I experienced in translating the texts 
 to Forth was related to the fact that in BASIC, Pascal, etc., 
 the "I" and "J" used to refer to loop indexes are variables.  
 I, wherever iit appears, refers to the loop index in the outer 
 loop; J to the index of the loop inside it; etc.  Not so with 
 Forth! . In the loop in SELECTION_SORT, every fetch of a loop 
 index is made with I -- but thhe "I" bracked with => <= is the 
 index of the outer loop, and the I bracked with ==>> <<== is 
 the index of the inner loop.  What's going on here?  
 .
  : SELECTION_SORT
     COUNTER  0 DO
     => I <= smallest!        \ Outer loop index
        COUNTER => I <=  DO   \ Outer loop index
            smallest ELEMENT ==>> I <<== ELEMENT  larger?  \ inner
            IF  ==>> I <<== smallest!  THEN                \ loop index
        LOOP   
        smallest ELEMENT => I <= ELEMENT  {exchange}  \ outer loop index
     LOOP  ;
 .
 Forth's "I" puts the index of a DO loop on the stack, but it 
 does it by fetching not from a variable, but from the top of 
 the return stack.  If you nest a loop inside of the first 
 loop, the limit and index of the inner loop go on top of the 
 index of the outer loop.  The value that I finds on top of the 
 Return stack is the index of the inner loop.  Inside the body 
 of the inner loop, to get access to the index of the outer 
 loop, you must use J.  Once past the "LOOP" of the inner loop, 
 its index and limit are removed from the return stack, and the 
 value that I finds is the index of the outer loop once again. 
-----
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'