App-Scheme79asm
view release on metacpan or search on metacpan
lib/App/Scheme79asm.pm view on Meta::CPAN
package App::Scheme79asm;
use 5.014000;
use strict;
use warnings;
use re '/s';
use Carp qw/croak/;
use Data::Dumper qw/Dumper/;
use Data::SExpression qw/consp scalarp/;
use Scalar::Util qw/looks_like_number/;
our $VERSION = '1.000';
our %TYPES = (
LIST => 0,
SYMBOL => 1,
NUMBER => 1,
VAR => 2,
VARIABLE => 2,
CLOSURE => 3,
lib/App/Scheme79asm.pm view on Meta::CPAN
$addr = $self->{freeptr} + 1;
$self->{freeptr} += @addrs;
$self->process($addrs[$_], $addr + $_) for 0 .. $#addrs;
} else {
$addr = $addrs[0];
}
$addr = $self->process($addr) if ref $addr eq 'ARRAY';
die 'Addr of toplevel is not atom: ', Dumper($addr), "\n" unless scalarp($addr);
my ($comment_type, $comment_addr) = ($type, $addr);
die 'Computed addr is not a number: ', Dumper($addr), "\n" unless looks_like_number $addr;
if (!looks_like_number $type) {
die "No such type: $type\n" unless exists $TYPES{$type};
$type = $TYPES{$type};
}
$addr += (1 << $self->{addr_bits}) if $addr < 0;
die "Type too large: $type\n" if $type >= (1 << $self->{type_bits});
die "Addr too large: $addr\n" if $addr >= (1 << $self->{addr_bits});
my $result = ($type << $self->{addr_bits}) + $addr;
unless ($location) {
lib/App/Scheme79asm/Compiler.pm view on Meta::CPAN
package App::Scheme79asm::Compiler;
use 5.014000;
use strict;
use warnings;
our $VERSION = '1.000';
use Carp qw/croak/;
use Data::Dumper qw/Dumper/;
use Scalar::Util qw/looks_like_number/;
use Data::SExpression qw/cons consp scalarp/;
use List::MoreUtils qw/firstidx/;
our @PRIMOPS = qw/car cdr cons atom progn reverse-list/;
sub make_symbol { Data::SExpression::Symbol->new(shift) }
# types
our $LIST = make_symbol 'LIST';
lib/App/Scheme79asm/Compiler.pm view on Meta::CPAN
my $final_args = append $processed_args, cons ($self->process_toplevel($func_name, $env), undef);
[$CALL => $self->rest_of_funcall([$FUNCALL => 0], $final_args->cdr), $final_args->car]
}
}
sub process_toplevel {
my ($self, $expr, $env) = @_;
if (!defined $expr) {
[$LIST => 0]
} elsif (scalarp $expr) {
if (looks_like_number $expr) {
$self->process_quoted($expr);
} elsif (uc $expr eq 'T') {
[$SYMBOL => 2]
} elsif (uc $expr eq 'NIL') {
[$LIST => 0]
} else {
my $position = position $expr, $env;
if (defined $position) {
[$VAR => -1 - $position]
} else {
( run in 0.453 second using v1.01-cache-2.11-cpan-64827b87656 )