Beefy Boxes and Bandwidth Generously Provided by pair Networks
Just another Perl shrine
 
PerlMonks  

#perl.br calc - A Perl Shell

by ruoso (Curate)
on May 31, 2006 at 18:05 UTC ( [id://552887]=CUFP: print w/replies, xml ) Need Help??

Using a trick by [id://fglock], and with the help of the guys at #perl.br (at freenode.org), here is the #perl.br calc, which I now use in place of bc...

Obviously, you'll see it's just a Perl Shell that have some calculator shortcuts, so, you can do whatever you want with it...

#!/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();
daniel

Replies are listed 'Best First'.
Re: #perl.br calc - A Perl Shell
by AltBlue (Chaplain) on Jun 01, 2006 at 07:56 UTC
    Perl, computing... hmm ;-) Compare these:
    $ echo 'x=y=1.2; x+=1.1; x-=1.1; x; y; x==y' |bc |xargs echo 1.2 1.2 1
    $ perl -wle '$x=$y=1.2; $x+=1.1; $x-=1.1; $,=$"; print $x, $y, $x == $ +y' 1.2 1.2
    don't you love perl? ;-)

      As a quick calculator (especially with vector/matrix ops) I like the J programming language. It's not quite good as a real programming language IMO, but it's ideal for doing some quick numeric computations. GNU octave is good for the same purpose as well.

Re: #perl.br calc - A Perl Shell
by Scott7477 (Chaplain) on May 31, 2006 at 19:42 UTC
    I ran this on Windows XP SP2 using ActiveState 5.8.7 and got this error message:
    SetConsoleMode failed, LastError=|6| at c:/Perl/site/lib/Term/ReadKey.pm line 265.

      try without the $term->Features() line... If that still doesn't work, file a bug report against Term::ReadLine, or Term::ReadKey, or ActiveState...

      BTW... you still can try changing the $term->readline() for <STDIN>, i think.

      daniel
Re: #perl.br calc - A Perl Shell
by Discipulus (Canon) on Jun 01, 2006 at 07:28 UTC
    run fine on w2k SP4 perl, v5.8.6 built for MSWin32-x86-multi-thread ActiveState. ty

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: CUFP [id://552887]
Approved by Mago
Front-paged by Mago
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others learning in the Monastery: (4)
As of 2024-03-19 06:47 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found