Un modèle est d'avoir des objets qui représentent le résultat du test, et les objets qui représentent le bloc à exécuter. Les objets de résultat ont outrepassé les fonctions de sélection, donc si Bool avait un choix (T positif, T négatif) alors Bool.TRUE retournerait l'argument positif et Bool.FALSE retournerait le négatif. Les implémentations naïves de langages familiaux smalltalk fonctionnent comme ça. Pour encoder votre boucle while sous cette forme, vous devez appeler la méthode choose sur le résultat de la comparaison de x et y pour déterminer si vous voulez appeler le bloc pour l'intérieur de la boucle while, et ce bloc utilise également compare et choisissez de définir la valeur de x. Une traduction plus littérale serait de choisir soit un bloc qui met x à z, soit un qui ne fait rien; au lieu de cela, il suffit de choisir de remettre x à la même valeur.
De toute évidence, il est exagéré et inefficace pour ce cas simple.
public class WantonPolymorphism {
static class Int32 {
final int value;
Int32 (final int value) { this.value = value; }
Compare compare (Int32 other) {
// Java runs out of turtles at this point unless you use
// an enum for every value
if (this.value < other.value) return Compare.LESS;
if (this.value > other.value) return Compare.GREATER;
return Compare.EQUAL;
}
}
enum Compare {
LESS {
<T> T choose (T less, T equal, T greater) { return less; }
},
EQUAL {
<T> T choose (T less, T equal, T greater) { return equal; }
},
GREATER {
<T> T choose (T less, T equal, T greater) { return greater; }
};
abstract <T> T choose (T less, T equal, T greater) ;
}
interface Block { Block execute() ; }
/**
* Main entry point for application.
* @param args The command line arguments.
*/
public static void main (String...args) {
Block block = new Block() {
Int32 x = new Int32(4);
Int32 y = new Int32(3);
Int32 z = new Int32(2);
public Block execute() {
System.out.printf("x = %d, y = %d, z = %d\n", x.value, y.value, z.value);
return x.compare(y).choose(done, done, new Block() {
public Block execute() {
x = x.compare(z).choose(x,x,z);
return x.compare(y).choose(done, done, this);
}
});
}
Block done = new Block() {
public Block execute() {
System.out.printf("x = %d, y = %d, z = %d\n", x.value, y.value, z.value);
System.exit(0);
return this;
}
};
};
for(;;)
block = block.execute();
}
}
@ken Merci d'avoir attrapé la faute de frappe. Je fais beaucoup ça. – WolfmanDragon