📄 arithmetic.pm
字号:
# vim:ts=4 sw=4
# ----------------------------------------------------------------------------------------------------
# Name : ETL::Pequel3::Type::Arithmetic.pm
# Created : 8 May 2006
# Author : Mario Gaffiero (gaffie)
#
# Copyright 1999-2007 Mario Gaffiero.
#
# This file is part of Pequel(TM).
#
# Pequel is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# Pequel is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Pequel; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
# ----------------------------------------------------------------------------------------------------
# Modification History
# When Version Who What
# ----------------------------------------------------------------------------------------------------
require 5.005_62;
use strict;
use warnings;
$VERSION = 0.01;
$BUILD = 'Friday September 22 21:19:58 BST 2006';
use ETL::Pequel3::Type::Macros;
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::Macros::Arithmetic::Abstract;
use base qw(ETL::Pequel3::Type::Macros::Abstract);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'category', default => 'arithmetic');
use Class::STL::ClassMembers::Constructor;
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::Macros::Arithmetic::Generic;
use base qw(ETL::Pequel3::Type::Macros::Arithmetic::Abstract);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'category', default => 'arithmetic');
use Class::STL::ClassMembers::Constructor;
sub translate
{
my $self = shift;
my $c = $self->SUPER::translate(@_);
$c->code("@{[ $self->name() ]}($_[0])");
return $c;
}
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::Macros::Vec;
use base qw(ETL::Pequel3::Type::Macros::Arithmetic::Generic);
use Class::STL::ClassMembers
#> Class::STL::ClassMembers::DataMember->new(name => 'description', default => '_TR_(macro_sqrt_description)'),
Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Treats string I<expr> as a vector of unsigned integers of I<bits> each, and yealds the decimal value of the element at I<offset>. I<bits> must be a power of 2 greater than 0.'),
Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&vec(E<lt> I<expr> E<gt>, E<lt> I<offset> E<gt>, E<lt> I<bits> E<gt>)'),
Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'vec');
use Class::STL::ClassMembers::Constructor;
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::Macros::Hex;
use base qw(ETL::Pequel3::Type::Macros::Arithmetic::Generic);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Returns the decimal value of I<expr> interpreted as a hexadecimal string. The string may, optionally, start with I<0x>.'),
Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&hex(E<lt> I<expr> E<gt>)'),
Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'hex');
use Class::STL::ClassMembers::Constructor;
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::Macros::Oct;
use base qw(ETL::Pequel3::Type::Macros::Arithmetic::Generic);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Returns the decimal value of I<expr> interpreted as an octal string. It the string starts with I<0x>, it will be interpreted as a hexadecimal string; if it starts of with I<0b>, it will be interpreted as a binary string.'),
Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&oct(E<lt> I<expr> E<gt>)'),
Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'oct');
use Class::STL::ClassMembers::Constructor;
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::Macros::Ord;
use base qw(ETL::Pequel3::Type::Macros::Arithmetic::Generic);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Returns the ordinal value of the first character or I<expr>.'),
Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&ord(E<lt> I<expr> E<gt>)'),
Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'ord');
use Class::STL::ClassMembers::Constructor;
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::Macros::Sqrt;
use base qw(ETL::Pequel3::Type::Macros::Arithmetic::Generic);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Return the square root of I<expr>.'),
Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&sqrt(E<lt> I<expr> E<gt>)'),
Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'sqrt');
use Class::STL::ClassMembers::Constructor;
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::Macros::Rand;
use base qw(ETL::Pequel3::Type::Macros::Arithmetic::Generic);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Returns a random fractional number between 0 and the value of I<expr> (exclusive). If I<expr> is omitted it defaults to 1.'),
Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&rand( [ E<lt> I<expr> E<gt> ] )'),
Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'rand');
use Class::STL::ClassMembers::Constructor;
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::Macros::Sin;
use base qw(ETL::Pequel3::Type::Macros::Arithmetic::Generic);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Returns the sine of I<expr> (expressed in radians).'),
Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&sin(E<lt> I<expr> E<gt>)'),
Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'sin');
use Class::STL::ClassMembers::Constructor;
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::Macros::Exp;
use base qw(ETL::Pequel3::Type::Macros::Arithmetic::Generic);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Returns I<e> to the power of I<expr>.'),
Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&exp(E<lt> I<expr> E<gt>)'),
Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'exp');
use Class::STL::ClassMembers::Constructor;
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::Macros::Cos;
use base qw(ETL::Pequel3::Type::Macros::Arithmetic::Generic);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Returns the cosine of I<expr> (expressed in radians).'),
Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&cos(E<lt> I<expr> E<gt>)'),
Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'cos');
use Class::STL::ClassMembers::Constructor;
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::Macros::Log;
use base qw(ETL::Pequel3::Type::Macros::Arithmetic::Generic);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Returns the natural logarithm (base I<e>) of I<expr>.'),
Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&log(E<lt> I<expr> E<gt>)'),
Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'log');
use Class::STL::ClassMembers::Constructor;
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::Macros::Chr;
use base qw(ETL::Pequel3::Type::Macros::Arithmetic::Generic);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Returns the character represented by the decimal value I<expr>.'),
Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&chr(E<lt> I<expr> E<gt>)'),
Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'chr');
use Class::STL::ClassMembers::Constructor;
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::Macros::Abs;
use base qw(ETL::Pequel3::Type::Macros::Arithmetic::Generic);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Returns the absolute value of I<expr>.'),
Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&abs(E<lt> I<expr> E<gt>)'),
Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'abs');
use Class::STL::ClassMembers::Constructor;
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::Macros::Int;
use base qw(ETL::Pequel3::Type::Macros::Arithmetic::Generic);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'description', default => ''),
Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&int(E<lt> I<expr> E<gt>)'),
Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'int');
use Class::STL::ClassMembers::Constructor;
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::Macros::Atan2;
use base qw(ETL::Pequel3::Type::Macros::Arithmetic::Abstract);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Returns the arctangle of I<y/x> in the range of -pie/2 to + pie/2.'),
Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&atan2(E<lt> I<y> E<gt>, E<lt> I<x> E<gt>)'),
Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'atan2');
use Class::STL::ClassMembers::Constructor;
sub translate
{
my $self = shift;
my $c = $self->SUPER::translate(@_);
$c->code("@{[ $self->name() ]}($_[0], $_[1])");
return $c;
}
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::Macros::Sign;
use base qw(ETL::Pequel3::Type::Macros::Arithmetic::Abstract);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Returns I<-1> if I<expr> is negative; I<0> if zero; I<1> if positive.'),
Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&sign(E<lt> I<expr> E<gt>)'),
Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'sign');
use Class::STL::ClassMembers::Constructor;
sub translate
{
my $self = shift;
my $c = $self->SUPER::translate(@_);
$c->code("($_[0] < 0 ? -1 : $_[0] == 0 ? 0 : 1)");
return $c;
}
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::Macros::Trunc;
use base qw(ETL::Pequel3::Type::Macros::Arithmetic::Abstract);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Returns I<expr> truncated to I<dec> decimal places. If I<dec> is omitted, then I<expr> is truncated to 0 places. I<dec> can be negative to truncate (make zero) I<dec> digits left of the decimal point.'),
Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&trunc(E<lt> I<expr> E<gt>, E<lt> I<dec> E<gt>)'),
Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'trunc');
use Class::STL::ClassMembers::Constructor;
sub translate
{
my $self = shift;
my $c = $self->SUPER::translate(@_);
$self->err()->user_error(10701, "&trunc(): invalid second argument -- must be numeric!")
unless(defined($_[1]) && $_[1] =~ /[\-\d]+/);
$c->code("index($_[0], '.') == -1 ");
$c->over();
$c->code("? sprintf(\"%ld\", @{[ $_[1]>=0 ? $_[0] : qq/substr($_[0], 0, &length($_[0]) + $_[1]) . ('0' x ($_[1] * -1))/ ]}) ");
$c->code(": sprintf(\"%ld%s%.*s\", ");
$c->code("@{[ $_[1]>=0 ? $_[0] : qq/(substr($_[0], 0, index($_[0], '.') + $_[1]) . ('0' x ($_[1] * -1)))/ ]}, ");
$c->over();
$c->code("'@{[ $_[1]>0 ? '.' : '' ]}', ");
$c->code("@{[ $_[1]<0 ? '0' : $_[1] ]}, ");
$c->code("substr($_[0], index($_[0], '.')+1)");
$c->back();
$c->code(")");
return $c;
}
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::Macros::Arithmetic;
use ETL::Pequel3::Type::Extension;
use base qw(ETL::Pequel3::Type::Extension::Abstract);
use Class::STL::ClassMembers;
use Class::STL::ClassMembers::SingletonConstructor;
sub new_extra
{
my $self = shift;
$self->catalogue()->macros()->push_front(
ETL::Pequel3::Type::Macros::Hex->new(),
ETL::Pequel3::Type::Macros::Oct->new(),
ETL::Pequel3::Type::Macros::Vec->new(),
ETL::Pequel3::Type::Macros::Ord->new(),
ETL::Pequel3::Type::Macros::Sqrt->new(),
ETL::Pequel3::Type::Macros::Rand->new(),
ETL::Pequel3::Type::Macros::Sin->new(),
ETL::Pequel3::Type::Macros::Exp->new(),
ETL::Pequel3::Type::Macros::Cos->new(),
ETL::Pequel3::Type::Macros::Log->new(),
ETL::Pequel3::Type::Macros::Chr->new(),
ETL::Pequel3::Type::Macros::Abs->new(),
ETL::Pequel3::Type::Macros::Int->new(),
ETL::Pequel3::Type::Macros::Atan2->new(),
ETL::Pequel3::Type::Macros::Sign->new(),
ETL::Pequel3::Type::Macros::Trunc->new(),
);
return $self;
}
}
# ----------------------------------------------------------------------------------------------------
1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -