[Rio-pm] [Passatempo] Interpretador para BrainFuck

Tiago Peczenyj tiago.peczenyj em gmail.com
Quinta Dezembro 13 14:27:56 PST 2012


alarm não vai resolver.
Em 13/12/2012 20:23, "Renato Santos" <renato.cron em gmail.com> escreveu:

> Procura no perldoc a função alarm
>
> --
> Renato Cron
>
> Sent from Samsung Mobile Phone
> Em 13/12/2012 20:18, "Aureliano Guedes" <guedes_1000 em hotmail.com>
> escreveu:
>
>>  Bom, estou em duvidas quanto ao que fazer no loop, como indicar que [
>> inicia e ] termina o loop.
>>
>> ate agora, preencehndo o dever de casa
>>
>> #!/usr/bin/env perl
>> use 5.010;
>> use strict;
>> use warnings qw(all);
>>
>> local ($|, $/) = (1, \1);
>>
>> my $p = 0;
>> my $lim = 5000;
>> my @a = (1..$lim);
>>
>> for my $instr (<DATA>) {
>>     given ($instr) {
>>         when ('>') {$p++;}
>>         when ('<') {$p--}
>>         when ('+') {$a[$p]++;}
>>         when ('-') {$a[$p]--;}
>>         when ('.') {print chr $a[$p];}
>>         when (',') {
>>             chomp (my $in = <>);
>>             $a[$p] = ord(substr($in,0,1));}
>>         when ('[') { ... }
>>         when (']') { ... }
>>         default { next }
>>     }
>> }
>> __DATA__
>> +++++++++++
>> >+>>>>++++++++++++++++++++++++++++++++++++++++++++
>> >++++++++++++++++++++++++++++++++<<<<<<[>[>>>>>>+>
>> +<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]<[>++++++++++[-
>> <-[>>+>+<<<-]>>>[<<<+>>>-]+<[>[-]<[-]]>[<<[>>>+<<<
>> -]>>[-]]<<]>>>[>>+>+<<<-]>>>[<<<+>>>-]+<[>[-]<[-]]
>> >[<<+>>[-]]<<<<<<<]>>>>>[+++++++++++++++++++++++++
>> +++++++++++++++++++++++.[-]]++++++++++<[->-<]>++++
>> ++++++++++++++++++++++++++++++++++++++++++++.[-]<<
>> <<<<<<<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-]<-[>>.>.<<<
>> [-]]<<[>>+>+<<<-]>>>[<<<+>>>-]<<[<+>-]>[<+>-]<<<-]
>>
>> So mais uma perguntinha boba: Alguem sabe como colocar um limite de tempo
>> no STDIN?
>>
>> Exemplo, eu tenho :
>>
>> my $input = <>;
>> if ($input == undef){
>> ...
>> }
>> else{
>> ...
>> }
>>
>> Exemplo, input so tem 10 segundo para receber a entrada ou fica
>> indefinido.
>> Vi algo como:
>> http://www.perlmonks.org/index.pl?abspart=1;displaytype=displaycode;node_id=282330;part=1
>>
>> Mas o que digito não aparece no monitor na hora que digito.
>>
>> ------------------------------
>> From: tiago.peczenyj em gmail.com
>> Date: Thu, 13 Dec 2012 15:55:28 -0200
>> To: rio-pm em pm.org
>> Subject: Re: [Rio-pm] [Passatempo] Interpretador para BrainFuck
>>
>> IMHO poderiamos abordar um esquema TDD
>>
>> Eu criaria algo como
>>
>> my $ret = Parser::parser($code, $stdin, $stdout);
>>
>> $ret deveria retornar sucesso em caso do code ser valido
>>
>> $stdout deveria receber a string "hello world" se o codigo brainfuck para
>> hello world fosse introduzido
>>
>> Usar o Test::More nesse caso seria bem interessante. Ainda mais se for
>> usado o Devel::Cover e analisado se o teste realmente exercitou todo o
>> codigo do parser.
>>
>> os testes poderiam ser
>>
>> ok( Parser::parser("", undef, undef),"um script vazio é um codigo
>> valido");
>> ok( Parser::parser("comentario", undef, undef),"comentarios são qualquer
>> caracter fora aqueles 8");
>>
>> para verificar se o stdin ou stdout foram lidos ou escritos, eu usaria o
>> Test::MockObject do chromatic. entretanto pode ficar um pouco complicado o
>> teste, talvez um IO::Handler de teste possa ser mais interessante.
>>
>>
>> 2012/12/13 Stanislaw Pusep <creaktive em gmail.com>
>>
>> Aureliano, o lexer do brainfuck utilizando given/when ficaria +/- assim:
>>
>> #!/usr/bin/env perl
>> use 5.010;
>> use strict;
>> use warnings qw(all);
>>
>> local ($|, $/) = (1, \1);
>>
>> for my $instr (<DATA>) {
>>     given ($instr) {
>>         when ('>') { ... }
>>         when ('<') { ... }
>>         when ('+') { ... }
>>         when ('-') { ... }
>>         when ('.') { ... }
>>         when (',') { ... }
>>         when ('[') { ... }
>>         when (']') { ... }
>>         default { next }
>>     }
>> }
>>
>> __DATA__
>> +++++++++++
>> >+>>>>++++++++++++++++++++++++++++++++++++++++++++
>> >++++++++++++++++++++++++++++++++<<<<<<[>[>>>>>>+>
>> +<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]<[>++++++++++[-
>> <-[>>+>+<<<-]>>>[<<<+>>>-]+<[>[-]<[-]]>[<<[>>>+<<<
>> -]>>[-]]<<]>>>[>>+>+<<<-]>>>[<<<+>>>-]+<[>[-]<[-]]
>> >[<<+>>[-]]<<<<<<<]>>>>>[+++++++++++++++++++++++++
>> +++++++++++++++++++++++.[-]]++++++++++<[->-<]>++++
>> ++++++++++++++++++++++++++++++++++++++++++++.[-]<<
>> <<<<<<<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-]<-[>>.>.<<<
>> [-]]<<[>>+>+<<<-]>>>[<<<+>>>-]<<[<+>-]>[<+>-]<<<-]
>>
>> Lição de casa: preencher os espaços dos '...' para que calcule e imprima
>> "1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89" (pq "Hello World!" é muito fácil,
>> rsss)
>>
>> ABS()
>>
>>
>>
>> 2012/12/12 Aureliano Guedes <guedes_1000 em hotmail.com>
>>
>>  Ainda não tinha me aventurado nas novidades do Perl 5.16.
>>
>> o when eu entendi, mas o given não, alguem poderia me explicar o uso do
>> given??
>>
>> O break ja funciona no 5.16?? se sim, como???
>>
>> ------------------------------
>> From: creaktive em gmail.com
>> Date: Wed, 12 Dec 2012 14:06:14 -0200
>>
>> To: rio-pm em pm.org
>> Subject: Re: [Rio-pm] [Passatempo] Interpretador para BrainFuck
>>
>> As variáveis @loop e $s não afetam a lógica do seu programa.
>> Isso é, a sua implementação das instruções de ciclo condicional, [ e ],
>> está incompleta.
>> Outra coisa, ao invés de usar if(){}elsif(){}, procure usar given/when,
>> nesse caso seria mais apropriado.
>> Por fim, o I/O do brainfuck é por caractere, então certifique-se de que o
>> buffering de I/O do Perl esteja desligado e que <> retorne 1 caractere de
>> cada vez: local ($|, $/) = (1, \1);
>>
>>  ABS()
>>
>>
>>
>> 2012/12/11 Aureliano Guedes <guedes_1000 em hotmail.com>
>>
>>  Por isso é passatempo, é pra quem tem tempo. hahaha
>>
>> Valeu
>>
>> ------------------------------
>> From: renato.cron em gmail.com
>> Date: Tue, 11 Dec 2012 21:45:03 -0200
>>
>> To: rio-pm em pm.org
>> Subject: Re: [Rio-pm] [Passatempo] Interpretador para BrainFuck
>>
>> pow,
>>
>> se ninguem te ajudar até domingo, até domingo eu do uma olhada! haha #
>> semtempo
>>
>> 2012/12/11 Aureliano Guedes <guedes_1000 em hotmail.com>
>>
>>  Não so isso, deve ter algo mais.
>>
>> Mesmo trocando $p-- if ($i eq '>'); por  $p-- if ($i eq '<');.
>>
>> Os caracteres que saem são estranhos, não sai o que eu queria.
>>
>> ------------------------------
>> From: renato.cron em gmail.com
>> Date: Tue, 11 Dec 2012 21:36:03 -0200
>>
>> To: rio-pm em pm.org
>> Subject: Re: [Rio-pm] [Passatempo] Interpretador para BrainFuck
>>
>> não são essas linhas aqui?
>>
>>
>>    1.         $p++ if ($i eq '>');
>>    2.         $p-- if ($i eq '>');
>>
>>
>> 2012/12/11 Aureliano Guedes <guedes_1000 em hotmail.com>
>>
>>  ahsuahuhasuahsuah
>>
>> Da hora mesmo, quando terminar, quem sabe não faço algo do tipo.
>>
>> ------------------------------
>> From: creaktive em gmail.com
>> Date: Tue, 11 Dec 2012 21:15:38 -0200
>> To: rio-pm em pm.org
>> Subject: Re: [Rio-pm] [Passatempo] Interpretador para BrainFuck
>>
>>
>> Dahora, parabéns :D
>> BTW, isso me lembrou de um "dialeto" do brainfuck, o trollscript:
>> https://github.com/caius/trollscript
>> Isso é um "hello world" em trollscript:
>>
>> Trooloolooloolooloolooloolooloolollooooolooloolooloolooloolooooolooloolooloolooloolooloolooloooooloolooloooooloooloolooloololllllooooloololoooooololooolooloolooloolooloololoolooolooloololooooooloololooooloololooloolooloolooloolooloolooloolooloolooloololooooolooolooloololooollollollollollolllooollollollollollollollollloooooololooooolooll
>> É sério.
>>
>> ABS()
>>
>>
>>
>> 2012/12/11 Aureliano Guedes <guedes_1000 em hotmail.com>
>>
>>  Ola monges,
>>
>> Estou desenvolvendo um novo brinquedo, como forma de passatempo mesmo, um
>> interpretador para BrainFuck.
>>
>> Futuramente pretendo desenvolver um compilador.
>>
>> Se alguem se interessar pelo assunto e puder colaborar e/ou ajudar, o que
>> deesenvolvi ainda não esta funcional, e estou tendo algumas dificuldades.
>>
>> http://pastebin.com/aEppcPKt
>>
>> Para testarem um hello wolrd em BF:
>>
>>
>> ++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>> Os comandos de brainfuck : http://pt.wikipedia.org/wiki/Brainfuck#Comandos
>>
>> Aqui tem um pequeno tutorial tambem: http://wiki.portugal-a-programar.pt/dev_geral:linguagens_esoterica:brainfuck
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>> Aqui tambem:
>>
>> Basicamente é isso:
>>
>> http://unauthorizedaccess.files.wordpress.com/2011/02/cmds.jpg?w=610
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>> _______________________________________________
>> Rio-pm mailing list
>> Rio-pm em pm.org
>> http://mail.pm.org/mailman/listinfo/rio-pm
>>
>>
>>
>> _______________________________________________ Rio-pm mailing list
>> Rio-pm em pm.org http://mail.pm.org/mailman/listinfo/rio-pm
>>
>> _______________________________________________
>> Rio-pm mailing list
>> Rio-pm em pm.org
>> http://mail.pm.org/mailman/listinfo/rio-pm
>>
>>
>>
>>
>> --
>> Saravá,
>> Renato CRON
>> http://www.renatocron.com/blog/
>> @renato_cron <http://twitter.com/#%21/renato_cron>
>>
>>
>> _______________________________________________ Rio-pm mailing list
>> Rio-pm em pm.org http://mail.pm.org/mailman/listinfo/rio-pm
>>
>> _______________________________________________
>> Rio-pm mailing list
>> Rio-pm em pm.org
>> http://mail.pm.org/mailman/listinfo/rio-pm
>>
>>
>>
>>
>> --
>> Saravá,
>> Renato CRON
>> http://www.renatocron.com/blog/
>> @renato_cron <http://twitter.com/#%21/renato_cron>
>>
>>
>> _______________________________________________ Rio-pm mailing list
>> Rio-pm em pm.org http://mail.pm.org/mailman/listinfo/rio-pm
>>
>> _______________________________________________
>> Rio-pm mailing list
>> Rio-pm em pm.org
>> http://mail.pm.org/mailman/listinfo/rio-pm
>>
>>
>>
>> _______________________________________________ Rio-pm mailing list
>> Rio-pm em pm.org http://mail.pm.org/mailman/listinfo/rio-pm
>>
>> _______________________________________________
>> Rio-pm mailing list
>> Rio-pm em pm.org
>> http://mail.pm.org/mailman/listinfo/rio-pm
>>
>>
>>
>> _______________________________________________
>> Rio-pm mailing list
>> Rio-pm em pm.org
>> http://mail.pm.org/mailman/listinfo/rio-pm
>>
>>
>>
>>
>> --
>> Tiago B. Peczenyj
>> Linux User #405772
>>
>> http://pacman.blog.br
>>
>>
>> _______________________________________________ Rio-pm mailing list
>> Rio-pm em pm.org http://mail.pm.org/mailman/listinfo/rio-pm
>>
>> _______________________________________________
>> Rio-pm mailing list
>> Rio-pm em pm.org
>> http://mail.pm.org/mailman/listinfo/rio-pm
>>
>
> _______________________________________________
> Rio-pm mailing list
> Rio-pm em pm.org
> http://mail.pm.org/mailman/listinfo/rio-pm
>
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/rio-pm/attachments/20121213/fd0422d5/attachment-0001.html>


Mais detalhes sobre a lista de discussão Rio-pm