2010-05-31 7 views
2

Je me suis posé des questions sur d'autres façons d'écrire des structures de contrôle comme vous pouvez écrire vos propres constructions de langage dans Forth.Autres structures de contrôle

Une que vous appreniez tôt pour if déclarations est un remplacement pour cela:

if (x) { 
    // true 
} else { 
    // false 
} 

avec ce (parfois cela est plus lisible par rapport à beaucoup de parenthèses):

x ? true : false 

Il a moi en train de penser. Pouvons-nous remplacer quoi que ce soit d'autre au cas où il serait plus lisible.

Donc ce sont ceux que je peux penser de haut de la tête pour la déclaration if et faire des comparaisons.

Je me demande donc ce que sur la façon de remplacer des constructions comme looping for, while, etc.

Comment voulez-vous remplacer une boucle while par exemple (sans utiliser une boucle). Il est probable que cela ne peut pas être fait dans ces langues?

while (a < b) { 

} 
+0

Jetez un oeil à Common Lisp, il a beaucoup d'outils pour créer de la syntaxe personnalisée sucre ;-) – Vanya

Répondre

3

Comment voulez-vous remplacer une boucle while

boucles peuvent être remplacés par récursivité.

void doWhile(a, b) { 
    /* do something with a and b, hopefully changing them */ 
    if (a > b) doWhile(a, b); 
} 
+0

Exactement ce que le type de chose que je cherche :) +1 –

+1

Trading boucle infinie à un débordement de pile est vraiment doux ;-) – Vanya

+0

@Vanya: Haha bonne façon d'y penser –

0

il ne s'agit pas de structures de contrôle. Vous prenez le cas où if produit la valeur bool. C'est en fait une expression booléenne enveloppée dans une structure de contrôle non nécessaire. Vous ne pouvez pas réécrire le if générique de cette façon. Il est comme dire que

int c = 0; 
for (int i = 0; i < 10; i++) 
    c++; 

peut être réécrite comme c = 10; il n'a rien sur les structures de contrôle.

ces structures excessives sont produites parce qu'il est parfois plus facile de l'écrire en tant que structure, mais ne pas essayer de produire une expression unique. Cela vient de la paresse et du manque de réflexion des programmeurs. Voici un exemple. Vous devez calculer la somme des nombres incrémentés. Qu'est-ce qui vous vient en tête? Droite:

int sum = 0; 
for (int i = 0; i < 10; i++) 
    sum += i; 

Maintenant, essayez de trouver une expression unique comment compter ceci. C'est moins évident.

+0

Quelle est la meilleure expression à utiliser sinon la structure de contrôle? Tandis que je vois votre point de vue, c'est plutôt anal. –

+0

@Brock Woolf: Je dis que vos exemples ne rendent pas la structure de contrôle lisible, mais d'abord en utilisant la structure de contrôle là où elle n'est pas nécessaire, en la convertissant en une seule expression. – Andrey

+0

@ Andrey. Mes exemples de codes secondaires vous ont évidemment égaré, vous avez dit que le saignement évident n'était pas ce que j'essayais de dire. J'ai mis à jour la question. –

0

Dans certains cas, vous pouvez mettre toute la logique dans le troisième paramètre de la "déclaration for-loop" et créer une boucle qui semble vide mais fait du travail (je ne dis pas que c'est un bon style). Par exemple,

int t =0; 
for (int i = 0; i++ <10; t+=10); // warning : don't forget semicolon 
1

Vous soulevez un sujet intéressant dans votre question: qu'est-ce que "boolean" dans la programmation de type C?

La réponse, à mon avis, est que les valeurs booléennes (en fait, des opérations booléennes) sont des structures de contrôle implicites dans C.

Il vient de la règle « court-circuit » - lorsque la gauche de & & est faux ou à gauche de || est vrai, le droit n'est pas calculé du tout. Il n'y a aucun moyen de l'implémenter sauf avec un saut conditionnel - tout OR et AND bit à bit n'est pas suffisant. En outre, considérons les comparaisons: a> b est traduit pour comparer et sauter conditionnellement sur la plupart des processeurs modernes. Ce n'est pas "stocker 1 dans un registre quand a> b".Ce que vous avez découvert, c'est que nous utilisons des structures de contrôle implicites dans les opérations logiques et les comparaisons au lieu des «si» s explicites. Certaines langues prennent un autre niveau - considérer cet idiome standard Perl:

open("myfile.txt") or die "Could not open file"; 
+0

Les idiomes perl peuvent jusqu'à un certain point être utilisés en C aussi, mais c'est un mauvais style imho.En ce qui concerne les instructions générées par les tests, cela dépend et même avec une évaluation de court-circuit il arrive que le compilateur supprime complètement les branches ou utilise des instructions cmov. –

0

Vous pouvez également remplacer par des expressions booléennes:

expr1 && expr2; 

est la même chose que

if(expr1) 
    expr2; 

et

expr1 || expr2; 

est équivalent à

if(!expr1) expr2; 

vous pouvez donc remplacer

if(expr1) 
    expr2; 
else 
    expr3; 

par

expr1 && expr2; 
!expr1 || expr3; 

mais pourquoi quelqu'un voudrait faire cela est une toute autre question. Mon collègue aime ce genre de chose, car il pense que cela rend ses programmes plus efficaces.

0

Il y a toujours la façon de faire Smalltalk. Dans Smalltalk, TOUT est un objet, y compris des blocs de code. Il n'y a pas de structure de commande conditionnelle.

La classe booléenne a deux sous-classes, True et False (chacune avec un objet, true et false respectivement). Le conditionnel est une méthode envoyée à l'objet booléen avec deux arguments, un bloc de code puis un autre bloc de code. L'objet True exécute la branche then, l'objet False exécute la branche else.

Bien que les boucles sont semblables, pour les boucles sont un message à l'objet entier ...

Je pense que c'est un peu soignée.

Questions connexes