43 votes

Des structures de contrôle alternatives utiles ?

Parfois, lorsque je programme, je découvre qu'une structure de contrôle particulière me serait très utile, mais qu'elle n'est pas directement disponible dans mon langage de programmation. Je pense que mon désir le plus courant est quelque chose comme un "split while" (je n'ai aucune idée de comment l'appeler) :

{
    foo();
} split_while( condition ) {
    bar();
}

La sémantique de ce code serait que foo() est toujours exécuté, puis la condition est vérifiée. Si elle est vraie, alors bar() est exécuté et nous retournons au premier bloc (en exécutant ainsi foo() encore, etc). Merci à un commentaire de l'utilisateur reddit zxqdms J'ai appris que Donald E. Knuth a écrit sur cette structure dans son article. "Programmation structurée avec go to déclarations" (voir page 279).

Quelles structures de contrôle alternatives constituent, selon vous, un moyen utile d'organiser le calcul ?

Mon objectif ici est de donner à moi-même et aux autres de nouvelles façons de penser à la structuration du code, afin d'améliorer le chunking et le raisonnement.

Note : Je ne demande pas comment généraliser toutes les structures de contrôle possibles, que ce soit en utilisant jne , if / goto Il s'agit de macros Lisp, de continuations, de monades, de combinateurs, de quarks ou de tout autre élément. Je demande ce que spécialisations sont utiles pour décrire le code.

20voto

Jordão Points 29221

L'une d'entre elles, assez commune, est la boucle infinie. J'aimerais l'écrire comme ceci :

forever {
  // ...
}

20voto

Jordão Points 29221

Parfois, j'ai besoin d'avoir une boucle foreach avec un index. Cela pourrait être écrit comme ceci :

foreach (index i) (var item in list) {
  // ...
}

(Je n'aime pas particulièrement cette syntaxe, mais vous voyez l'idée)

18voto

munificent Points 6516

La plupart des langages ont des fonctions intégrées pour couvrir les cas les plus courants, mais les boucles de type "fencepost" sont toujours une corvée : les boucles où l'on veut faire quelque chose à chaque itération et aussi faire autre chose entre itérations. Par exemple, joindre des chaînes de caractères avec un séparateur :

string result = "";
for (int i = 0; i < items.Count; i++) {
    result += items[i];
    if (i < items.Count - 1) result += ", "; // This is gross.
    // What if I can't access items by index?
    // I have off-by-one errors *every* time I do this.
}

Je sais que les plis peuvent couvrir ce cas, mais parfois on veut quelque chose d'impératif. Ce serait cool si vous pouviez le faire :

string result = "";
foreach (var item in items) {
    result += item;
} between {
    result += ", ";
}

18voto

Jordão Points 29221

Boucle avec else :

while (condition) {
  // ...
}
else {
  // the else runs if the loop didn't run
}

14voto

munificent Points 6516
{
    foo();
} split_while( condition ) {
    bar();
}

Vous pouvez accomplir cela assez facilement en utilisant un while :

while (true) {
    foo();
    if (!condition) break;
    bar();
}

Je le fais assez fréquemment maintenant que j'ai surmonté mon dégoût irrationnel pour break .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X