Perl6-Pugs
view release on metacpan or search on metacpan
misc/old_pugs_perl5_backend/pilrun2-leftovers/api.pl view on Meta::CPAN
}
sub p6_eval {
my($p6,$pkg)=@_;
$pkg = (caller())[0] if !defined $pkg;
$pkg = 'main' if $pkg !~ /\A$ROOT/;
$pkg = "${ROOT}::main" if $pkg eq 'main';
$pkg = "${ROOT}" if $pkg eq '';
my $cc = Perl6::Run::OnPerl5::X1::CodeCompile->new(p6=>$p6)->compile;
print STDERR $cc->warnings;
my $p5 = "package $pkg;".$cc->as_p5;
eval_p5_code($p5);
}
sub p6_eval_file {
my($fn)=@_;
my $cc = Perl6::Run::OnPerl5::X1::CodeCompile->new(p6_file=>$fn)->get_p6_file;
p6_eval($cc->as_p6);
}
my %macros;
sub p6_macrop5 {
my($name)=@_;
$macros{$name};
}
sub p6_def_macrop5 {
my($kind,$name,$param,$fun)=@_;
my $mfun = $fun;
if($param =~ /\*/) {
my $modifyargs ="";
my $argl = $param;
while($argl =~ s/\*([\@\%])(\w+)/$1$2/) {
$modifyargs .= "my \$$2 = \\$1$2;";
}
my $argl2 = $argl;
$argl2 =~ s/[\@\%]/\$/g;
my $code = "# macrop5 $name\n sub{my$argl=\@_; $modifyargs \$fun->$argl2}\n";
eval_p5_log_code($code);
$mfun = eval($code);
eval_p5_log_error($code,$@) if $@;
}
$macros{$name}=$mfun;
}
sub p6_container_for_var_CODE {
my($name)=@_;
return "\$${ROOT}::Scalar::META->new()" if $name =~ /\$|\&/;
return "\$${ROOT}::Array::META->new()" if $name =~ /\@/;
return "\$${ROOT}::Hash::META->new()" if $name =~ /\%/;
Carp::confess "bug >$name<";
}
sub p6_var_CODE {
my($name)=@_;
my $mn = p6_mangle($name);
"(do{no strict;defined(\$$mn)?\$$mn:p6__lookup('$mn','$name')})";
}
sub p6_var { # XXX - not quite the right thing
my($name)=@_;
my $mn = p6_mangle($name);
my $pkg = (caller)[0];
#my $ret = eval "package $pkg;".<<' END';
# no strict;defined($$mn)?$$mn:p6__lookup('$mn','$name')
#END
#die "p6_var: bug: $@" if $@;
#$ret;
my $look = "${pkg}::p6__lookup";
no strict 'refs';
&$look($mn,$name);
}
sub p6_setq {
my($pkg,$n,$v)=@_;
my $mn = p6_mangle($n,$pkg);
# print STDERR $mn,"\n";
no strict 'refs';
$$mn = p6_meta('Scalar')->new();
$$mn->ASSIGN($v);
}
sub p6_assign {my($o,$v)=@_; $o->ASSIGN($v);}
sub p6_bind {my($o,$v)=@_; $o->BIND($v);}
my %space_from_sigil;
my %sigil_from_space;
BEGIN{
%space_from_sigil = ( '$' => 'scalar', '@' => 'array', '%' => 'hash',
'&' => 'code', ':' => 'type');
%sigil_from_space = map {$space_from_sigil{$_},$_} keys(%space_from_sigil);
}
sub p6_mangle {
my($n,$pkg)=@_;
my $sigil = substr($n,0,1);
my $mn = substr($n,1);
my $is_absolute_name = $mn =~ /::|^\*/;
$mn =~ s/^(::)?(\*)?(::)?//;
$mn =~ s/_/__/g;
$mn =~ s/([^a-z0-9_])/"_".ord($1)."x"/ieg;
$mn =~ s/_58x_58x/::/g;
if($sigil eq ':') {
$mn .= "::META";
} else {
my $space = $space_from_sigil{$sigil};
Carp::confess "bogus name?: '$n' with sigil '$sigil'" if !$space;
my @parts = split('::',$mn);
$parts[-1] = $space."_".$parts[-1];
$mn = join('::',@parts);
}
$mn = $ROOT."::".$mn if $is_absolute_name;
$mn = $pkg."::".$mn if !$is_absolute_name && $pkg;
$mn;
}
sub p6_apply {
my($f,@args)=@_;
#print STDERR "\n<$f,",@args,">\n";
return p6_from_b(0) if $f eq 'bit' && ! defined $args[0]; # undef.bit() # XXX eep
if(!ref($f)) { # XXX - see PApp in EvalX.
return $args[0]->$f(splice(@args,1));
}
if(!p6_as_bool($f->defined())) {
Carp::confess "Error: Application of undef.\n";
( run in 0.640 second using v1.01-cache-2.11-cpan-800906f7e73 )