Skip to content

Commit

Permalink
- Array optimizations and improvements.
Browse files Browse the repository at this point in the history
- Extended the Array.sum() and Array.prod() to accept a default starting argument.

Example:
	say [].sum(0);	# prints: 0
	say [].sum;	# prints: (nothing)

	say [1,2,3].prod(2);	# prints: 12 (starts at 2 and multiplies it by 1,2,3)

- Pair objects are now dumped correctly when a value is undefined.
  • Loading branch information
trizen committed Nov 18, 2015
1 parent b73f61a commit 775fe8f
Show file tree
Hide file tree
Showing 5 changed files with 89 additions and 28 deletions.
24 changes: 22 additions & 2 deletions lib/Sidef/Deparse/Perl.pm
Original file line number Diff line number Diff line change
Expand Up @@ -947,7 +947,19 @@ HEADER
$code = $obj->{name};
}
elsif ($ref eq 'Sidef::Types::Hash::Hash') {
$code = $self->make_constant($ref, 'new', "Hash$refaddr");
if (keys(%{$obj})) {
$code = $ref . '->new(' . join(
',',
map {
$self->_dump_string($_) . ' => '
. (defined($obj->{$_}) ? $self->deparse_expr({self => $obj->{$_}}) : 'undef')
} keys(%{$obj})
)
. ')';
}
else {
$code = $self->make_constant($ref, 'new', "Hash$refaddr");
}
}
elsif ($ref eq 'Sidef::Types::Glob::Socket') {
$code = $self->make_constant($ref, 'new', "Socket$refaddr");
Expand Down Expand Up @@ -980,7 +992,15 @@ HEADER
$code = $self->make_constant($ref, 'new', "Complex$refaddr", "'" . ${$obj}->Re . "'", "'" . ${$obj}->Im . "'");
}
elsif ($ref eq 'Sidef::Types::Array::Pair') {
$code = $ref . '->new';
if (all { not defined($_) } @{$obj}) {
$code = $self->make_constant($ref, 'new', "Pair$refaddr");
}
else {
$code =
$ref
. '->new('
. join(', ', map { defined($_) ? $self->deparse_expr({self => $_}) : 'undef' } @{$obj}) . ')';
}
}
elsif ($ref eq 'Sidef::Variable::NamedParam') {
$code = $ref . '->new(' . $self->_dump_string($obj->[0]) . ',' . $self->deparse_args(@{$obj->[1]}) . ')';
Expand Down
34 changes: 34 additions & 0 deletions lib/Sidef/Optimizer.pm
Original file line number Diff line number Diff line change
Expand Up @@ -322,6 +322,7 @@ package Sidef::Optimizer {
len end
is_empty
pairs
min max
Expand All @@ -333,8 +334,10 @@ package Sidef::Optimizer {
unique
last_unique
flatten
to_s
to_hash
dump
)
)
Expand All @@ -344,12 +347,27 @@ package Sidef::Optimizer {
map {
{ $_, [table(NUMBER)] }
} methods(ARRAY, qw(
count
index
rindex
exists
defined
contains
contains_type
divide
multiply
rotate
first
last
item
ft
sum
prod
take_right
take_left
)
Expand All @@ -365,6 +383,9 @@ package Sidef::Optimizer {
xor
concat
eq ne
mzip
contains_type
contains_any
contains_all
)
Expand All @@ -377,7 +398,12 @@ package Sidef::Optimizer {
} methods(ARRAY, qw(
pack
join
index
rindex
count
contains
contains_type
reduce
reduce_operator
)
)
Expand Down Expand Up @@ -701,11 +727,19 @@ package Sidef::Optimizer {
}
}
elsif ($ref eq 'Sidef::Types::Array::HCArray') {
my $has_expr = 0;

foreach my $i (0 .. $#{$obj}) {
if (ref($obj->[$i]) eq 'HASH') {
$obj->[$i] = $self->optimize_expr($obj->[$i]);
$has_expr ||= ref($obj->[$i]) eq 'HASH';
}
}

# Has no expressions, so let's convert it into an Array
if (not $has_expr) {
$obj = Sidef::Types::Array::Array->new(@{$obj});
}
}

if (not exists($expr->{ind}) and not exists($expr->{lookup}) and not exists($expr->{call})) {
Expand Down
6 changes: 2 additions & 4 deletions lib/Sidef/Parser.pm
Original file line number Diff line number Diff line change
Expand Up @@ -1594,16 +1594,14 @@ package Sidef::Parser {
my ($inline_expression, @objs);
foreach my $item (@{$strings}) {
my $str = Sidef::Types::String::String->new($item)->apply_escapes($self);
if (!$inline_expression and ref $str eq 'HASH') {
$inline_expression = 1;
}
$inline_expression ||= ref($str) eq 'HASH';
push @objs, $str;
}

return (
$inline_expression
? Sidef::Types::Array::HCArray->new(map { {self => $_} } @objs)
: Sidef::Types::Array::HCArray->new(@objs)
: Sidef::Types::Array::Array->new(@objs)
);
}

Expand Down
51 changes: 30 additions & 21 deletions lib/Sidef/Types/Array/Array.pm
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,7 @@ package Sidef::Types::Array::Array {
sub unroll_operator {
my ($self, $operator, $arg) = @_;

if (ref $operator) {
$operator = $operator->get_value;
}
$operator = $operator->get_value if ref($operator);

my @array;
if (defined $arg) {
Expand All @@ -63,9 +61,7 @@ package Sidef::Types::Array::Array {
sub map_operator {
my ($self, $operator, @args) = @_;

if (ref $operator) {
$operator = $operator->get_value;
}
$operator = $operator->get_value if ref($operator);

my @array;
foreach my $i (0 .. $#{$self}) {
Expand All @@ -78,9 +74,7 @@ package Sidef::Types::Array::Array {
sub pam_operator {
my ($self, $operator, $arg) = @_;

if (ref $operator) {
$operator = $operator->get_value;
}
$operator = $operator->get_value if ref($operator);

my @array;
foreach my $i (0 .. $#{$self}) {
Expand All @@ -93,15 +87,12 @@ package Sidef::Types::Array::Array {
sub reduce_operator {
my ($self, $operator) = @_;

if (ref $operator) {
$operator = $operator->get_value;
}

$operator = $operator->get_value if ref($operator);
(my $offset = $#{$self}) >= 0 || return;

my $x = $self->[0];
foreach my $i (1 .. $offset) {
$x = ($x->$operator($self->[$i]));
$x = $x->$operator($self->[$i]);
}
$x;
}
Expand Down Expand Up @@ -228,7 +219,7 @@ package Sidef::Types::Array::Array {
my $head = shift @set;
my @result = _combinations($n - 1, @set);
foreach my $subarray (@result) {
unshift @{$subarray}, $head;
CORE::unshift @{$subarray}, $head;
}
@result, _combinations($n, @set);
}
Expand Down Expand Up @@ -348,13 +339,31 @@ package Sidef::Types::Array::Array {
}

sub sum {
$_[0]->reduce_operator('+');
defined($_[1])
? do {
my $sum = $_[1];
state $method = '+';
foreach my $obj (@{$_[0]}) {
$sum = $sum->$method($obj);
}
$sum;
}
: $_[0]->reduce_operator('+');
}

*collapse = \∑

sub prod {
$_[0]->reduce_operator('*');
defined($_[1])
? do {
my $prod = $_[1];
state $method = '*';
foreach my $obj (@{$_[0]}) {
$prod = $prod->$method($obj);
}
$prod;
}
: $_[0]->reduce_operator('*');
}

*product = \∏
Expand Down Expand Up @@ -1213,7 +1222,7 @@ package Sidef::Types::Array::Array {
sub unshift {
my ($self, @args) = @_;
unshift @{$self}, @{$self->new(@args)};
CORE::unshift(@{$self}, @{$self->new(@args)});
$self;
}
Expand All @@ -1230,7 +1239,7 @@ package Sidef::Types::Array::Array {
# Surprisingly, this is 73% faster:
my @array = @{$self};
unshift(@array, splice(@array, $num));
CORE::unshift(@array, CORE::splice(@array, $num));
$self->new(@array);
}
Expand Down Expand Up @@ -1405,13 +1414,13 @@ package Sidef::Types::Array::Array {
*{__PACKAGE__ . '::' . '++'} = sub {
my ($self, $obj) = @_;
$self->push($obj);
CORE::push(@{$self}, $obj);
$self;
};
*{__PACKAGE__ . '::' . '--'} = sub {
my ($self) = @_;
$self->pop;
CORE::pop(@{$self});
$self;
};
}
Expand Down
2 changes: 1 addition & 1 deletion lib/Sidef/Types/Array/Pair.pm
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ package Sidef::Types::Array::Pair {
", ",
map {
my $val = $_;
eval { $val->can('dump') } ? ${$val->dump} : $val
eval { $val->can('dump') } ? ${$val->dump} : defined($val) ? $val : 'nil'
} @{$self}
)
)
Expand Down

0 comments on commit 775fe8f

Please sign in to comment.