[Rio-pm] [Passatempo] Interpretador para BrainFuck

Aureliano Guedes guedes_1000 em hotmail.com
Quinta Dezembro 13 14:18:06 PST 2012





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 perluse 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?










        $p++ if ($i eq '>');









        $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 :DBTW, 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 CRONhttp://www.renatocron.com/blog/









@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 CRONhttp://www.renatocron.com/blog/







@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
 		 	   		  
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/rio-pm/attachments/20121213/fbcef768/attachment-0001.html>


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