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?

Foi útil?

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 se b é True, e mzero E se b é 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top