SelectCase

Andreas Raab andreas.raab at gmx.de
Wed Jan 4 11:38:39 UTC 2006


Ragnar Hojland Espinosa wrote:
>>I know select/case statements is not desired in the squeak community
>>and I understand why (it's often a wrong modelisation). But I put
>>an implementation in squeaksource which can be used like this :
>>
>>(aString selectCase )
>>        testBlock: [:ref :case | case match: ref];
>>        case: 't*' exec: [self assert: false];
>>        case: 'v*' exec: [self assert: true];
>>        case: 'value' exec: [self assert: false];
>>        default: [^ nil]
>>
>>#testBlock: and #default: can be ommited.
> 
> What's wrong with
> http://wiki.cs.uiuc.edu/CampSmalltalk/Smalltalk+case-statement ?

Nothing. I think it sucks just about as much as the above ;-) And, oh, 
did you know that Squeak has had a case statement for ages? I've never 
seen it used in any code but, in theory, it works like this:

	aString caseOf: {
		['foo'] -> [self foo].
		['bar'] -> [self bar].
	} otherwise:[self frobler].

And there is nothing wrong with this either, and yes, it sucks just as 
much as the other variants ;-) And just in case you haven't guessed it: 
"Classic" case statements (those based purely on equality) can *always* 
be represented by a simple dictionary lookup, e.g, instead of the above 
you might as well write:

	map := Dictionary new.
	map at: 'foo' put: [self foo].
	map at: 'bar' put: [self bar].
	elseBlock := [self mumble].
	result := (map at: aString ifAbsent:[elseBlock]) value.

and if you don't like that, stick the map into a class var and replace 
it with something roughly equivalent to:

	^(SwitchMap at: aString ifAbsent:[whatever]) value.

In any case, I doubt the existence of YACI (yet another case 
implementation) will change much. It's bad style to begin with and it's 
easy enough (actually trivial) to simulate by using objects. The one 
case implementation I'd really like is one that actually *reads* well 
(e.g., one that doesn't look like reverse polish notation) but for 
obvious reasons that would require quite a bit of compiler support.

Cheers,
   - Andreas



More information about the Squeak-dev mailing list