3 use warnings FATAL
=> qw(all);
4 use feature
qw(switch);
6 our @EXPORT_OK = qw(_sequential_Q _equal_Q
8 _symbol_Q _nil_Q _true_Q _false_Q _list_Q
9 _hash_map _hash_map_Q _assoc_BANG _dissoc_BANG);
16 return _list_Q($_[0]) || _vector_Q($_[0])
21 my ($ota, $otb) = (ref $a, ref $b);
22 if (!(($ota eq $otb) || (_sequential_Q($a) && _sequential_Q($b)))) {
29 when (/^List/ || /^Vector/) {
30 if (! scalar(@$a) == scalar(@$b)) {
33 for (my $i=0; $i<scalar(@$a); $i++) {
34 if (! _equal_Q($a->[$i], $b->[$i])) {
51 sub new { my $class = shift; my $s = 'nil'; bless \$s => $class }
55 sub new { my $class = shift; my $s = 'true'; bless \$s => $class }
59 sub new { my $class = shift; my $s = 'false'; bless \$s => $class }
62 our $nil = Nil->new();
63 our $true = True->new();
64 our $false = False->new();
66 sub _nil_Q { return $_[0] eq $nil }
67 sub _true_Q { return $_[0] eq $true }
68 sub _false_Q { return $_[0] eq $false }
73 sub new { my $class = shift; bless \$_[0] => $class }
79 sub new { my $class = shift; bless \$_[0] => $class }
82 sub _symbol_Q { (ref $_[0]) =~ /^Symbol/ }
87 sub new { my $class = shift; bless \$_[0] => $class }
95 sub new { my $class = shift; bless $_[0], $class }
96 sub rest { my @arr = @{$_[0]}; List->new([@arr[1..$#arr]]); }
97 sub slice { my @arr = @{$_[0]}; List->new([@arr[$_[1]..$_[2]]]); }
100 sub _list_Q { (ref $_[0]) =~ /^List/ }
107 sub new { my $class = shift; bless $_[0], $class }
108 sub rest { my @arr = @{$_[0]}; List->new([@arr[1..$#arr]]); }
109 sub slice { my @arr = @{$_[0]}; List->new([@arr[$_[1]..$_[2]]]); }
112 sub _vector_Q { (ref $_[0]) =~ /^Vector/ }
119 sub new { my $class = shift; bless $_[0], $class }
124 return _assoc_BANG($hsh, @_);
130 for(my $i=0; $i<scalar(@lst); $i+=2) {
132 $hsh->{$$str} = $lst[$i+1];
134 return HashMap->new($hsh);
140 for(my $i=0; $i<scalar(@lst); $i++) {
142 delete $hsh->{$$str};
144 return HashMap->new($hsh);
147 sub _hash_map_Q { (ref $_[0]) =~ /^HashMap/ }
156 my ($eval, $ast, $env, $params) = @_;
157 bless {'eval'=>$eval,
161 'ismacro'=>0}, $class
165 return Env->new($self->{env}, $self->{params}, $_[1]);
169 return &{ $self->{eval} }($self->{ast}, gen_env($self, $_[1]));