Acme-Ook
view release on metacpan or search on metacpan
lib/Acme/Ook.pm view on Meta::CPAN
21222324252627282930313233343536373839404142434445464748495051525354555657585960
*{
'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.260 second using v1.01-cache-2.11-cpan-fd5d4e115d8 )