Em que idioma existe uma palavra -chave ou conceito de "guarda"?
-
24-09-2019 - |
Pergunta
Recentemente, tentei entender um programa C ++ que foi escrito por alguém que presumo ter um histórico de programação funcional: por exemplo, ele declarou um fecho Classe que ele usou extensivamente e que se assemelha um pouco ao que é conhecido como um fechamento na programação funcional. Outra classe foi chamada de guarda, mas ainda não descobri o que é bom. Parece ter algum tipo de funcionalidade de limpeza anexada a ele.
A única linguagem em que vi um conceito chamado guarda é Erlang, mas isso não parece remotamente semelhante ao código que encontrei. Em que outras línguas existe tal conceito que o autor do código C ++ pode ter aludido?
Solução
Para mim, parece que ele estava usando RAII.
O construtor/destruidor de classe é usado para lidar simetricamente em algum tipo de alocação/liberação de recursos em um contexto seguro de exceção (o que os programadores Java chamariam finalmente {} como o destruidor é chamado Gurenteed.).
Este é um idioma C ++ muito comum e é UED extensivamente no C ++ moderno.
O código ficou assim:
void Plop()
{
Guard guard(lock);
// Do lots of stuff
}
Aqui, o guarda está travando a fechadura no construtor e desbloqueando a fechadura do destruidor.
Outras dicas
O termo "guarda" é usado em Vários idiomas funcionais A maneira como é usada em Erlang, mas esse uso não parece se encaixar na sua descrição. Sem ver o código C ++, é difícil saber o que foi pretendido por ele.
Um palpite da sua descrição seria que ela implementa algo como Haskell's bracket
, o que basicamente garante que alguns recursos sejam divulgados se a função embrulhada sair, mesmo que isso aconteça por uma exceção. Em Python, alguém usaria finally
Para isso, no C ++, você geralmente tem o código de limpeza no destruidor de um objeto na pilha.
Em termos gerais, um guarda é simplesmente um construto que precisa avaliar para a execução ao longo de algum caminho para continuar. Isso ou algo como existe em todas as linguagens de programação preenchidas com Turing, mas talvez seja tão básico que geralmente não é nomeado separadamente como uma entidade. Aqui está um exemplo simples em Haskell:
f x
| x < 0 = -x
| otherwise = x
Isso é equivalente à função de valor absoluto: negue um número se for negativo produzir sua contraparte positiva; Caso contrário, retorne o mesmo valor passado. Há dois guardas aqui: x < 0
, o que é verdade quando x é menor que zero e otherwise
, o que é sempre verdadeiro.
O módulo Haskell's Control.Monad tem guard
:
guard :: MonadPlus m => Bool -> m ()
guard b
éreturn ()
E seb
éTrue
, emzero
E seb
éFalse
.
Por exemplo, para calcular triplos pitagóricos onde cada perna não tem mais de 25 anos, você pode usar
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
Para uma explicação do que está acontecendo, veja minha postagem no blog Um semicolon programável explicou.
Os guardas da ciência da computação geralmente se referem à expressão booleana que indica que um construto de loop deve continuar. Por exemplo (perdoe o trocadilho)
for (int i = 0; i < N; ++i)
/* stuff */
Aqui, i < N
é o guarda.
É difícil responder à sua pergunta mais detalhadamente sem mais informações.