Acme-Ook
view release on metacpan or search on metacpan
lib/Acme/Ook.pm view on Meta::CPAN
*{'O?'} = sub { @_ ? $Ook{$_[0]} : %Ook };
*{'O!'} = sub { $Ook{$_[0]} = $_[1] };
}
sub optimise {
# Coalesce sequences of increments or decrements
my $prog = $_[1];
# print "Before '$prog'\n";
foreach my $thing ('$Ook', '$Ook[$Ook]') {
foreach my $op ('+', '-') {
my $left = length "$thing$op$op;";
$prog =~ s{((?:\Q$thing$op$op\E;){2,})}
{"$thing$op=".(length ($1)/$left).';'}ges;
}
}
# print "After '$prog'\n";
return $prog;
}
sub _compile {
shift;
chomp $_[0];
$_[0] =~ s/\s*(Ook(.)\s*Ook(.)\s*|(\#.*)|\S.*)/$;=$Ook{$2||@@}{$3||''};$;?$;:defined$4?"$4\n":die"OOK? $_[1]:$_[2] '$1'\n"/eg;
return $_[0];
}
sub compile {
my $self = shift;
my $prog;
$prog .= $self->_compile($$self, "(new)", 0) if defined $$self && length $$self;
if (@_) {
local *OOK;
while (@_) {
my $code = shift;
if (ref $code eq 'IO::Handle') {
while (<$code>) {
$prog .= $self->_compile($_, $code, $.);
}
close(OOK);
} else {
( run in 0.227 second using v1.01-cache-2.11-cpan-0d8aa00de5b )