[Squeak-fr] Equivalent du switch
Stéphane Rollandin
hepta at zogotounga.net
Dim 28 Sep 12:14:01 UTC 2008
stephane ducasse a écrit :
> un dictionaire cela veut dire que l'on peut etendre le comportement sans
> copier copier et modifier tous les cases.
>
oui, c'est une différence importante, mais d'ordre pratique, pas
conceptuel.
mais voici un exemple de caseOf:
supposons que je veuille implémenter un langage abscons pour parler à
des nombres:
4 ga -> 8
4 zo -> 9
4 bu -> -4
4 meuh -> -8
Number>>shadock: symbol
^ symbol caseOf: {
[#ga] -> [2* self].
[#zo] -> [2* self + 1].
[#bu] -> [self negated].
[#meuh] -> [2* self negated]
}
otherwise: ['gazo ?']
dans cet example, l'extensivité du dictionnaire n'apporterait rien, car
les shadocks n'ont que quatre mots et sont contents avec.
par rapport à l'implémentation directe #ga, #zo, #bu et #meuh comme
méthode de la class Integer, on gagne le fait que le langage shadock est
clairement délimité. en effet on devrait faire
Number>>shadock: symbol
(#(ga zo bu meuh) identityIncludes: symbol)
ifFalse: [^ 'gazo ?'].
^ self perform: symbol
si l'on veut obtenir le 'gazo ?' outragé que l'on attend lorsqu'on parle
mal le shadock.
reste le dictionaire. ce serait
Number>>shadock: symbol
| dict |
dict := IdentityDictionary new.
dict add: #ga -> [:n | 2* n].
dict add: #zo -> [:n | 2* n+ 1].
dict add: #bu -> [:n | n negated].
dict add: #meuh -> [:n | 2 * n negated].
^ (dict at: symbol ifAbsent: [^ 'gazo ?']) value: self
cela ne me parait pas plus beau que le caseOf:, et c'est peut-être plus
lent (j'ai pas vérifié) car il faut recréer le dictionaire à chaque
invocation.
évidemment on pourrait créer le dictionaire une fois pour toute, mais
cela suppose une nouvelle variable d'instance ou de classe quelque part.
si je veux distribuer mon langage idiot, c'est quand même mieux s'il
consiste en une simple méthode qui ne requiert pas que l'on recompile la
classe Integer pour lui ajouter une variable ShadockDictionary, non ?
Stef
Plus d'informations sur la liste de diffusion Squeak-fr