#From preusche Tue Apr 30 14:54 MET 1996
#Date: Tue, 30 Apr 1996 14:54:21 +0200
#!/usr/local/bin/perl
#
# Oliver's erstes Perl-Programm: ein (gar nicht so dummer) Taschenrechner.
# 02/1996
$last=0;
for ($i=0; ; $i= ($i+1)%10)
{ print "#",$i,"= ";
$input = <STDIN>;
last if $input eq "";
chop $input;
# Replacement: implements own Syntax
if ($input eq "")
{ print "\t\t\t\t\t--> #", $i, '= ', $val[$i], "\n";
next;
}
{ $input =~ s/^\s*["](.*)["]\s*$/'$1'/g; # convert to single quote
$input =~ s/!(\d)/(eval(\$prog\[$1\]))/g; # evaluate Registers.
$input =~ s/!!!/(eval(\$lllastprog))/g; # evaluate last last last d.P.
$input =~ s/!!/(eval(\$llastprog))/g; # evaluate last last defined P.
$input =~ s/!/(eval(\$lastprog))/g; # evaluate last defined Program.
$input =~ s/#(\d)/(\$val\[$1\])/g; # Registers r<x>
$input =~ s/####/\$llllast /g; # Before Before Before Last result
$input =~ s/###/\$lllast /g; # Before Before Last result
$input =~ s/##/\$llast /g; # Before Last result
$input =~ s/#/\$last /g; # Last result
$input =~ s/pi/(4*atan2(1,1))/gi; # Pi
$input =~ s/E/(exp(1))/g; # e
$input =~ s/\^/**/g; # Exponent
# print $input, "\n";
}
# now check for special cases
if ($input =~ /^\s*(\?|[hH](elp|ELP)?)\s*$/)
{ $i--;
print <<"blabla";
Hilfe: Dies ist ein einfacher Taschenrechner in Perl.
Alte Werte werden in Registern abgespeichert, "#0" bis "#9".
Man kann auch Zeichenketten eingeben: in "'...'"- Anführungsstrichen
Zeichenketten kann man mit "!0" bis "!9" ausrechnen->Programm/Macros.
Letzte ausgerechnete Zahl: #, vorletzte ##, vorvorletzte ###, und ###
Letztes definierte Program !, vorletztes !!, vorvorlestes !!!.
Beispiel: "'#+##'" eingeben, dann "0", dann "1" und ab da dauernd "!"
(Fibonacci-Zahlen). Fixpunktberechnung ebenso einfach.
Pi: 3.14...
E: 2.718...
hex(...): hex->dez oct(...): oct->dez sprintf("%x",...) ->hex
C-Style Syntax.
14 Stellen Genauigkeit.
Perl-Programmierbar: "$otto=77; $otto^2" geht z.B. ($xxx:Perl-Variable).
Oder "for ($j=1; $j<5; $j++) {print $j;}"!!
Bitte nicht $i, $val, $last oder $input als Variablen verwenden!
blabla
}
elsif ($input =~ m/^\s*'(.*)'\s*$/) # treat macro-definition
{ $prog[$i]= $1;
$lllastprog=$llastprog; # take care of old definitions
$llastprog= $lastprog;
$lastprog= $prog[$i];
print "\t\t\t\t\t--> !", $i, '= ', $prog[$i], "\n";
print "\t\t\t\t\t--> #", $i, '= ', $val[$i], "\n";
}
else
{ $val[$i] = eval ($input . ";");
# print "Fehler: $@" if $@ ne "";
if ($@ eq "")
{ $lllllast=$llllast;
$llllast= $lllast;
$lllast= $llast;
$llast= $last;
$last=$val[$i];
}
else
{ print "\t\t\t\t\t--> ERROR; no change\n";
}
print "\t\t\t\t\t--> #", $i, '= ', $val[$i], "\n";
}
}
print "Thank you!\n"