Yet Another Case-statement Idea

Chris Reuter cgreuter at calum.csclub.uwaterloo.ca
Sat Jul 4 19:19:24 UTC 1998



In working on my current and perpetual Squeak project, a roguelike
game tentatively titled "The Infernal Tower"[1], I concluded that I
could really use a case statement in order to properly handle
keyboard input.  Even though there are at least two such mechanisms,
one of which works without curly brackets, I decided to be
trendy and invent my own.  I present it here for your perusal:

I implemented the following method in Object:

case: obj do: block
      self = obj ifTrue: [block value].

It is used as follows:

   letter
	case: $a
	do: [
	    stream nextPut: 'Apple'.
	];

	case: $b
	do: [
	    stream nextPut: 'BeBox'.
	];

	case: $c
	do: [
	    stream nextPut: 'Commodore'.
	];

	...and so on...

	case: $z
	do: [
	    stream nextPut: 'Zilog'.
	].

(I realize that this example could be implemented more easily using a
Dictionary.  It's just for illustration.)

Advantages:
	 -Looks like the switch/case statements we procedural
	  programmers know and love.
	 -It's very, very simple.
	 -It makes use of blocks and messages to do its thing, just
	  like the standard control structures.


Disadvantages:

	 -Behaviour is subtly different from what C/Pascal programmers
	  would expect, in that all possibilities are tried rather
	  than just the one that matches the receiver.

         -Because of this, it's also slower.  I can alleviate (sp?)
	  some of this by making the method return in the block, but
	  that's not always possible.

In addition, I've implemented #case:case:do: (but not
#case:case:case:do: or #case:case:case:case:do: yet) to simulate
simple fall-through.  (#case:case:do evaluates the block if either of
its arguments equals the receiver.

I've also implemented #identityCase:do: which uses #== instead of #=
to make its comparisons, but that message is somewhat awkward.
Perhaps, I should make #case:do: use #== and implement a new method,
say #caseEq:do: which uses #=.  I suspect it would also make it easier
to optimize #case:do: at compile time, should somebody want to
implement that.

Now try THAT in C++!


				--Chris

[1] Currently 65% vapourware.





More information about the Squeak-dev mailing list