The ���Kent Beck approved solutions��� here are two: 

1) To use a dictionary (or ordered dictionary).


case := OrderedDictionary newFromPairs: {
  [ cond ]. [ do ].
[ cond ]. [ do ].
[ true ]. [ otherwise do ] }

case keysAndValuesDo: [  :cond :do | 
(cond value: expression)  ifTrue: [
���you need to break here"
^ do value ].

2) To use a ���case method���

caseMethod: expression 

expression = cond1 ifTrue: [ ^ do1 ].
expression = cond2 ifTrue: [ ^ do2 ].
^ otherwise

Personally, I prefer the second one because is more concise, performant and easy to understand.

Esteban


On 28 Dec 2019, at 11:58, Dennis Schetinin <chaetal@gmail.com> wrote:

It would be an overkill to do it for this particular case, but Smalltalk makes it possible to implement a case-like construction:

[ expression ] 
     when: [ :value | condition1 ] do: [-0do :value | ... ]; 
     when: [ :value | condition2 ] do: [ :value | ... ]; 
     otherwiseDo: [ :value | ... ];
     evaluate


I am sure, something like this has been implemented already somewhere (maybe in Squeak?). Still not sure it is practical as compared to simple if-s, and for sure not widely used :)
...On the other hand, sometimes the case-like construction can be considered a more intension-revealing style. 

����, 27 ������. 2019 ��., 22:18 Roelof Wobben via Pharo-users <pharo-users@lists.pharo.org>:
Hello,

Im trying to solve a challenge from exercism where  I have to calculate the points somehow gets on a very simple darts board.

I solved it like this :


scoreX: anInteger y: anInteger2
    | distance |
    distance := (anInteger squared + anInteger2 squared) sqrt.
    distance > 10
        ifTrue: [ ^ 0 ].
    distance > 5
        ifTrue: [ ^ 1 ].
    distance > 1
        ifTrue: [ ^ 5 ].
    ^ 10


but now I use three if then and I think it's ugly code.

Is there a way I can make it more the smalltalk way ?


Regards,

Roelof