[Newbies] next or break in a loop

Phil (list) pbpublist at gmail.com
Mon May 9 18:35:56 UTC 2016


On Mon, 2016-05-09 at 12:51 -0500, Joseph Alotta wrote:
> Greetings,
> 
> I am in need of a way to go to the end of a do loop.
> 
> myCollection do:  [ :item |
> 
>                 (blah blah) ifTrue: “we found an item of the first
> type”
>                  next item.
> 
>                 (blah blah) ifTrue: “we found an item of the second
> type”
>                  next item.
>  
>                 (blah blah) ifTrue: “we found an item of the third
> type”
>                 next item.
>   
>                 (blah blah) ifTrue: “we found an item of the fourth
> type”
>                 next item.
> 
>                 (blah blah) ifTrue: “we found an item of the fifth
> type”
> 
> ].
> 
> 
> Some other languages have “break” or “next” or “goto LABEL” to skip
> the processing of the rest of the loop in case the item is found in
> the first test.
> 
> How do I implement this in Squeak?
> 

Smalltalk doesn't have a switch/case statement but there are a few ways
to implement the equivalent logic:

1) Nest the additional conditions inside ifFalse: statements:
cond1 ifTrue: [trueLogic...]
	ifFalse: [cond2 
		ifTrue: [trueLogic] 
		ifFalse: [otherLogic...]]
This is the simplest method but can get hard to follow/edit pretty
quickly re: brackets and formatting.  You could also add a 'done'
variable to avoid the nesting (and avoid multiple conditions from being
satisfied in a single pass):
done:=false.
cond1 ifTrue: [trueLogic.  done:=true].
(cond2 and: [done not]) ifTrue: [trueLogic.  done:=true].
(cond3 and:
[done not]) ifTrue: [trueLogic.  done:=true].
done ifFalse:
[otherLogic].

2) Store the conditional blocks as values in a dictionary:
switchBlock := Dictionary new
	at: condValue1 put: [block1];
	at: condValue2 put: [block2];
	at: condValue3 put: [block3];
	yourself.
then to evaluate it:
(switchBlock at: condValue) value

3) Implement a switch method and call it:
switchMethod: switchVal
	switchVal = cond1 ifTrue: [trueLogic.  ^ whatever].
	switchVal = cond2 ifTrue: [trueLogic.  ^ whatever].
	swit
chVal = cond3 ifTrue: [trueLogic.  ^ whatever].
	otherLogic

This is one area where I wish Smalltalk had nicer syntax / syntactic sugar for... any of the above is a bit clunky and you need it often enough where this can get tedious.

> Sincerely,
> 
> Joe.
> 
> 
> PS.  This is not a homework project.
> 
> 
> 
> _______________________________________________
> Beginners mailing list
> Beginners at lists.squeakfoundation.org
> http://lists.squeakfoundation.org/mailman/listinfo/beginners


More information about the Beginners mailing list