Lua x programação funcional

classic Classic list List threaded Threaded
8 messages Options
Reply | Threaded
Open this post in threaded view
|

Lua x programação funcional

Denis Dos Santos Silva
Galera,
estava dando uma olhada nas 'novidades' no mundo da programação, achei dois cursos, com uma abordagem diferenciada, um sobre javascript e outro php.
apesar de 'cada um no seu quadrado', será que o lua merecia um tópico em especial em uma futura versão ? ou já daria para implementar isso hoje.

Só pra lembrar, nunca usei 'linguagem e/ou programei aplicando esses conceitos', mas, tem muita coisa na net sobre isso.

Até onde eu 'imaginava', isso era coisa Scala, R, Haskell e as famosa 'expressão' Lambda (que já tem suporte no java 1.8, c#, f#, python, ...)

cursos:
http://code.tutsplus.com/courses/functional-programming-in-javascript
http://code.tutsplus.com/tutorials/functional-programming-in-php--net-35043

wiki:
http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_funcional
http://pt.wikipedia.org/wiki/Categoria:Linguagens_de_programa%C3%A7%C3%A3o_funcionais

--
Lua BR - http://groups.google.com/group/lua-br
---
Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Para mais opções, acesse https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Lua x programação funcional

Roberto Ierusalimschy
> estava dando uma olhada nas 'novidades' no mundo da programação, achei dois
> cursos, com uma abordagem diferenciada, um sobre javascript e outro php.
> apesar de 'cada um no seu quadrado', será que o lua merecia um tópico em
> especial em uma futura versão ? ou já daria para implementar isso hoje.

-- operador de ponto fixo (não recursivo)
local Z = function (le)
      local function a (f)
        return le(function (x) return f(f)(x) end)
      end
      return a(a)
    end


-- pré-fatorial (não recursivo)
local F = function (f)
      return function (n)
               if n == 0 then return 1
               else return n*f(n-1) end
             end
    end

-- funcão fatorial
local fat = Z(F)

print(fat(10))
  --> 3628800


-- Roberto

--
Lua BR - http://groups.google.com/group/lua-br
---
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Para obter mais opções, acesse https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Lua x programação funcional

Alex Fernando Ferreira

Me perdoem a nubisse agora mas....
O ponto chave de programação funcional não é as funções serem dados de primeira classe?
Lua já é assim, então qual seria essa nova abordagem de que você fala Denis?


Em qui, 26 de mar de 2015 08:51, Roberto Ierusalimschy <[hidden email]> escreveu:
> estava dando uma olhada nas 'novidades' no mundo da programação, achei dois
> cursos, com uma abordagem diferenciada, um sobre javascript e outro php.
> apesar de 'cada um no seu quadrado', será que o lua merecia um tópico em
> especial em uma futura versão ? ou já daria para implementar isso hoje.

-- operador de ponto fixo (não recursivo)
local Z = function (le)
      local function a (f)
        return le(function (x) return f(f)(x) end)
      end
      return a(a)
    end


-- pré-fatorial (não recursivo)
local F = function (f)
      return function (n)
               if n == 0 then return 1
               else return n*f(n-1) end
             end
    end

-- funcão fatorial
local fat = Z(F)

print(fat(10))
  --> 3628800


-- Roberto

--
Lua BR - http://groups.google.com/group/lua-br
---
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Para obter mais opções, acesse https://groups.google.com/d/optout.

--
Lua BR - http://groups.google.com/group/lua-br
---
Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Para mais opções, acesse https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Lua x programação funcional

Eric Chiesse
Tem alguns conceitos que se fossem embutidos em Lua tornariam código funcional bem mais enxuto e elegante.

O primeiro é o lambda. Uma função anônima já cumpre esse papel mas acho bem mais bonito escrever \x->2*x (Haskell) do que function(x) return 2*x end (Lua)
Outros dois que meio trabalham juntos são (1) tratar os operadores como função sem a necessidade de um wrapper e (2) aplicação parcial de função
É bem melhor escrever: y = map (*2) [1,2,3] -- Haskell
Do que: y = map(function(x) return 2*x end, {1,2,3}) -- Lua (Estou assumindo map implementado para tabelas do Lua)

Eu criei um projeto (Luno - https://rocks.moonscript.org/modules/echiesse/luno) que está disponível via luarocks com algumas implementações funcionais. Lá tem todas as funções básicas (map, filter, reduce, any, all, ...) e também alguns helpers que permitem fazer composição de funções, aplicação parcial, pipelining. Eu infelizmente não documentei muita coisa mas procurei deixar o código bem limpo. Caso ache útil e quiser tirar dúvidas me aciona aqui na lista ou me manda um email em pvt.



---
Eric

Em 26 de março de 2015 09:23, Alex Fernando Ferreira <[hidden email]> escreveu:

Me perdoem a nubisse agora mas....
O ponto chave de programação funcional não é as funções serem dados de primeira classe?
Lua já é assim, então qual seria essa nova abordagem de que você fala Denis?


Em qui, 26 de mar de 2015 08:51, Roberto Ierusalimschy <[hidden email]> escreveu:

> estava dando uma olhada nas 'novidades' no mundo da programação, achei dois
> cursos, com uma abordagem diferenciada, um sobre javascript e outro php.
> apesar de 'cada um no seu quadrado', será que o lua merecia um tópico em
> especial em uma futura versão ? ou já daria para implementar isso hoje.

-- operador de ponto fixo (não recursivo)
local Z = function (le)
      local function a (f)
        return le(function (x) return f(f)(x) end)
      end
      return a(a)
    end


-- pré-fatorial (não recursivo)
local F = function (f)
      return function (n)
               if n == 0 then return 1
               else return n*f(n-1) end
             end
    end

-- funcão fatorial
local fat = Z(F)

print(fat(10))
  --> 3628800


-- Roberto

--
Lua BR - http://groups.google.com/group/lua-br
---
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Para obter mais opções, acesse https://groups.google.com/d/optout.
Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Para mais opções, acesse https://groups.google.com/d/optout.

--
Lua BR - http://groups.google.com/group/lua-br
---
Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Para mais opções, acesse https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Lua x programação funcional

Roberto Ierusalimschy
> O primeiro é o lambda. Uma função anônima já cumpre esse papel mas acho bem
> mais bonito escrever \x->2*x (Haskell) do que function(x) return 2*x end
> (Lua)
> Outros dois que meio trabalham juntos são (1) tratar os operadores como
> função sem a necessidade de um wrapper e (2) aplicação parcial de função
> É bem melhor escrever: y = map (*2) [1,2,3] -- Haskell
> Do que: y = map(function(x) return 2*x end, {1,2,3}) -- Lua (Estou
> assumindo map implementado para tabelas do Lua)

Uma coisa que deve ser considerada é a pragmática da linguagem (isso
é, seu uso na vida real). Semanticamente, um lambda e um "function"
são equivalentes, mas a implementação e o uso esperado dos dois
são bem diferentes. Em Haskell, toda a implementação é voltada
para funções anônimas e, em particular, para aplicações parciais
(vide o uso de currying para múltiplos argumentos). Em linguagens não
funcionais, como Lua, Javascript PHP, Python, etc., tudo isso pode ser
possível, mas é *extremamente* ineficiente. As vezes é bom uma sintaxe
mais pesada para nos lembrar que o que estamos escrevendo também é
pesado :-)  (Dito isso, já houveram várias iniciativas no passado para
colocar uma sintaxe mais leve para lambdas em Lua.)

-- Roberto

--
Lua BR - http://groups.google.com/group/lua-br
---
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Para obter mais opções, acesse https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Lua x programação funcional

Eric Chiesse
Entendo.

Mas de certa forma isso também quer dizer que não se deve abusar de programação funcional em Lua. É por aí?

---
Eric

Em 26 de março de 2015 12:22, Roberto Ierusalimschy <[hidden email]> escreveu:
> O primeiro é o lambda. Uma função anônima já cumpre esse papel mas acho bem
> mais bonito escrever \x->2*x (Haskell) do que function(x) return 2*x end
> (Lua)
> Outros dois que meio trabalham juntos são (1) tratar os operadores como
> função sem a necessidade de um wrapper e (2) aplicação parcial de função
> É bem melhor escrever: y = map (*2) [1,2,3] -- Haskell
> Do que: y = map(function(x) return 2*x end, {1,2,3}) -- Lua (Estou
> assumindo map implementado para tabelas do Lua)

Uma coisa que deve ser considerada é a pragmática da linguagem (isso
é, seu uso na vida real). Semanticamente, um lambda e um "function"
são equivalentes, mas a implementação e o uso esperado dos dois
são bem diferentes. Em Haskell, toda a implementação é voltada
para funções anônimas e, em particular, para aplicações parciais
(vide o uso de currying para múltiplos argumentos). Em linguagens não
funcionais, como Lua, Javascript PHP, Python, etc., tudo isso pode ser
possível, mas é *extremamente* ineficiente. As vezes é bom uma sintaxe
mais pesada para nos lembrar que o que estamos escrevendo também é
pesado :-)  (Dito isso, já houveram várias iniciativas no passado para
colocar uma sintaxe mais leve para lambdas em Lua.)

-- Roberto

--
Lua BR - http://groups.google.com/group/lua-br
---
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Para obter mais opções, acesse https://groups.google.com/d/optout.

--
Lua BR - http://groups.google.com/group/lua-br
---
Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Para mais opções, acesse https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Lua x programação funcional

Roberto Ierusalimschy
> Mas de certa forma isso também quer dizer que não se deve abusar de
> programação funcional em Lua. É por aí?

Sim (nem em Lua nem em Javascript, PHP, Python, etc.) Eu sou um grande
fã de programação funcional, mas também sou fã de se aprender e se
usar várias linguagens. Existem várias técnicas de PF que são muito
úteis em Lua, mas nem todas e nem sempre.  Em especial, para aprender
PF, nada como uma linguagem funcional de verdade.

-- Roberto

--
Lua BR - http://groups.google.com/group/lua-br
---
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Para obter mais opções, acesse https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Lua x programação funcional

Denis Dos Santos Silva
In reply to this post by Denis Dos Santos Silva
Achei bacana os pontos de vista!!!

eu como sou meio dinossauro com programação, "abri" meu coração com a linguagem de programação Lua, após, muita pesquisa e muitos conflitos internos superados (ainda bem!) - ainda mais depois de ler o artigo do Larry Wall - Programming is Hard, Let's Go Scripting...

o propósito de abordar o tópico foi para aprender mais sobre essa técnica que (dependendo o caso) ajuda muito... é que nem "comparar" SQL x NoSQL não dá resultado...

artigo link: http://www.perl.com/pub/2007/12/06/soto-11.html.

muito bacana mesmo, vou dar uma olhada no projeto do colega chiesse...

Em quinta-feira, 26 de março de 2015 01:47:19 UTC-3, Denis Dos Santos Silva escreveu:
Galera,
estava dando uma olhada nas 'novidades' no mundo da programação, achei dois cursos, com uma abordagem diferenciada, um sobre javascript e outro php.
apesar de 'cada um no seu quadrado', será que o lua merecia um tópico em especial em uma futura versão ? ou já daria para implementar isso hoje.

Só pra lembrar, nunca usei 'linguagem e/ou programei aplicando esses conceitos', mas, tem muita coisa na net sobre isso.

Até onde eu 'imaginava', isso era coisa Scala, R, Haskell e as famosa 'expressão' Lambda (que já tem suporte no java 1.8, c#, f#, python, ...)

cursos:
<a href="http://code.tutsplus.com/courses/functional-programming-in-javascript" target="_blank" rel="nofollow" onmousedown="this.href='http://www.google.com/url?q\75http%3A%2F%2Fcode.tutsplus.com%2Fcourses%2Ffunctional-programming-in-javascript\46sa\75D\46sntz\0751\46usg\75AFQjCNE8Hrrgu6Q_dR1WWZ0ib6DyHA-5ZA';return true;" onclick="this.href='http://www.google.com/url?q\75http%3A%2F%2Fcode.tutsplus.com%2Fcourses%2Ffunctional-programming-in-javascript\46sa\75D\46sntz\0751\46usg\75AFQjCNE8Hrrgu6Q_dR1WWZ0ib6DyHA-5ZA';return true;">http://code.tutsplus.com/courses/functional-programming-in-javascript
<a href="http://code.tutsplus.com/tutorials/functional-programming-in-php--net-35043" target="_blank" rel="nofollow" onmousedown="this.href='http://www.google.com/url?q\75http%3A%2F%2Fcode.tutsplus.com%2Ftutorials%2Ffunctional-programming-in-php--net-35043\46sa\75D\46sntz\0751\46usg\75AFQjCNGM0TF764z6StlH9BnawcGvEkPQZw';return true;" onclick="this.href='http://www.google.com/url?q\75http%3A%2F%2Fcode.tutsplus.com%2Ftutorials%2Ffunctional-programming-in-php--net-35043\46sa\75D\46sntz\0751\46usg\75AFQjCNGM0TF764z6StlH9BnawcGvEkPQZw';return true;">http://code.tutsplus.com/tutorials/functional-programming-in-php--net-35043

wiki:
<a href="http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_funcional" target="_blank" rel="nofollow" onmousedown="this.href='http://www.google.com/url?q\75http%3A%2F%2Fpt.wikipedia.org%2Fwiki%2FPrograma%25C3%25A7%25C3%25A3o_funcional\46sa\75D\46sntz\0751\46usg\75AFQjCNGNWv6WhHBD_GP3msFrrIwBHiiRPg';return true;" onclick="this.href='http://www.google.com/url?q\75http%3A%2F%2Fpt.wikipedia.org%2Fwiki%2FPrograma%25C3%25A7%25C3%25A3o_funcional\46sa\75D\46sntz\0751\46usg\75AFQjCNGNWv6WhHBD_GP3msFrrIwBHiiRPg';return true;">http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_funcional
<a href="http://pt.wikipedia.org/wiki/Categoria:Linguagens_de_programa%C3%A7%C3%A3o_funcionais" target="_blank" rel="nofollow" onmousedown="this.href='http://www.google.com/url?q\75http%3A%2F%2Fpt.wikipedia.org%2Fwiki%2FCategoria%3ALinguagens_de_programa%25C3%25A7%25C3%25A3o_funcionais\46sa\75D\46sntz\0751\46usg\75AFQjCNEMiFBp2UI6GAAoFfd8Rh2BkM18_Q';return true;" onclick="this.href='http://www.google.com/url?q\75http%3A%2F%2Fpt.wikipedia.org%2Fwiki%2FCategoria%3ALinguagens_de_programa%25C3%25A7%25C3%25A3o_funcionais\46sa\75D\46sntz\0751\46usg\75AFQjCNEMiFBp2UI6GAAoFfd8Rh2BkM18_Q';return true;">http://pt.wikipedia.org/wiki/Categoria:Linguagens_de_programa%C3%A7%C3%A3o_funcionais

--
Lua BR - http://groups.google.com/group/lua-br
---
Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Para mais opções, acesse https://groups.google.com/d/optout.