Acme-AlgebraicToRPN
view release on metacpan or search on metacpan
lib/Acme/AlgebraicToRPN.pm view on Meta::CPAN
=over 4
=item * AnnoCPAN: Annotated CPAN documentation
L<http://annocpan.org/dist/Acme-AlgebraicToRPN>
=item * CPAN Ratings
L<http://cpanratings.perl.org/d/Acme-AlgebraicToRPN>
=item * RT: CPAN's request tracker
L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=Acme-AlgebraicToRPN>
=item * Search CPAN
L<http://search.cpan.org/dist/Acme-AlgebraicToRPN>
=back
=head1 ACKNOWLEDGEMENTS
=head1 COPYRIGHT & LICENSE
Copyright 2009 X Cramps, all rights reserved.
This program is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.
=cut
package Acme::AlgebraicToRPN;
use strict;
use warnings;
use Regexp::Common;
use Perl6::Attributes;
use Math::Symbolic;
use Math::SymbolicX::ParserExtensionFactory;
=head2 B<new>
$al = Acme::AlgebraicToRPN->new(%opts);
%opts (optional) can be:
userFunc - user functions, as array reference
If you had a user function box and fft, you'd need to
specify them like this:
$al = Acme::AlgebraicToRPN->new(userFunc =>
[qw(box fft)]);
=cut
sub new {
my ($class, %opts) = @_;
my $self = \%opts;
bless $self, $class;
$.stack = [];
$.parser = Math::Symbolic::Parser->new;
$.Class = $class;
if (defined $.userFunc) {
my @uf = @{$.userFunc};
my %uf;
map { $uf{$_} = 1 } @uf;
$.userFunc = \%uf;
my %x;
map {
my $proc = $_;
$x{$_} = sub {
my $argumentstring = shift;
return Math::Symbolic::Constant->new(
qq($proc($argumentstring))
);
};
} @uf;
Math::SymbolicX::ParserExtensionFactory->add_private_functions(
$.parser,
%x
);
}
return $self;
}
=head2 B<rpn>
@stack = $al->rpn($expr);
Processes $expr (an algebraic format expression) and return the
stack necessary to process it. The stack consists entirely of
variables, constants and operations. For operations, be
prepared to handle (and others, see B<Math::Symbolic> documentation):
negate
add
subtract
multiply
divide
exponentiate
sin
cos
tan
cot
asin
acos
atan
atan2
acot
sinh
cosh
asinh
acosh
Plus any that you may add in constructor [1].
undef is returned if the parens don't balance. That's all the
checking we do.
( run in 1.161 second using v1.01-cache-2.11-cpan-5a3173703d6 )