{"id":3038,"date":"2017-06-07T16:58:41","date_gmt":"2017-06-07T20:58:41","guid":{"rendered":"http:\/\/linguagemprisma.br4.biz\/blog\/?p=3038"},"modified":"2017-06-07T17:37:34","modified_gmt":"2017-06-07T21:37:34","slug":"a-funcao-principal-e-algumas-particularidades","status":"publish","type":"post","link":"https:\/\/linguagemprisma.br4.biz\/blog\/modo_texto\/a-funcao-principal-e-algumas-particularidades\/","title":{"rendered":"A fun\u00e7\u00e3o &#8220;principal&#8221; e algumas particularidades"},"content":{"rendered":"<p>&nbsp;<\/p>\n<p>Essa fun\u00e7\u00e3o seria o &#8220;main&#8221; do C, ou &#8220;Main&#8221; do Java, isto \u00e9, uma fun\u00e7\u00e3o que \u00e9 executada em primeiro lugar ao carregar o programa.<\/p>\n<p>Veja o c\u00f3digo em C:<\/p>\n<pre class=\"lang:c decode:true\">#include&lt;stdio.h&gt; \/\/inclui a biblioteca de entrada e sa\u00edda.\r\nint soma(int a, int b){\r\n  return a+b;\r\n}\r\nint main(int argc, char **argv){\r\n  printf(\"123 + 110 = %d\\n\", soma(123,110) );\r\n  return 0;\r\n}<\/pre>\n<p>(para compilar use: gcc -o teste teste.c )<\/p>\n<p>Ao executar o c\u00f3digo acima compilado, a fun\u00e7\u00e3o &#8216;main&#8217; ser\u00e1 executada automaticamente, executando, por consequ\u00eancia, as fun\u00e7\u00f5es chamadas internamente nela.<\/p>\n<p>Em Lua, da qual Prisma deriva, n\u00e3o h\u00e1 uma fun\u00e7\u00e3o main, para simul\u00e1-la, voc\u00ea deve fazer algo como:<\/p>\n<pre class=\"lang:lua decode:true\">function printf(fmt,...)\r\n  io.write(string.format(fmt,...));\r\nend\r\n\r\nfunction soma(a,b)\r\n  return a+b;\r\nend\r\n\r\nfunction main(...)\r\n  printf(\"123 + 110 = %d\\n\", soma(123,110));\r\n  return 0;\r\nend\r\n\r\nreturn main(...); --devemos chamar explicitamente main em Lua!\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Agora veja em Prisma:<\/p>\n<pre class=\"lang:prisma decode:true \">funcao principal(args)\r\n  imprimaf(\"123 + 110 = %d\\n\", soma(123,110));\r\n  retorne 0;\r\nfim\r\n\r\nfuncao soma(a,b)\r\n  retorne a+b;\r\nfim<\/pre>\n<p>Note que n\u00e3o precisamos chamar principal no final, Prisma faz isso automaticamente. Isso foi implementado por mim no interpretador em C.<\/p>\n<p>Observe que h\u00e1 um \u00fanico par\u00e2metro (args) que s\u00e3o os par\u00e2metros passados em linha de comando ao executar o programa. Trata-se de uma tabela em que args[-1] e o path do interpretador, args[0] \u00e9 o programa prisma atual, e args[1] \u00e9 o primeiro par\u00e2metro e assim por diante.<\/p>\n<p>Obs.: fun\u00e7\u00e3o imprimaf foi adicionada desde a vers\u00e3o 1.0.99<\/p>\n<p>Temos algumas restri\u00e7\u00f5es quanto ao uso da fun\u00e7\u00e3o principal:<\/p>\n<p>1 &#8211; N\u00e3o a use como nome de vari\u00e1vel, ela \u00e9 unicamente para ser uma fun\u00e7\u00e3o.<\/p>\n<p>2 &#8211; Sempre dever\u00e1 ser uma fun\u00e7\u00e3o global. Se for declarada como local n\u00e3o ser\u00e1 executada automaticamente, sendo necess\u00e1rio cham\u00e1-la igual em Lua.<\/p>\n<p>3 &#8211; Podemos declarar fun\u00e7\u00f5es ap\u00f3s a fun\u00e7\u00e3o principal e cham\u00e1-las de dentro da principal desde que n\u00e3o sejam fun\u00e7\u00f5es locais. Veja que o c\u00f3digo abaixo geraria um \u00a0erro:<\/p>\n<pre class=\"lang:prisma decode:true\">funcao principal(args)\r\n  mostre_ola();\r\nfim\r\n\r\nlocal funcao mostre_ola()\r\n  imprima(\"ola!\");\r\n  retorne 0;\r\nfim<\/pre>\n<p>A fun\u00e7\u00e3o mostre_ola \u00e9 local, o que ocasiona um erro ao ser chamada de dentro da principal visto que ela foi declarada depois.<\/p>\n<p>Felizmente h\u00e1 um modo de usarmos fun\u00e7\u00f5es locais mesmo declaradas ap\u00f3s \u00e0 fun\u00e7\u00e3o principal, veja o exemplo anterior funcionando:<\/p>\n<pre class=\"lang:prisma decode:true\">local mostre_ola; \/\/declarando mostre_ola como local antes da principal, sem valor ainda\r\n\r\nfuncao principal(args)\r\n  mostre_ola();\r\n  retorne 0;\r\nfim\r\n\r\nfuncao mostre_ola()  \/\/ainda continua sendo local.\r\n  imprima(\"Ola mundo em Prisma!!\");\r\nfim<\/pre>\n<p>&nbsp;<\/p>\n<p>Sabemos que vari\u00e1veis locais s\u00e3o acessadas mais rapidamente dando efici\u00eancia ao programa, e fun\u00e7\u00f5es locais s\u00e3o vari\u00e1veis locais.<\/p>\n<p>Para declarar v\u00e1rias fun\u00e7\u00f5es locais antes da fun\u00e7\u00e3o principal() use v\u00edrgulas:<\/p>\n<pre class=\"lang:prisma decode:true\">local soma, escrevaf, dobro, quadrado;\r\n<\/pre>\n<p>Veja que todas ser\u00e3o locais, lembre-se de implement\u00e1-las ap\u00f3s a fun\u00e7\u00e3o principal():<\/p>\n<pre class=\"lang:prisma decode:true\">funcao soma(a,b)\r\n  retorne a+b;\r\nfim\r\nfuncao dobro(n)\r\n  retorne n*2;\r\nfim\r\nfuncao quadrado(n)\r\n  retorne n*n;\r\nfim\r\nfuncao escrevaf(fmt,...)\r\n  es.escreva(string.formate(fmt,...));\r\nfim\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Espero que tenha sido \u00fatil o post.<\/p>\n<p>At\u00e9 mais.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>&nbsp; Essa fun\u00e7\u00e3o seria o &#8220;main&#8221; do C, ou &#8220;Main&#8221; do Java, isto \u00e9, uma fun\u00e7\u00e3o que \u00e9 executada em primeiro lugar ao carregar o programa. Veja o c\u00f3digo em C: #include&lt;stdio.h&gt; \/\/inclui a biblioteca de entrada e sa\u00edda. int soma(int a, int b){ return a+b; } int main(int argc, char **argv){ printf(&#8220;123 + 110&#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-3038","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\/3038","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=3038"}],"version-history":[{"count":3,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/posts\/3038\/revisions"}],"predecessor-version":[{"id":3041,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/posts\/3038\/revisions\/3041"}],"wp:attachment":[{"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/media?parent=3038"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/categories?post=3038"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/tags?post=3038"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}