{"id":3022,"date":"2017-05-19T19:55:50","date_gmt":"2017-05-19T23:55:50","guid":{"rendered":"http:\/\/linguagemprisma.br4.biz\/blog\/?p=3022"},"modified":"2017-05-19T20:00:13","modified_gmt":"2017-05-20T00:00:13","slug":"interpretador-prisma-prompt-de-comandos","status":"publish","type":"post","link":"https:\/\/linguagemprisma.br4.biz\/blog\/modo_texto\/interpretador-prisma-prompt-de-comandos\/","title":{"rendered":"Interpretador Prisma (prompt de comandos)"},"content":{"rendered":"<p>Este \u00e9 um programa feito em Prisma que imita o prompt prisma.<\/p>\n<p>H\u00e1 v\u00e1rias fun\u00e7\u00f5es da lib terminal e term que poder\u00e1 ajudar quem programa para terminal usando Prisma.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-3024 size-full\" src=\"https:\/\/linguagemprisma.br4.biz\/blog\/wp-content\/uploads\/2017\/05\/prompt_prisma.png\" alt=\"prompt_prisma\" width=\"655\" height=\"460\" srcset=\"https:\/\/linguagemprisma.br4.biz\/blog\/wp-content\/uploads\/2017\/05\/prompt_prisma.png 655w, https:\/\/linguagemprisma.br4.biz\/blog\/wp-content\/uploads\/2017\/05\/prompt_prisma-300x211.png 300w\" sizes=\"auto, (max-width: 655px) 100vw, 655px\" \/><\/p>\n<p>Segue o c\u00f3digo, bons estudos:<\/p>\n<pre class=\"lang:prisma decode:true\">\/\/prompt interativo prisma feito em puro prisma com mais op\u00e7\u00f5es\r\n\/\/v 0.99 3 jan de 2017\r\n\r\n\/\/conf padrao:\r\n_Cabecalho = _VERSAO .. ' linguagemprisma.br4.biz (jan, 2017)\\\r\n[ -a = ajuda, -m = manual, -v = versao, -s = sair] em: '.. sis.nome;\r\n_Prompt1 = '&gt;&gt; ';\r\n_Prompt2 = ' ... ';\r\n_AUTOR = [[\r\n    prompt 1.0 \r\n    Autor: Adalberto Amorim Felipe.\r\n    &lt;linguagemprisma@gmail.com&gt; \r\n ]] \r\n\r\n\/\/inicializando arquivo de preconfiguracao se houver\r\n\/\/nome deve ser prisma.ini\r\n\r\ninicio\r\n  local arq_ini = 'prisma.ini';\r\n  local func = carreguearquivo(arq_ini);\r\n  local ret = '';\r\n  se func entao\r\n    ret, m = pchame(func); \r\n    vapara final_ini; \r\n  fim\r\n    arq_ini = '\/usr\/local\/share\/prisma\/1.0\/plib\/prisma.ini';\r\n    func = carreguearquivo(arq_ini);      \r\n  se func entao\r\n      ret, m = pchame(func); \r\n      vapara final_ini;\r\n  fim\r\n    arq_ini = args[0] .. '.ini'\r\n    func = carreguearquivo(arq_ini);\r\n  se func entao\r\n     ret, m = pchame(func); \r\n     vapara final_ini;\r\n  fim  \r\n  ::final_ini::\r\n  se nao ret entao imprima('Erro no arquivo ini:\\n',arq_ini); imprima(m) fim;\r\n  func = nulo;  \r\nfim\r\n\r\nlocal term = {};\r\nse sis.nome == 'linux' entao\r\n  term = inclua'term';\r\nsenaose sis.nome =='win32' entao\r\n  inclua'win';\r\n  imprima = funcao (...)\r\n    \/\/poe'';\r\n    para k , v em ipares{...} inicio\r\n      imprimaf(conv_c(v .. '  '));\r\n    fim\r\n    poe'';\r\n  fim\r\n  term = nulo;\r\nfim\r\n\r\n\/\/funcoes para eliminar erro de compatibilidade de sistema\r\n\/\/se linux use term.\r\nfuncao mude_cor(core)\r\n  se sis.nome == 'linux' entao\r\n    term.defCorletra(term[core]);\r\n  fim\r\nfim\r\n\r\nfuncao mude_padrao()   \r\n  se sis.nome == 'linux' entao\r\n   term.defPadrao();\r\n  fim\r\nfim\r\n\r\n\/\/trata dos parametros externos chamados junto com o programa em linha de comando.\r\nfuncao exec_opcao_externa(Args)\r\n  local arg = Args;\r\n  se string.corte(arg[1],1,1) == '-' entao\r\n    se arg[1] == '-e' entao\r\n      se arg[2] entao\r\n        local func, err = carregue(arg[2]);\r\n        se nao func entao\r\n          mude_cor('vermelho');\r\n          imprima(err); \r\n          mude_padrao();\r\n        senao\r\n          func();        \r\n        fim\r\n      senao\r\n        imprima'Falta 2 parametro para -e: string'\r\n      fim\r\n       sis.saia(0);\r\n    senaose arg[1] == '-l' entao\r\n      se arg[2] entao\r\n        inclua(arg[2]);\r\n      senao\r\n        imprima'Falta 2 parametro para -e: string'\r\n      fim\r\n    senaose arg[1] == '-a' entao\r\n      imprima[[\r\n      ------------ Ajuda ---------\r\n      -e string : executa string\r\n      -l biblioteca : carrega biblioteca.\r\n      -a        : exibe ajuda\r\n      prog      : executa programa prog.      \r\n      ]]\r\n      sis.saia(0);\r\n    senaose arg[1] == '-v' entao\r\n      mude_cor('verde');\r\n      imprima(_VERSAO);\r\n      mude_padrao();\r\n      sis.saia(0);\r\n    senao\r\n      mude_cor('vermelho');\r\n      imprima'argumento invalido, tente -a para ajuda' \r\n      mude_padrao(); \r\n      sis.saia(1);\r\n    fim\r\n  senao\r\n    args = {};    \r\n    local tab = { selecione(2 , tabela.desempacote(arg) ) } \r\n    tab[-1] = arg[0];\r\n    tab[0] = arg[1];\r\n    args = tab;\r\n    local func, err = carreguearquivo(arg[1]);\/\/erro ja e uma funcao por isso usei err\r\n    se func entao \r\n      func(args);     \r\n      se principal entao\r\n        principal(tab);\r\n      fim\r\n    senao\r\n      mude_cor('vermelho');\r\n      imprima( err );\r\n      mude_padrao();\r\n    fim    \r\n    sis.saia(0);\r\n  fim\r\nfim\r\n\r\n\r\nse args[1] entao\/\/args externos: prismaterm args ...\r\n    exec_opcao_externa(args);\r\nfim\r\n\r\n\r\nse sis.nome == 'linux' entao\r\n  local term = inclua'term'  \/\/para limpar tela, mudar cor e mudar posicao do texto.\r\n  term.defTitulo( _Cabecalho );\/\/define titulo no terminal.\r\nfim\r\n\r\nfuncao imprima_cab()\r\n  local corcab = _Cor_prompt ou 'verde';\r\n  se sis.nome == 'linux' entao\r\n    term.defCorletra(term[corcab]);\r\n  fim\r\n  imprima(_Cabecalho);\r\n  se sis.nome == 'linux' entao\r\n   term.defPadrao();\r\n  fim\r\nfim\r\n\r\nfuncao principal(Args)\r\n  \r\n  local tmp = '';\r\n  local cmd = '';\r\n  local multilinha = verdadeiro;\r\n  local ret = verdadeiro;  \r\n  imprima_cab();\/\/imprime o cabecalho\r\n  enquanto 1 inicio   \r\n  \r\n     se nao ret e incompleto(err) entao\r\n         cmd = cmd .. '\\n' .. leia_cmd(_Prompt2);\r\n     senaose ret entao\r\n       cmd = leia_cmd(_Prompt1);\r\n     senao\r\n         imprima_erro(err);\r\n         cmd = leia_cmd(_Prompt1);\r\n         ret = verdadeiro; \/\/forca nao imprimir mensagem erro novamente.\r\n     fim  \r\n     \r\n     se cmd:corte(1,1) == '-' entao\r\n       se cmd == '-a' entao\r\n         ajuda();\r\n       senaose cmd:apare() == '-v' entao\r\n         imprima( '', _VERSAO);\r\n         imprima( _AUTOR);\r\n         leia();\r\n         limpe_tela();\r\n         ret = verdadeiro;\r\n       senaose cmd:apare() == '-r' entao\r\n         se sis.nome == 'linux' entao\r\n          term.limpeTela();\r\n         senao\r\n           sis.execute'cls';\r\n         fim\r\n        imprima_cab();\r\n        ret = verdadeiro;\r\n       senaose cmd:apare() == '-l' entao\r\n         imprima( _Licenca);\r\n         leia();\r\n         limpe_tela();\r\n         ret = verdadeiro;\r\n       senaose cmd:apare() == '-m' entao\r\n         mude_cor('amarelo');\r\n         imprima( _Manual);\r\n         leia();\r\n         limpe_tela();\r\n       senaose cmd:apare() == '-s' entao\r\n         sis.saia(0);\r\n       senaose cmd:apare() == '-inicio' ou cmd:apare() == '-i' entao\r\n        \/\/ poe'Modo bloco iniciado [ -- = sair]';\r\n         local tmp, cmd2 = '', '';\r\n         enquanto 1 inicio\r\n           tmp = leia_cmd('.. ');\r\n           se tmp:apare() == '-fim' ou tmp:apare() == '--' entao quebre fim\/\/quebra o laco enquanto.\r\n           cmd2 = cmd2 .. '\\n' .. tmp \r\n         fim\r\n         ret, err = carregue(cmd2);\r\n         se ret entao ret() fim\r\n         se sis.nome == 'linux' entao term.ad_historico(cmd2) fim;\r\n         cmd = '';\r\n       senaose cmd:apare() == '-c' entao \/\/modo calculadora, todo valor \u00e9 computado e impresso.\r\n         poe'Modo calculadora iniciado [ -- = sair]';\r\n         local tmp = '';\r\n         enquanto 1 inicio\r\n           tmp = leia_cmd(' ');\r\n           se (tmp:apare() == '-c' ou tmp:apare() == '--') entao quebre; fim\r\n           tmp = ' ' .. tmp;\r\n           execute_imprima(tmp);\r\n         fim       \r\n       senao\r\n         imprima\"Opcao invalida tente -a para ajuda\";\r\n         ret = verdadeiro;\r\n       fim\r\n     senaose cmd:corte(1,1) == '=' entao\r\n       execute_imprima( cmd );\r\n     senao\r\n       ret, err = carregue(cmd);\r\n       se ret entao \r\n          local x, err = pchame(ret);\r\n          se nao x entao\r\n            mude_cor('vermelho');\r\n            imprima(err);\r\n            mude_padrao();\r\n          fim\r\n       fim\r\n       se sis.nome == 'linux' e cmd &lt;&gt; nulo e cmd &lt;&gt; '' entao term.ad_historico(cmd) fim;\r\n     fim\r\n  fim \r\nfim \/\/fim principal();\r\n\r\n\r\n\/\/esta funcao soma as linhas se um comando nao estiver fechado\r\nfuncao incompleto(err)\r\n  local eof = '&lt;eof&gt;';\r\n  local len_eof = #eof;\r\n  local len_msg = #err;\r\n  local cmp = err:corte(len_msg - len_eof + 1, len_msg);\r\n  se cmp == eof entao\r\n    retorne verdadeiro\r\n  senao\r\n    retorne falso;\r\n  fim\r\nfim \r\n\r\nfuncao ajuda()\r\n \/\/ term.defCorfundo(term.branco);\r\n se sis.nome == 'linux' entao\r\n  term.defCorletra(term.vermelho);\r\n fim\r\n  imprima([[\r\n    ----------- Ajuda ------------\r\n    -a : ajuda\r\n    -m : manual de uso\r\n    -v : vers\u00e3o\r\n    -r : limpa tela e reinicia o prompt\r\n    -i : abre um bloco multilinha\r\n    -s : sai do programa. \r\n    -c : modo calculadora.\r\n    -l : licen\u00e7a\r\n    -- : fecha: bloco ou modo calculadora.\r\n    \r\n    [s = sai da ajuda\/ ENTER = mostra exemplos ...] ]]);\r\n  \r\n  local op = obt_opcao();  \r\n  \r\n  se op &lt;&gt; 's' e op &lt;&gt; 'S' entao\r\n    se sis.nome == 'linux' entao\r\n      sis.execute('clear');\r\n      term.defCorletra(term.amarelo);\r\n    senaose sis.nome == 'win32' entao\r\n      sis.execute('cls');\r\n    fim\r\n  \r\n  \r\n    imprima[[\r\n    -------------- Exemplos ---------- \r\n     \r\n    Obs.: exemplo de bloco:\r\n       --\r\n       funcao soma(a,b)\r\n         imprima(a+b)\r\n       fim\r\n       --\r\n       soma(3,5);\r\n       ou -inicio\r\n             funcao soma(a,b)\r\n               imprima(a+b)\r\n             fim\r\n          -fim\r\n          soma(3,5);\r\n      \r\n    [s = sair\/ ENTER para continuar ...] ]]\r\n    \r\n   op = obt_opcao();   \r\n   se op == 's' ou op == 'S' entao\r\n     vapara fim_exemplos;\r\n   fim\r\n   \r\n    se sis.nome == 'linux' entao\r\n      sis.execute('clear');\r\n      term.defCorletra(term.amarelo);\r\n    senaose sis.nome == 'win32' entao\r\n      sis.execute('cls');\r\n    fim\r\n   \r\n   imprima[[\r\n    -------------- Exemplos ---------- \r\n     x = 1;\r\n     enquanto x &lt;= 10 inicio\r\n       imprima(x)\r\n     fim\r\n     \r\n     funcao soma(a,b)\r\n       retorne a+b;\r\n     fim\r\n     imprima( soma(32, 15);\r\n      \r\n    [ ENTER para continuar ... ]\r\n   ]]\r\n   leia();   \r\n fim \/\/fim se op &lt;&gt; 's'\r\n \r\n ::fim_exemplos:: \/\/rotulo para usar com o comando vapara (v\u00e1 para...)\r\n \r\n se sis.nome == 'linux' entao\r\n  term.defPadrao(); \/\/volta ao normal.\r\n fim\r\n \r\n se sis.nome == 'linux' entao\r\n   term.limpeTela();\r\n senao\r\n   sis.execute'cls';\r\n fim\r\n        imprima_cab();\r\n        \/\/imprimaf(_Prompt1);\r\n        ret = verdadeiro;\r\nfim\r\n\r\nfuncao execute_imprima( cmd )\r\n  se sis.nome == 'linux' entao term.ad_historico(cmd) fim;\r\n  local cmd2 = cmd:corte(2, #cmd); \/\/elimina o '='\r\n  local str = string.formate(\"imprima( %s )\", cmd2);\/\/imprima(3+2) por exemplo.\r\n  local ret, err = executestring(str);\r\n  se nao ret entao\r\n    imprima_erro(err);\r\n  fim\r\nfim \r\n\r\nfuncao imprima_erro(err)\r\n  se sis.nome == 'linux' entao\r\n   term.defCorletra(term.vermelho);\r\n  fim\r\n  imprima(err);\r\n  se sis.nome == 'linux' entao\r\n   term.defPadrao();\r\n  fim\r\n  \r\nfim\r\n\r\nfuncao leia_cmd(str)\r\n  se sis.nome == 'linux' entao\r\n    local cmd = term.leia(str);\r\n    term.ad_historico(cmd);\/\/ao apertar a tecla `cima' mostra o que foi digitado anteriormente.\r\n    retorne cmd;\r\n  senao\r\n    imprimaf(str);\r\n    retorne leia();\r\n  fim\r\n  \r\nfim\r\n\r\nfuncao limpe_tela()\r\n se sis.nome == 'linux' entao\r\n  term.defPadrao(); \/\/volta ao normal.\r\n  term.limpeTela();\r\n senao\r\n   sis.execute'cls';\r\n fim\r\n imprima_cab();\r\nfim\r\n\r\nfuncao obt_opcao(cc)\r\n  local cc = cc ou '&gt;';\r\n  imprimaf('\\n%s',cc);\r\n  local op = '';\r\n  se sis.nome == 'linux' entao \r\n    op = term.obtcar();\/\/nao precisa pressionar enter, retorna um caractere por vez em numero.\r\n    op = car(op);\/\/converte de numero para car.\r\n  senao\r\n    op = leia(); \r\n  fim\r\n  retorne op;\r\nfim\r\n\r\n_Licenca = [[-------------- Licenca ----------------\r\n  A permiss\u00e3o \u00e9 concedida, a t\u00edtulo gratuito, a qualquer pessoa que obtenha uma \r\n  c\u00f3pia deste software e arquivos de documenta\u00e7\u00e3o associados (o \"Software\"), para\r\n  negociar o Software sem restri\u00e7\u00e3o, incluindo, sem limita\u00e7\u00e3o, os direitos para \r\n  usar, copiar, modificar, mesclar, publicar, distribuir, sublicenciar e \/ ou \r\n  vender   c\u00f3pias do Software, e permitir que as pessoas a quem o Software \u00e9 \r\n  fornecido o fa\u00e7am, sujeito \u00e0s seguintes condi\u00e7\u00f5es:\r\n\r\n  O aviso de autoria acima e este aviso de permiss\u00e3o devem ser inclu\u00eddos em\r\n  todas as c\u00f3pias ou partes substanciais do Software.\r\n\r\n  O SOFTWARE \u00c9 FORNECIDO \"COMO EST\u00c1\", SEM GARANTIA DE QUALQUER TIPO, EXPRESSA OU\r\n  IMPL\u00cdCITA, INCLUINDO, SEM LIMITA\u00c7\u00c3O, AS GARANTIAS DE COMERCIALIZA\u00c7\u00c3O,\r\n  ADEQUA\u00c7\u00c3O A UM DETERMINADO FIM E N\u00c3O VIOLA\u00c7\u00c3O. EM NENHUMA HIP\u00d3TESE OS\r\n  AUTORES OU DETENTORES DE DIREITOS AUTORAIS SER\u00c3O RESPONS\u00c1VEIS POR QUALQUER \r\n  RECLAMA\u00c7\u00c3O, DANOS OU OUTRAS RESPONSABILIDADES, SEJA EM UMA A\u00c7\u00c3O DE CUMPRIMENTO \r\n  DE CONTRATO OU QUALQUER OUTRO MEIO, OU EM CONEX\u00c3O COM O SOFTWARE OU O USO OU \r\n  OUTRAS FUN\u00c7\u00d5ES DO SOFTWARE.\r\n  ]]\r\n\r\n\r\n_Manual = [[\r\n\r\n        Manual\r\n        \r\n   prismaterm \u00e9 um terminal interativo para comandos em linguagem Prisma.\r\n   Exemplo de comando: imprima('Ola Mundo em Prisma');\r\n   \r\n   Parametros externos:\r\n   \r\n   prismaterm -e string : executa a string ao ser chamado\r\n   prismaterm -l lib    : carrega uma biblioteca lib.\r\n   prismaterm arquivo   : executa o arquivo.\r\n   \r\n   \r\n   Aceita os seguintes par\u00e2metros internos:\r\n    -a : exibe ajuda.\r\n    -v : exibe versao e autor.\r\n    -r : retorna a tela para o inicio, como estava quando prismaterm foi aberto.\r\n    -i : abre um bloco multilinha\r\n         neste caso voc\u00ea pode digitar um comando de v\u00e1rias linhas\r\n         e quando quiser executa-lo digite: --\r\n         Obs. o -i e o -- devem estar em linha separada do bloco, ex.:\r\n         &gt; -i\r\n          funcao ola()\r\n            imprima'ola'\r\n          fim\r\n         --\r\n         &gt;&gt; ola()\r\n         ola\r\n         &gt;&gt;\r\n         \r\n    -s : sai do programa. \r\n    -c : modo calculadora.\r\n         neste modo pode-se digitar uma operacao e o resultado sera\r\n         impresso automaticamente. \r\n         Ex.:\r\n              &gt;&gt; -c\r\n                Modo calculadora iniciado [ -- = sair]\r\n                5+2+1\r\n                8\r\n                4\/2\r\n                2\r\n                ou ainda outros valores:\r\n                'ola'\r\n                ola\r\n                 4 == 4\r\n                 verdadeiro\r\n                 4 == 1\r\n                 falso\r\n    -l : exibe a licenca deste programa.\r\n    -- : fecha: bloco ou modo calculadora.\r\n         Obs. a opcao de fechar deve estar em linha unica.\r\n    = valor  : funciona como um imprima(valor);\r\n         = 'ola' o mesmo que imprima('ola')\r\n         = 4+3   o mesmo que imprima(4+3);\r\n         ex.:\r\n           &gt;&gt; = 'Ola mundo'\r\n           Ola mundo\r\n           &gt;&gt; = 3+9\r\n           12\r\n           &gt;&gt; = 5 == 10\r\n           falso.\r\n           etc.\r\n           \r\nEnter para continuar ... ]];\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>Falou, at\u00e9 mais&#8230;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Este \u00e9 um programa feito em Prisma que imita o prompt prisma. H\u00e1 v\u00e1rias fun\u00e7\u00f5es da lib terminal e term que poder\u00e1 ajudar quem programa para terminal usando Prisma. Segue o c\u00f3digo, bons estudos: \/\/prompt interativo prisma feito em puro prisma com mais op\u00e7\u00f5es \/\/v 0.99 3 jan de 2017 \/\/conf padrao: _Cabecalho = _VERSAO&#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-3022","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\/3022","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=3022"}],"version-history":[{"count":3,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/posts\/3022\/revisions"}],"predecessor-version":[{"id":3026,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/posts\/3022\/revisions\/3026"}],"wp:attachment":[{"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/media?parent=3022"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/categories?post=3022"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/tags?post=3022"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}