Reductions
 	Unlike other Higher Order Functions which lazily returns a transformed sequence, the word 
REDUCE
 immediately iterates through a sequence. Because 
REDUCE
 is not lazy you have to ensure that the target sequence is finite otherwise 
REDUCE
 will never end:
	
		0 
		1 2 ... 100 take 
			' max reduce .
		100.0 ok
	
	The next thing to remember when using 
REDUCE
 is that it often requires some existing data ("initial values") on the stack. In the example above, the word 
MAX
 requires two arguments. Without the existing 
0
 on the stack, the reduction will fail because of 
MAX
. Be reminded also that 
REDUCE
 requires an XT to perform a calculation. The word 
.LIST
 immediately prints out every element of a sequence and therefore is not lazy. It can be defined using 
REDUCE
:
	
		: .list ['] . reduce cr ;
	
	In the example above, 
REDUCE
 iterates through the sequence and calls 
.
 to print out each element. You may notice the word 
CR
 after 
REDUCE
 ends. 
CR
 prints a new line and avoids the confusion between the data list and subsequent items printed by other words.
	
Quiz
	Question 1
	Write a word 
MINIMUM
 to find the minimum of a sequence (assume it is finite) without making any assumptions about the upper bound. Hint: you may consider using the first item (what is it called in the sequence?) as the initial upper bound.
	
Question 2
	Write a word 
REVERSE
 that reverses any list. Does your word work for empty sequences? Hint: when introducing Sequence, do you still remember the difference between two ways of creating a sequence?
 
Next: Main Menu