<p>olha.. o brainfuck bloqueia enquanto está lendo. pq quer mudar o funcionamento do mesmo?</p>
<p>uma solução eh non blocking i/o usando IO::Select</p>
<div class="gmail_quote">Em 13/12/2012 20:18, "Aureliano Guedes" <<a href="mailto:guedes_1000@hotmail.com">guedes_1000@hotmail.com</a>> escreveu:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">



<div><div dir="ltr">



<div dir="ltr">Bom, estou em duvidas quanto ao que fazer no loop, como indicar que [ inicia e ] termina o loop.<br><br>ate agora, preencehndo o dever de casa<br><br>#!/usr/bin/env perl<br>use 5.010;<br>use strict;<br>use warnings qw(all);<br>
<br>local ($|, $/) = (1, \1);<br><br>my $p = 0;<br>my $lim = 5000;<br>my @a = (1..$lim);<br><br>for my $instr (<DATA>) {<br>    given ($instr) {<br>        when ('>') {$p++;}<br>        when ('<') {$p--}<br>
        when ('+') {$a[$p]++;}<br>        when ('-') {$a[$p]--;}<br>        when ('.') {print chr $a[$p];}<br>        when (',') {<br>            chomp (my $in = <>);<br>            $a[$p] = ord(substr($in,0,1));}<br>
        when ('[') { ... }<br>        when (']') { ... }<br>        default { next }<br>    }<br>}<br>__DATA__<br>+++++++++++<br>>+>>>>++++++++++++++++++++++++++++++++++++++++++++<br>>++++++++++++++++++++++++++++++++<<<<<<[>[>>>>>>+><br>
+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]<[>++++++++++[-<br><-[>>+>+<<<-]>>>[<<<+>>>-]+<[>[-]<[-]]>[<<[>>>+<<<<br>
-]>>[-]]<<]>>>[>>+>+<<<-]>>>[<<<+>>>-]+<[>[-]<[-]]<br>>[<<+>>[-]]<<<<<<<]>>>>>[+++++++++++++++++++++++++<br>
+++++++++++++++++++++++.[-]]++++++++++<[->-<]>++++<br>++++++++++++++++++++++++++++++++++++++++++++.[-]<<<br><<<<<<<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-]<-[>>.>.<<<<br>
[-]]<<[>>+>+<<<-]>>>[<<<+>>>-]<<[<+>-]>[<+>-]<<<-]<br><br>So mais uma perguntinha boba: Alguem sabe como colocar um limite de tempo no STDIN?<br>
<br>Exemplo, eu tenho :<br><br>my $input = <>;<br>if ($input == undef){<br>...<br>}<br>else{<br>...<br>}<br><br>Exemplo, input so tem 10 segundo para receber a entrada ou fica indefinido.<br>Vi algo como: <a href="http://www.perlmonks.org/index.pl?abspart=1;displaytype=displaycode;node_id=282330;part=1" target="_blank">http://www.perlmonks.org/index.pl?abspart=1;displaytype=displaycode;node_id=282330;part=1</a><br>
<br>Mas o que digito não aparece no monitor na hora que digito.<br><br><div><div></div><hr>From: <a href="mailto:tiago.peczenyj@gmail.com" target="_blank">tiago.peczenyj@gmail.com</a><br>Date: Thu, 13 Dec 2012 15:55:28 -0200<br>
To: <a href="mailto:rio-pm@pm.org" target="_blank">rio-pm@pm.org</a><br>Subject: Re: [Rio-pm] [Passatempo] Interpretador para BrainFuck<br><br><div>IMHO poderiamos abordar um esquema TDD</div><div><br></div><div>Eu criaria algo como</div>
<div><br></div><div>my $ret = Parser::parser($code, $stdin, $stdout);</div><div><br></div><div>$ret deveria retornar sucesso em caso do code ser valido</div>

<div><br></div><div>$stdout deveria receber a string "hello world" se o codigo brainfuck para hello world fosse introduzido</div><div><br></div><div>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.</div>


<div><br></div><div>os testes poderiam ser</div><div><br></div><div>ok( Parser::parser("", undef, undef),"um script vazio é um codigo valido");</div><div>ok( Parser::parser("comentario", undef, undef),"comentarios são qualquer caracter fora aqueles 8");</div>


<div><br></div><div>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.</div>


<div><br></div><div><br><div>2012/12/13 Stanislaw Pusep <span dir="ltr"><<a href="mailto:creaktive@gmail.com" target="_blank">creaktive@gmail.com</a>></span><br><blockquote style="border-left:1px #ccc solid;padding-left:1ex">


<div>Aureliano, o lexer do brainfuck utilizando given/when ficaria +/- assim:</div><div><br></div><div>#!/usr/bin/env perl</div><div>use 5.010;</div><div>use strict;</div><div>use warnings qw(all);</div><div><div>

<br></div><div>

local ($|, $/) = (1, \1);</div><div><br></div></div><div>for my $instr (<DATA>) {</div><div>    given ($instr) {</div><div>        when ('>') { ... }</div><div>        when ('<') { ... }</div>


<div>        when ('+') { ... }</div>

<div>        when ('-') { ... }</div><div>        when ('.') { ... }</div><div>        when (',') { ... }</div><div>        when ('[') { ... }</div><div>        when (']') { ... }</div>




<div>        default { next }</div><div>    }</div><div>}</div><div><br></div><div>__DATA__</div><div>+++++++++++</div><div><div>>+>>>>++++++++++++++++++++++++++++++++++++++++++++</div><div>>++++++++++++++++++++++++++++++++<<<<<<[>[>>>>>>+></div>




<div>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]<[>++++++++++[-</div><div><-[>>+>+<<<-]>>>[<<<+>>>-]+<[>[-]<[-]]>[<<[>>>+<<<</div>




<div>-]>>[-]]<<]>>>[>>+>+<<<-]>>>[<<<+>>>-]+<[>[-]<[-]]</div><div>>[<<+>>[-]]<<<<<<<]>>>>>[+++++++++++++++++++++++++</div>




<div>+++++++++++++++++++++++.[-]]++++++++++<[->-<]>++++</div><div>++++++++++++++++++++++++++++++++++++++++++++.[-]<<</div><div><<<<<<<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-]<-[>>.>.<<<</div>




<div>[-]]<<[>>+>+<<<-]>>>[<<<+>>>-]<<[<+>-]>[<+>-]<<<-]</div></div><div><br></div><div>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)</div>




<div><br>ABS()<br></div><div><div><br>
<br><br><div>2012/12/12 Aureliano Guedes <span dir="ltr"><<a href="mailto:guedes_1000@hotmail.com" target="_blank">guedes_1000@hotmail.com</a>></span><br><blockquote style="border-left:1px #ccc solid;padding-left:1ex">







<div><div dir="ltr">
Ainda não tinha me aventurado nas novidades do Perl 5.16.<br><br>o when eu entendi, mas o given não, alguem poderia me explicar o uso do given??<br><br>O break ja funciona no 5.16?? se sim, como???<br><br><div><div></div>




<hr>From: <a href="mailto:creaktive@gmail.com" target="_blank">creaktive@gmail.com</a><br>Date: Wed, 12 Dec 2012 14:06:14 -0200<div><div><br>To: <a href="mailto:rio-pm@pm.org" target="_blank">rio-pm@pm.org</a><br>

Subject: Re: [Rio-pm] [Passatempo] Interpretador para BrainFuck<br><br>As variáveis @loop e $s não afetam a lógica do seu programa.<div>Isso é, a sua implementação das instruções de ciclo condicional, [ e ], está incompleta.</div>




<div>Outra coisa, ao invés de usar if(){}elsif(){}, procure usar given/when, nesse caso seria mais apropriado.</div>

<div>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);</div><div><div><br></div>





<div>
ABS()<br></div><br>
<br><br><div>2012/12/11 Aureliano Guedes <span dir="ltr"><<a href="mailto:guedes_1000@hotmail.com" target="_blank">guedes_1000@hotmail.com</a>></span><br><blockquote style="border-left:1px #ccc solid;padding-left:1ex">









<div><div dir="ltr">
Por isso é passatempo, é pra quem tem tempo. hahaha<br><br>Valeu<br><br><div><div></div><hr>From: <a href="mailto:renato.cron@gmail.com" target="_blank">renato.cron@gmail.com</a><br>Date: Tue, 11 Dec 2012 21:45:03 -0200<div>






<div><br>To: <a href="mailto:rio-pm@pm.org" target="_blank">rio-pm@pm.org</a><br>Subject: Re: [Rio-pm] [Passatempo] Interpretador para BrainFuck<br><br>pow, <div><br></div><div>se ninguem te ajudar até domingo, até domingo eu do uma olhada! haha #<span style="color:rgb(34,34,34);font-size:18px;font-family:arial,sans-serif">semtemp</span><span style="color:rgb(34,34,34);font-size:18px;font-family:arial,sans-serif">o</span><br>








<br><div>2012/12/11 Aureliano Guedes <span dir="ltr"><<a href="mailto:guedes_1000@hotmail.com" target="_blank">guedes_1000@hotmail.com</a>></span><br><blockquote style="border-left:1px #ccc solid;padding-left:1ex">











<div><div dir="ltr">
Não so isso, deve ter algo mais.<br><br>Mesmo trocando <font style="font-size:8pt" color="#ACACAC" face="Consolas,Menlo,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,monospace,serif" size="1"><span style="font-size:12px;background-color:#f8f8f8"><font color="black"><span style="background-color:white"><font color="blue">$p</font><font color="#339933">--</font> <font color="#B1B100">if</font> <font color="#009900">(</font><font color="blue">$i</font> <font color="#B1B100">eq</font> <font color="red">'>'</font><font color="#009900">)</font><font color="#339933">;</font></span></font></span></font> por  <font style="font-size:8pt" color="#ACACAC" face="Consolas,Menlo,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,monospace,serif" size="1"><span style="font-size:12px;background-color:#f8f8f8"><font color="black"><span style="background-color:white"><font color="blue">$p</font><font color="#339933">--</font> <font color="#B1B100">if</font> <font color="#009900">(</font><font color="blue">$i</font> <font color="#B1B100">eq</font> <font color="red">'<font style="font-size:8pt" size="1"><</font>'</font><font color="#009900">)</font><font color="#339933">;</font></span></font></span></font>.<br>








<br>Os caracteres que saem são estranhos, não sai o que eu queria.<br><br><div><div></div><hr>From: <a href="mailto:renato.cron@gmail.com" target="_blank">renato.cron@gmail.com</a><br>Date: Tue, 11 Dec 2012 21:36:03 -0200<div>








<div><br>To: <a href="mailto:rio-pm@pm.org" target="_blank">rio-pm@pm.org</a><br>Subject: Re: [Rio-pm] [Passatempo] Interpretador para BrainFuck<br><br>não são essas linhas aqui?<div><br></div><div><ol style="padding:0px 0px 0px 48px;color:rgb(172,172,172);font-family:Consolas,Menlo,Monaco,'Lucida Console','Liberation Mono','DejaVu Sans Mono','Bitstream Vera Sans Mono',monospace,serif;font-size:12px;line-height:21px;background-color:rgb(248,248,248)">










<li><div style="padding:0px 5px;vertical-align:top;color:rgb(0,0,0);border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);background-color:rgb(255,255,255)"><span style="color:rgb(0,0,255)">        $p</span><span style="color:rgb(51,153,51)">++</span> <span style="color:rgb(177,177,0)">if</span> <span style="color:rgb(0,153,0)">(</span><span style="color:rgb(0,0,255)">$i</span> <span style="color:rgb(177,177,0)">eq</span> <span style="color:rgb(255,0,0)">'>'</span><span style="color:rgb(0,153,0)">)</span><span style="color:rgb(51,153,51)">;</span></div>










</li><li><div style="padding:0px 5px;vertical-align:top;color:rgb(0,0,0);border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);background-color:rgb(255,255,255)">        <span style="color:rgb(0,0,255)">$p</span><span style="color:rgb(51,153,51)">--</span> <span style="color:rgb(177,177,0)">if</span> <span style="color:rgb(0,153,0)">(</span><span style="color:rgb(0,0,255)">$i</span> <span style="color:rgb(177,177,0)">eq</span> <span style="color:rgb(255,0,0)">'>'</span><span style="color:rgb(0,153,0)">)</span><span style="color:rgb(51,153,51)">;</span></div>










</li></ol><br><div>2012/12/11 Aureliano Guedes <span dir="ltr"><<a href="mailto:guedes_1000@hotmail.com" target="_blank">guedes_1000@hotmail.com</a>></span><br><blockquote style="border-left:1px #ccc solid;padding-left:1ex">













<div><div dir="ltr">
ahsuahuhasuahsuah<br><br>Da hora mesmo, quando terminar, quem sabe não faço algo do tipo.<br><br><div><div></div><hr>From: <a href="mailto:creaktive@gmail.com" target="_blank">creaktive@gmail.com</a><br>Date: Tue, 11 Dec 2012 21:15:38 -0200<br>










To: <a href="mailto:rio-pm@pm.org" target="_blank">rio-pm@pm.org</a><br>Subject: Re: [Rio-pm] [Passatempo] Interpretador para BrainFuck<div><div><br><br>Dahora, parabéns :D<div>BTW, isso me lembrou de um "dialeto" do brainfuck, o trollscript: <a href="https://github.com/caius/trollscript" target="_blank">https://github.com/caius/trollscript</a></div>










<div>Isso é um "hello world" em trollscript:</div>

<div><span style="line-height:16px;color:rgb(51,51,51);font-size:12px;white-space:pre-wrap;font-family:Consolas,'Liberation Mono',Courier,monospace">Trooloolooloolooloolooloolooloolollooooolooloolooloolooloolooooolooloolooloolooloolooloolooloooooloolooloooooloooloolooloololllllooooloololoooooololooolooloolooloolooloololoolooolooloololooooooloololooooloololooloolooloolooloolooloolooloolooloolooloololooooolooolooloololooollollollollollolllooollollollollollollollollloooooololooooolooll</span></div>












<div>É sério.<font color="#333333" face="Consolas, Liberation Mono, Courier, monospace"><span style="font-size:12px;line-height:16px;white-space:pre-wrap"><br clear="all"></span></font><div><br>ABS()<br></div><br>
<br><br><div>2012/12/11 Aureliano Guedes <span dir="ltr"><<a href="mailto:guedes_1000@hotmail.com" target="_blank">guedes_1000@hotmail.com</a>></span><br><blockquote style="border-left:1px #ccc solid;padding-left:1ex">















<div><div dir="ltr">
Ola monges,<br><br>Estou desenvolvendo um novo brinquedo, como forma de passatempo mesmo, um interpretador para BrainFuck.<br><br>Futuramente pretendo desenvolver um compilador.<br><br>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.<br>












<br><a href="http://pastebin.com/aEppcPKt" target="_blank">http://pastebin.com/aEppcPKt</a><br><br>Para testarem um hello wolrd em BF:<br><br><pre style="min-height:36px"><br>++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.<br>












<br><br><br>Os comandos de brainfuck : <a href="http://pt.wikipedia.org/wiki/Brainfuck#Comandos" target="_blank">http://pt.wikipedia.org/wiki/Brainfuck#Comandos</a><br><br>Aqui tem um pequeno tutorial tambem: <a href="http://wiki.portugal-a-programar.pt/dev_geral:linguagens_esoterica:brainfuck" target="_blank">http://wiki.portugal-a-programar.pt/dev_geral:linguagens_esoterica:brainfuck</a><br>












<br>Aqui tambem: <br><br>Basicamente é isso:<br><br><a href="http://unauthorizedaccess.files.wordpress.com/2011/02/cmds.jpg?w=610" target="_blank">http://unauthorizedaccess.files.wordpress.com/2011/02/cmds.jpg?w=610</a><br>












</pre><br>                                    </div></div>
<br>_______________________________________________<br>
Rio-pm mailing list<br>
<a href="mailto:Rio-pm@pm.org" target="_blank">Rio-pm@pm.org</a><br>
<a href="http://mail.pm.org/mailman/listinfo/rio-pm" target="_blank">http://mail.pm.org/mailman/listinfo/rio-pm</a><br></blockquote></div><br></div>
<br>_______________________________________________
Rio-pm mailing list
<a href="mailto:Rio-pm@pm.org" target="_blank">Rio-pm@pm.org</a>
<a href="http://mail.pm.org/mailman/listinfo/rio-pm" target="_blank">http://mail.pm.org/mailman/listinfo/rio-pm</a></div></div></div>                                           </div></div>
<br>_______________________________________________<br>
Rio-pm mailing list<br>
<a href="mailto:Rio-pm@pm.org" target="_blank">Rio-pm@pm.org</a><br>
<a href="http://mail.pm.org/mailman/listinfo/rio-pm" target="_blank">http://mail.pm.org/mailman/listinfo/rio-pm</a><br></blockquote></div><br><br clear="all"><div><br></div>-- <br><div><span style="color:rgb(51,51,51);font-size:x-small">Saravá,</span></div>










<div><span style="color:rgb(51,51,51);font-size:x-small">Renato CRON</span></div><div><div style="text-align:right"><font color="#333333" size="1"><a href="http://www.renatocron.com/blog/" target="_blank">http://www.renatocron.com/blog/</a></font></div>










</div><div style="text-align:right"><font color="#333333" size="1"><a href="http://twitter.com/#%21/renato_cron" target="_blank">@renato_cron</a></font></div><br>
</div>
<br>_______________________________________________
Rio-pm mailing list
<a href="mailto:Rio-pm@pm.org" target="_blank">Rio-pm@pm.org</a>
<a href="http://mail.pm.org/mailman/listinfo/rio-pm" target="_blank">http://mail.pm.org/mailman/listinfo/rio-pm</a></div></div></div>                                           </div></div>
<br>_______________________________________________<br>
Rio-pm mailing list<br>
<a href="mailto:Rio-pm@pm.org" target="_blank">Rio-pm@pm.org</a><br>
<a href="http://mail.pm.org/mailman/listinfo/rio-pm" target="_blank">http://mail.pm.org/mailman/listinfo/rio-pm</a><br></blockquote></div><br><br clear="all"><div><br></div>-- <br><div><span style="color:rgb(51,51,51);font-size:x-small">Saravá,</span></div>








<div><span style="color:rgb(51,51,51);font-size:x-small">Renato CRON</span></div><div><div style="text-align:right"><font color="#333333" size="1"><a href="http://www.renatocron.com/blog/" target="_blank">http://www.renatocron.com/blog/</a></font></div>








</div><div style="text-align:right"><font color="#333333" size="1"><a href="http://twitter.com/#%21/renato_cron" target="_blank">@renato_cron</a></font></div><br>
</div>
<br>_______________________________________________
Rio-pm mailing list
<a href="mailto:Rio-pm@pm.org" target="_blank">Rio-pm@pm.org</a>
<a href="http://mail.pm.org/mailman/listinfo/rio-pm" target="_blank">http://mail.pm.org/mailman/listinfo/rio-pm</a></div></div></div>                                           </div></div>
<br>_______________________________________________<br>
Rio-pm mailing list<br>
<a href="mailto:Rio-pm@pm.org" target="_blank">Rio-pm@pm.org</a><br>
<a href="http://mail.pm.org/mailman/listinfo/rio-pm" target="_blank">http://mail.pm.org/mailman/listinfo/rio-pm</a><br></blockquote></div><br></div>
<br>_______________________________________________
Rio-pm mailing list
<a href="mailto:Rio-pm@pm.org" target="_blank">Rio-pm@pm.org</a>
<a href="http://mail.pm.org/mailman/listinfo/rio-pm" target="_blank">http://mail.pm.org/mailman/listinfo/rio-pm</a></div></div></div>                                           </div></div>
<br>_______________________________________________<br>
Rio-pm mailing list<br>
<a href="mailto:Rio-pm@pm.org" target="_blank">Rio-pm@pm.org</a><br>
<a href="http://mail.pm.org/mailman/listinfo/rio-pm" target="_blank">http://mail.pm.org/mailman/listinfo/rio-pm</a><br></blockquote></div><br>
</div></div><br>_______________________________________________<br>
Rio-pm mailing list<br>
<a href="mailto:Rio-pm@pm.org" target="_blank">Rio-pm@pm.org</a><br>
<a href="http://mail.pm.org/mailman/listinfo/rio-pm" target="_blank">http://mail.pm.org/mailman/listinfo/rio-pm</a><br></blockquote></div><br><br clear="all"><div><br></div>-- <br>Tiago B. Peczenyj<br>Linux User #405772<br>


<br><a href="http://pacman.blog.br" target="_blank">http://pacman.blog.br</a><br>
<br></div>
<br>_______________________________________________
Rio-pm mailing list
<a href="mailto:Rio-pm@pm.org" target="_blank">Rio-pm@pm.org</a>
<a href="http://mail.pm.org/mailman/listinfo/rio-pm" target="_blank">http://mail.pm.org/mailman/listinfo/rio-pm</a></div></div>
                                          </div></div>
<br>_______________________________________________<br>
Rio-pm mailing list<br>
<a href="mailto:Rio-pm@pm.org">Rio-pm@pm.org</a><br>
<a href="http://mail.pm.org/mailman/listinfo/rio-pm" target="_blank">http://mail.pm.org/mailman/listinfo/rio-pm</a><br></blockquote></div>