Muitas linguagens de programação modernas suportam algum conceito de fechamento , isto é, um pedaço de código (um bloco ou uma função) que
- Pode ser tratado como um valor e, portanto, armazenado em uma variável, passado para diferentes partes do código, definido em uma parte de um programa e invocado em uma parte totalmente diferente do mesmo programa.
- Pode capturar variáveis do contexto em que está definido e acessá-las quando for posteriormente invocada (possivelmente em um contexto totalmente diferente).
Aqui está um exemplo de encerramento escrito em Scala:
def filterList(xs: List[Int], lowerBound: Int): List[Int] =
xs.filter(x => x >= lowerBound)
O literal da função x => x >= lowerBound
contém a variável livre lowerBound
, que é fechada (vinculada) pelo argumento da função filterList
que tem o mesmo nome. O fechamento é passado para o método da biblioteca filter
, que pode ser chamado repetidamente como uma função normal.
Eu tenho lido muitas perguntas e respostas neste site e, até onde eu entendi, o termo encerramento é frequentemente associado automaticamente à programação funcional e ao estilo de programação funcional.
A definição de programação de funções na wikipedia diz:
Na ciência da computação, a programação funcional é um paradigma de programação que trata a computação como a avaliação de funções matemáticas e evita dados de estado e mutáveis. Ele enfatiza a aplicação de funções, em contraste com o estilo de programação imperativa, que enfatiza as mudanças de estado.
e mais adiante
[...] no código funcional, o valor de saída de uma função depende apenas dos argumentos que são introduzidos na função [...]. A eliminação dos efeitos colaterais pode facilitar a compreensão e a previsão do comportamento de um programa, que é uma das principais motivações para o desenvolvimento da programação funcional.
Por outro lado, muitas construções de fechamento fornecidas pelas linguagens de programação permitem que um fechamento capture variáveis não locais e as altere quando o fechamento é invocado, produzindo um efeito colateral no ambiente em que foram definidas.
Nesse caso, os fechamentos implementam a primeira ideia de programação funcional (funções são entidades de primeira classe que podem ser movidas como outros valores), mas negligenciam a segunda ideia (evitando efeitos colaterais).
Esse uso de fechamentos com efeitos colaterais é considerado estilo funcional ou os fechamentos são considerados uma construção mais geral que pode ser usada tanto para um estilo de programação funcional quanto para um não-funcional? Existe alguma literatura sobre esse tópico?
NOTA IMPORTANTE
Não estou questionando a utilidade dos efeitos colaterais ou de ter encerramentos com efeitos colaterais. Além disso, não estou interessado em discutir as vantagens / desvantagens de fechamentos com ou sem efeitos colaterais.
Estou interessado apenas em saber se o uso de tais fechamentos ainda é considerado estilo funcional pelo proponente da programação funcional ou se, pelo contrário, seu uso é desencorajado ao usar um estilo funcional.