⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 arithmetic.pm

📁 普通的ETL工具
💻 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 + -