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 <chae...@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 <mailto: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 >