Jump to content

Closures - primeira proposta oficial


IceBrain
 Share

Recommended Posts

Bem, parece que as closures¹ para Java sempre vêm, e foi submetido código no repositório oficial do OpenJDK (versão livre do Java) com unit tests para as mesmas.

A sintaxe actual proposta oficialmente é a seguinte:

Forma com expressão inline:

 #(lista de parâmetros) ( expressão );
Forma com return explícito:
 #(lista de parâmetros) { o código que quiserem }
A primeira versão é syntactic sugar² para a equivalente:
 #(lista de parâmetros) { return expressão; }
Alguns exemplos:
Object closureSoma = #(int a, int b) (a+b);
Object closureHelloWorld = #() { System.out.println("Hello World!"); };
Mas definir closures como Objects não é muito útil, pois Objects não podem ser executados. Asim, há duas sintaxes para correr closures:
 #int(int, int)(throws IOException | SQLException) plusClosure = #(int a, int b) (a+b);
//pode ser executada fazendo
int result = plusClosure.(3, 4); 
Outro é caso queiram definir o método para uma classe que seja abstracta e só tenha um método, como a Runnable:
Runnable runnable = #() {System.out.println("Hello, World!");};
//depois, como qualquer Runnable, pode ser corrido assim
runnable.run()

² http://en.wikipedia.org/wiki/Syntactic_sugar

❝The idea that I can be presented with a problem, set out to logically solve it with the tools at hand, and wind up with a program that could not be legally used because someone else followed the same logical steps some years ago and filed for a patent on it is horrifying.❞- John Carmack on software patents

A list  of command line apps

Link to comment
Share on other sites

As funções lambda podem ser closures, mas acho que também podem não ser (acho que teoricamente pode não ser, dependendo de como as implementares). A diferença entre ser e não ser é pouco significativa se não quiseres ser estrito no que toca à definição de closures. Mas para quase todos os efeitos práticos é a mesma coisa. As closures permitem ainda coisas que as lambda não permitem (pelo menos em Python não podes chamar comandos).

As funções anónimas em Perl e em outras linguagens também podem ser closures (dependendo de como forem implementadas).

Muitas outras linguagens também têm closures. A mais utilizada, deve ser o Javascript.

Link to comment
Share on other sites

As funções lambda podem ser closures, mas acho que também podem não ser (acho que teoricamente pode não ser, dependendo de como as implementares). A diferença entre ser e não ser é pouco significativa se não quiseres ser estrito no que toca à definição de closures. Mas para quase todos os efeitos práticos é a mesma coisa. As closures permitem ainda coisas que as lambda não permitem (pelo menos em Python não podes chamar comandos).

As funções anónimas em Perl e em outras linguagens também podem ser closures (dependendo de como forem implementadas).

Muitas outras linguagens também têm closures. A mais utilizada, deve ser o Javascript.

Pois, a maior parte do pessoal faz uma grande confusão com isto. Isto são funções anónimas simples. Em nenhum exemplo no post inicial são mostradas closures. Closures é quando utilizas variáveis de contextos léxicos superiores no bloco léxico que define a função. Essas variáveis é que foram uma closure.

Isto também está de certa forma relacionado com o conceito de high-order functions (ou first-class functions). O que parece que é suportado, pois as funções anónimas podem ser atribuidas a objectos que podem ser manipulados.

Mas sem suporte a type inferece parece-me que a sintaxe para armazenar o retorno das funções é demasiado verbose. E talvez fosse interessante adicionar ao Java o conceito de delegate (type-safe function pointer), algo semelhante ao que existe no .NET.

<3 life

Link to comment
Share on other sites

Ah, os delegates, a única coisa que o .net tem que realmente achei útil. Vamos ver se as closures, ou pelo menos uma aproximação disso, vem para Java, a proposta submetida para o OpenJDk, infelizmente, pode não ter o sucesso esperado, ainda não vejo o OpenJDK a ser a implementação de referência, e com as modificações que a Oracle tem vindo a adicionar ao panorama dos projectos que eram apoiados pela Sun, tenho algumas reservas.

De qualquer modo é bom ver o processo avançar, esperemos que seja positivo.

Link to comment
Share on other sites

O objectivo do post era mostrar a sintaxe - se se quer saber o que são closures, o link da wikipédia que postei tem exemplos em Lisp, Javascript, Scheme e Python.

Não é preciso ver exemplos para saber como referenciar variáveis do contexto do método externo à função anónima, basta usá-las 😛

@Knitter: duvido que não sejam implementadas no Java 7, mesmo que impliquem um atraso no lançamento. As críticas ao lento desenvolvimento do Java (e ao JCP) têm sido bastantes, mesmo por pessoas com alguma reputação na comunidade.

❝The idea that I can be presented with a problem, set out to logically solve it with the tools at hand, and wind up with a program that could not be legally used because someone else followed the same logical steps some years ago and filed for a patent on it is horrifying.❞- John Carmack on software patents

A list  of command line apps

Link to comment
Share on other sites

As críticas realmente têm sido muitas, mas o OpenJDK ainda não se instalou como implementação de referência, enquanto não o fizer vai continuar a ser visto como a implementação onde se testam algumas coisas mas que depois não fazem parte da especificação oficial. O processo de desenvolvimento do Java sempre foi lento, há quase 10 anos que vejo ser essa a maior crítica. Neste caso sou céptico em relação à mudança porque já se escreveu muito sobre as closures em Java, como em outras alterações que nunca viram a luz do dia... ainda espero pelo novo e remodelado package de I/O 😛

Link to comment
Share on other sites

Pois, a maior parte do pessoal faz uma grande confusão com isto. Isto são funções anónimas simples. Em nenhum exemplo no post inicial são mostradas closures. Closures é quando utilizas variáveis de contextos léxicos superiores no bloco léxico que define a função. Essas variáveis é que foram uma closure.

Daí eu ter dito que dependia da forma como implementasses as funções, as funções lambda e as funções anónimas podem ser, ou podem não ser closures, dependendo de como as implementares, mas o facto é que podem ser utilizadas para tal e penso que por exemplo no caso das lambda a prática comum na sua utilização será serem de facto closures (pelo menos do que vi). Em Perl também é muito comum utilizar closures em conjugação com funções como o grep, map e menos comum com o sort.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.