In che lingua v'è una parola chiave “guardia” o concetto?
-
24-09-2019 - |
Domanda
Recentemente ho cercato di capire un programma C ++ che è stato scritto da qualcuno che presumo avuto un background in programmazione funzionale: per esempio, aveva dichiarato un chiusura di classe che ha ampiamente utilizzato, e che fa un po ' assomigliare ciò che è noto come una chiusura nella programmazione funzionale. Un'altra classe è stato chiamato un guardia , ma non ho ben capito ancora che cosa è bene per. Sembra avere un qualche tipo di funzionalità di pulitura collegato ad esso.
L'unica lingua in cui ho visto un concetto chiamato guardia è Erlang, ma che non guarda a distanza simile al codice che ho trovato. In quali altri lingue sono come un concetto esistono che l'autore del codice C ++ può aver alluso?
Soluzione
Per me suona come stava usando Raii.
La classe costruttore / distruttore viene utilizzato per gestire simmetricamente una qualche forma di allocazione delle risorse / release in un contesto sicuro un'eccezione (programmatori Java Cosa chiamerebbe finally {} come distruttore viene garantito il di essere chiamato.).
Questo è un C ++ linguaggio molto comune ed è UED ampiamente nella moderna C ++.
Forse il codice simile al seguente:
void Plop()
{
Guard guard(lock);
// Do lots of stuff
}
Qui la guardia sta bloccando la serratura nel costruttore e sbloccare la serratura nel distruttore.
Altri suggerimenti
Il termine "guardia" è usato in diversi linguaggi funzionali il modo in cui è usato in Erlang, ma che l'utilizzo non sembra per adattarsi tua descrizione. Senza vedere il codice C ++ è difficile sapere esattamente cosa è stato inteso da esso.
Una congettura dalla tua descrizione sarebbe che implementa qualcosa come Haskell bracket
, che assicura sostanzialmente che alcune risorse sono rilasciate se la funzione termina incartati, anche se accadesse da un'eccezione. In Python si potrebbe usare finally
per questo, in C ++ che di solito hanno il codice di pulitura nel distruttore di un oggetto in pila.
In termini generali, un guardia è semplicemente un costrutto che deve valutare al vero per l'esecuzione lungo alcuni percorsi per continuare. Questo o qualcosa di simile esiste in tutti i linguaggi di programmazione Turing-complete utili, ma forse è così fondamentale che non è spesso chiamato separatamente come un'entità. Ecco un semplice esempio in Haskell:
f x
| x < 0 = -x
| otherwise = x
Questo è equivalente alla funzione valore assoluto: nega un numero se esso è negativo per produrre la sua controparte positiva; in caso contrario, restituire lo stesso valore passato ci sono due guardie qui:.. x < 0
, che è vero quando x è minore di zero, e otherwise
, che è sempre vero
modulo Control.Monad Haskell ha guard
:
guard :: MonadPlus m => Bool -> m ()
guard b
èreturn ()
seb
èTrue
, emzero
seb
èFalse
.
Ad esempio, per calcolare terne pitagoriche dove ogni gamba non più lungo di 25 è, si potrebbe usare
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
Per una spiegazione di ciò che sta succedendo, vedi il mio post sul blog A virgola programmabile spiegato .
Guardie in informatica si riferiscono in genere l'espressione booleana che indica che un costrutto loop dovrebbe continuare. Per esempio (pardon il gioco di parole)
for (int i = 0; i < N; ++i)
/* stuff */
Qui, i < N
è la guardia.
E 'difficile rispondere alla tua domanda in modo più approfondito, senza ulteriori informazioni.