[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