{"id":2998,"date":"2017-05-01T15:58:29","date_gmt":"2017-05-01T19:58:29","guid":{"rendered":"http:\/\/linguagemprisma.br4.biz\/blog\/?p=2998"},"modified":"2017-05-01T16:20:02","modified_gmt":"2017-05-01T20:20:02","slug":"closures-fechamento-de-escopo-lexico","status":"publish","type":"post","link":"https:\/\/linguagemprisma.br4.biz\/blog\/modo_texto\/closures-fechamento-de-escopo-lexico\/","title":{"rendered":"Closures &#8211; fechamento de escopo l\u00e9xico"},"content":{"rendered":"<p>O que \u00e9 isso e para que serve?<\/p>\n<p>Tentarei responder o mais claro poss\u00edvel.<\/p>\n<p>Como Prisma, na verdade, \u00e9 uma modifica\u00e7\u00e3o dos fontes Lua 5.2, ela herda v\u00e1rios tra\u00e7os positivos e negativos da sua linguagem base. Um ponto positivo \u00e9 a quest\u00e3o dos closures.<\/p>\n<p>Lembra que em Prisma at\u00e9 mesmo as fun\u00e7\u00f5es s\u00e3o vari\u00e1veis e com elas podemos fazer praticamente o mesmo que fazemos com as outras vari\u00e1veis: podemos passar fun\u00e7\u00f5es como argumentos para outras fun\u00e7\u00f5es, podemos reatribuir fun\u00e7\u00f5es em outra vari\u00e1vel, podemos retornar fun\u00e7\u00f5es de dentro de outras fun\u00e7\u00f5es. \u00c9 esse \u00faltimo aspecto que quero ressaltar aqui.<\/p>\n<p>Closure nada mais \u00e9 do que voc\u00ea criar uma fun\u00e7\u00e3o dentro de outra fun\u00e7\u00e3o e assim a fun\u00e7\u00e3o interna mant\u00e9m seu escopo l\u00e9xico fechado. Isso significa que as vari\u00e1veis locais sempre poder\u00e3o ser acessadas pela fun\u00e7\u00e3o interna, mesmo fora da fun\u00e7\u00e3o externa.<\/p>\n<p>Para entender melhor vejamos um simples exemplo, vamos criar um contador:<\/p>\n<pre class=\"lang:prisma decode:true\">\/\/usando closure\r\n\r\nfuncao contador()\r\n  local i = 0;\r\n  retorne funcao()\r\n              i = i + 1;\r\n              retorne i; \/\/retorna valor atual de i;\r\n           fim\r\nfim\r\n\r\nc1 = contador();\r\nc2 = contador();\r\n\r\nimprima('c1: '.. c1() , '\\nc1: ' .. c1());\r\n\r\npara i = 1 , 10 inicio\r\n  imprima('c1: ' .. c1(),'    c2: ' .. c2());\r\nfim\r\n<\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"lang:prisma decode:true\">funcao contador()<\/pre>\n<p>Criamos a fun\u00e7\u00e3o externa: contador();<\/p>\n<pre class=\"lang:prisma decode:true\">local i = 0;<\/pre>\n<p>Criamos a vari\u00e1vel local i dentro da fun\u00e7\u00e3o contador();<\/p>\n<pre class=\"lang:prisma decode:true\">retorne funcao()\r\n              i = i + 1;\r\n              retorne i; \/\/retorna valor atual de i;\r\n           fim<\/pre>\n<p>&nbsp;<\/p>\n<p>Retornamos da fun\u00e7\u00e3o contador uma outra fun\u00e7\u00e3o, note que n\u00e3o damos nome \u00e0 fun\u00e7\u00e3o retornada, e nem precisa j\u00e1 que ela ser\u00e1 atribu\u00edda a uma vari\u00e1vel. A fun\u00e7\u00e3o sem nome \u00e9 chamada de fun\u00e7\u00e3o an\u00f4nima.<\/p>\n<p>Note que realizamos opera\u00e7\u00f5es com a vari\u00e1vel i dentro da fun\u00e7\u00e3o retornada.<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"lang:prisma decode:true\">c1 = contador();\r\nc2 = contador();<\/pre>\n<p>Retornamos a fun\u00e7\u00e3o closure para as vari\u00e1veis c1 e c2, embora seja a mesma implementa\u00e7\u00e3o os retornos s\u00e3o duas closures diferentes com escopos l\u00e9xicos independentes, sendo assim teremos a vari\u00e1vel local &#8216;i&#8217; em c1 e outra vari\u00e1vel local &#8216;i&#8217; em c2. O que torna isso poss\u00edvel \u00e9 o fato de a fun\u00e7\u00e3o retornada e a vari\u00e1vel local &#8216;i&#8217; estarem no mesmo escopo ao serem criadas quando a fun\u00e7\u00e3o contador \u00e9 chamada. E, \u00e9 claro, gra\u00e7as a implementa\u00e7\u00e3o do mecanismo de interpreta\u00e7\u00e3o dessa caracter\u00edstica em C.<\/p>\n<pre class=\"lang:prisma decode:true\">imprima('c1: '.. c1() , '\\nc1: ' .. c1());<\/pre>\n<p>Note que a cada chamada de c1 o valor de &#8216;i&#8217; \u00e9 preservado internamente em seu escopo l\u00e9xico fechado e incrementado\u00a0o valor 1.<\/p>\n<p>&#8211;&gt; 1, 2, 3, 4 &#8230;.<\/p>\n<pre class=\"lang:prisma decode:true\">para i = 1 , 10 inicio\r\n  imprima('c1: ' .. c1(),'    c2: ' .. c2());\r\nfim<\/pre>\n<p>&nbsp;<\/p>\n<p>Veja que, realmente, cada closure tem seu escopo l\u00e9xico fechado independente, tanto que quando a fun\u00e7\u00e3o c2 \u00e9 chamada pela primeira vez, ela come\u00e7a do 1 e n\u00e3o da continuidade de c1;<\/p>\n<p>Esse foi s\u00f3 um exemplo simples, mas com essa caracter\u00edstica da linguagem voc\u00ea conseguir\u00e1 fazer coisas poderosas como: percorrer e\/ou analisar dados, contadores, temporizadores, callbacks, iteradores a serem usados no comando <strong>&#8216;para&#8217;<\/strong> etc&#8230;<\/p>\n<p><strong>Bom, por enquanto \u00e9 isso, at\u00e9 mais&#8230;<\/strong><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>O que \u00e9 isso e para que serve? Tentarei responder o mais claro poss\u00edvel. Como Prisma, na verdade, \u00e9 uma modifica\u00e7\u00e3o dos fontes Lua 5.2, ela herda v\u00e1rios tra\u00e7os positivos e negativos da sua linguagem base. Um ponto positivo \u00e9 a quest\u00e3o dos closures. Lembra que em Prisma at\u00e9 mesmo as fun\u00e7\u00f5es s\u00e3o vari\u00e1veis e&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6,7],"tags":[],"class_list":["post-2998","post","type-post","status-publish","format-standard","hentry","category-modo_texto","category-prisma"],"_links":{"self":[{"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/posts\/2998","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/comments?post=2998"}],"version-history":[{"count":4,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/posts\/2998\/revisions"}],"predecessor-version":[{"id":3002,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/posts\/2998\/revisions\/3002"}],"wp:attachment":[{"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/media?parent=2998"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/categories?post=2998"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/tags?post=2998"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}