[comp.lang.icon] Usage of break

Paul_Abrahams%Wayne-MTS@UM.CC.UMICH.EDU (01/17/91)

 
Today I ran into the kind of problem I'm sure most of us have now and then:
a single line in an Icon program whose behavior I just couldn't understand. 
What I wrote was:
 
repeat{
   ...
   until find("\\syntax", read(infile) | break)
   ...
}
 
The idea was to read lines until I found one containing `\syntax' or the
file was exhausted.  (I intended to throw out the `\syntax' line; I was
only interested in what followed it.)  I couldn't understand why the
expression was exiting immediately.
 
What I finally realized was that in the constructs
	while expr1 do expr2
and
	until expr1 do expr2
a `break' in expr1 terminates the construct in the same way as if it's in
expr2. I read page 19 of the Icon book fairly carefully, but not carefully
enough; it says that a break expression causes immediate termination of the
loop in which it occurs.  I had thought that `the loop' was just expr2, but
in fact it includes expr1 as well.  So the failure of `find' provoked the
evaluation of `break' ~(as a result of goal-directed evaluation) and
therefore the termination of the expression each time a line was read.
 
I do understand now what's going on, and it does make sense---but it isn't
what I initially expected.
 
Paul Abrahams
abrahams%wayne-mts@um.cc.umich.edu