[Rio-pm] [Passatempo] Interpretador para BrainFuck

Tiago Peczenyj tiago.peczenyj em gmail.com
Quinta Dezembro 13 14:23:43 PST 2012


olha.. o brainfuck bloqueia enquanto está lendo. pq quer mudar o
funcionamento do mesmo?

uma solução eh non blocking i/o usando IO::Select
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
>
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/rio-pm/attachments/20121213/d1fb82be/attachment-0001.html>


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