#!/usr/bin/perl use strict; use warnings; use Term::ReadLine; my $name = '#perl.br calc'; print $name.$/; my $term = Term::ReadLine->new($name); $term->Features()->{'autohistory'} = 1; my $prompt = "> "; my $OUT = $term->OUT || \*STDOUT; my $___eval_str___; my $M = 0; my $scale = 2; sub ler { my $a = $term->readline($prompt); unless (defined $a) { print $/; exit(0); } return $a; } sub substituir { my $a = shift; $a =~ s/^(.+)(\*\*)$/\$M $2 $1/; $a =~ s/^(.+)(\+|\-|\*|\/)$/\$M $2 $1/; $a =~ s/\;\s*$//; if ($a =~ /^\s*do {\s*$/) { my $block = ''; my $count = 1; while (defined($_=$term->readline(' '.('.'x$count).' '))) { while ($_ =~ m/\{/g) { $count++; } while ($_ =~ m/\}/g) { $count--; } last if $count < 1; $block .= $_; } $a = 'do {'.$block.'}'; } return $a; } sub falar { my $a = shift; if ($@) { print "! ".$@; } else { if (defined $a && $a =~ /^[\d\.]$/) { $M=sprintf("%.".$scale."f",$a); } elsif ($a) { $M=$a; } print $OUT "= ".$M.$/ if defined $M; } } sub doit { $___eval_str___ = ' eval(" falar(".substituir(ler())."); $___eval_str___; "); if($@){ print "! ".$@; eval($___eval_str___) } '; eval $___eval_str___; } doit();