package Sequence;
use overload '@{}' => sub { $_[0]->{val} }, fallback => 1;
sub new { my $class = shift; bless {'meta'=>$nil, 'val'=>$_[0]}, $class }
+ sub meta { $_[0]->{meta} }
#sub _val { $_[0]->{val}->[$_[1]]->{val}; } # return value of nth item
sub rest { my @arr = @{$_[0]->{val}}; List->new([@arr[1..$#arr]]); }
sub slice { my @arr = @{$_[0]->{val}}; List->new([@arr[$_[1]..$_[2]]]); }
{
package HashMap;
sub new { my $class = shift; bless {'meta'=>$nil, 'val'=>$_[0]}, $class }
+ sub meta { $_[0]->{meta} }
sub get { $_[0]->{val}->{$_[1]}; }
}
'params'=>$params,
'ismacro'=>0}, $class
}
+ sub meta { $_[0]->{meta} }
sub gen_env {
my $self = $_[0];
return Env->new($self->{env}, $self->{params}, $_[1]);
bless {'meta'=>$nil,
'code'=>$code}, $class
}
+ sub meta { $_[0]->{meta} }
sub apply {
my $self = $_[0];
return &{ $self->{code} }($_[1]);
{
package Atom;
sub new { my $class = shift; bless {'meta'=>$nil, 'val'=>$_[0]}, $class }
+ sub meta { $_[0]->{meta} }
}
sub _atom_Q { $_[0]->isa('Atom') }