Dans quelle langue est-il un mot-clé « de garde » ou concept?
-
24-09-2019 - |
Question
J'ai récemment essayé de comprendre un programme C ++ qui a été écrit par quelqu'un qui je suppose eu une formation en programmation fonctionnelle: Par exemple, il avait déclaré fermeture classe dont il largement utilisé et qui ne peu ressemblent à ce qu'on appelle une fermeture dans la programmation fonctionnelle. Une autre classe a été appelée garde , mais je n'ai pas tout à fait compris ce qu'il est encore bon pour. Il semble avoir une sorte de fonctionnalité de nettoyage attaché.
La seule langue dans laquelle j'ai vu un concept appelé garde est Erlang, mais cela ne semble pas à distance similaire au code que j'ai trouvé. Dans quelles autres langues fait un tel concept existe que l'auteur du code C ++ peut avoir fait allusion?
La solution
Pour moi, on dirait qu'il utilisait RAII.
Le constructeur de classe / destructor est utilisé pour traiter une certaine forme de manière symétrique l'allocation des ressources / libération dans un contexte exception sûr (Qu'est-ce que les programmeurs Java appellent enfin {} comme destructor est guranteed à appeler.).
Ceci est un très commun langage C ++ et est largement DFT dans C ++ moderne.
ce que le regard de code comme ceci:
void Plop()
{
Guard guard(lock);
// Do lots of stuff
}
Ici, la garde est le verrouillage de la serrure dans le constructeur et déverrouiller la serrure dans le destructor.
Autres conseils
Le terme « garde » est utilisé dans plusieurs langues la façon dont il est utilisé dans Erlang, mais que l'utilisation ne semble pas correspondre à votre description. Sans voir le code du C, il est difficile de savoir vraiment ce qui était prévu par ce dernier.
Une estimation de votre description serait qu'il met en œuvre quelque chose comme Haskell
En termes généraux, garde est simplement une construction qui doit être évaluée à true pour l'exécution dans un sentier pour continuer. Ce ou quelque chose comme cela existe dans toutes les langues de programmation Turing-complet utiles, mais il est peut-être si fondamental qui est souvent appelé séparément en tant qu'entité. Voici un exemple simple dans Haskell: Ceci est équivalent à la fonction de valeur absolue: annuler un nombre si elle est négative pour produire sa contrepartie positive; sinon, retourner la même valeur transmise Il y a deux gardes ici:.. f x
| x < 0 = -x
| otherwise = x
x < 0
, ce qui est vrai lorsque x est inférieur à zéro, et otherwise
, ce qui est toujours vrai
Le module Control.Monad de Haskell a guard
:
guard :: MonadPlus m => Bool -> m ()
guard b
estreturn ()
sib
estTrue
etmzero
sib
estFalse
.
Par exemple, pour calculer triplets pythagoriciens où chaque jambe ne dépasse pas 25, vous pouvez utiliser
triples = do
a <- [1..25]
b <- [a..25]
c <- [b..25]
guard (p a b c)
return (a,b,c)
where
p a b c = a*a + b*b == c*c
Pour une explication de ce qui se passe, voir mon blog A programmable expliqué virgule.
Les gardes dans la science informatique font généralement référence à l'expression booléenne qui indique qu'une construction de boucle devrait se poursuivre. Par exemple (pardonnez le jeu de mots)
for (int i = 0; i < N; ++i)
/* stuff */
Ici, i < N
est le gardien.
Il est difficile de répondre à votre question plus en profondeur, sans plus d'informations.