[quote=fantomas]Olá senhores,
Este recurso me lembra a execução de blocos de código que existe/existiam em clipper vrs. 5.x
Evidencia 1
CLS
? EVAL( { | nVar | nVar * nVar }, 6 )
Evidencia 2
aVar := { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }
bDouble := { | nVal | QOUT( TRANSFORM( ( nVal * 2 ), "@B 999")) }
AEVAL( aVar, bDouble )
Evidencia 3
A := {'GARY HALL', 'FRED SMITH', 'TIM JONES'}
B := { | X, Y | X > Y }
asort(A, B)
Vou parar com as evidencias de utilização em clipper porque simples as formas de uso de blocos de códigos nesta linguagem deve beirar uma centena.
Me parece que na linguagem Ruby tem algo semelhante:
array = [1, 'hi', 3.14]
array.each { |item| puts item }
Pois bem, este recurso já existe fazem uns 15 ou 16 anos :shock:
Causou grande repercussão na linguagem clipper na época, pelo fato dela ser procedural e este recurso permitir a construção de algoritimos mais “sofisticados” e aumentando bastante o poder das estruturas dinamicas da linguagem.
O problema é que fazer a manutenção em algoritimos construidos com este recurso do tipo “sedutor” era dramático, porque o desenvolvedor geralmente aplicava isto como solução para tudo. Posso estar errado (e quero estar) mas muitos vão esquecer da OOP e aplicar isto na primeira dificuldade que aparecer.
Talvez este recurso se encaixe bem em linguagens como Ruby porque as propostas estão (IMO) bastante relacionadas, mas isto não diminui os possíveis problemas que podem ser causados por ele.
P.S. Com certeza isso irá fazer com que novos livros ou capitulos de livros sobre melhores práticas sejam editados enchendo ainda mais os bolsos de alguns.
flw[/quote]
Closure não é somente passagem de função de um lugar para outro! Uma função com suporte a closure captura o contexto onde foi criado. Coisa que em linguagens procedurais não acontecia (como: VB, Clipper, C) por uma razão simples: só haviam dois contextos, o local (dentro da função) e o global. E os dois eram sempre acessados onde quer que a função fosse executada.
Em linguagem OO, existe também o contexto do objeto. E com isso, não basta criar uma função e executá-lo por aí, é necessário que esta tenha a referência do objeto que a criou. Essa obtenção de referência, é o closure!
Veja mais em http://pt.wikipedia.org/wiki/Closure .