Create a multipurpose equal
This commit is contained in:
parent
31e8c61d5e
commit
42f0e3bc99
1 changed files with 30 additions and 4 deletions
|
@ -104,6 +104,33 @@ sub lisp_format {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub lisp_equal {
|
||||||
|
my ($a, $b) = @_;
|
||||||
|
if ( ref($a) eq "ARRAY" && ref($b) eq "ARRAY" )
|
||||||
|
{
|
||||||
|
return 0 unless scalar(@$a) == scalar(@$b);
|
||||||
|
|
||||||
|
for(my $i = 0; $i < @$a; $i++)
|
||||||
|
{
|
||||||
|
return 0 unless lisp_equal($a->[$i], $b->[$i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
elsif ( ref($a) eq "KEYWORD" && ref($b) eq "KEYWORD" )
|
||||||
|
{
|
||||||
|
return $a->{value} eq $b->{value};
|
||||||
|
}
|
||||||
|
elsif ( ref($a) eq "" && ref($b) eq "" )
|
||||||
|
{
|
||||||
|
return $a == $b;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
my %stdctx = (
|
my %stdctx = (
|
||||||
'+' => sub {
|
'+' => sub {
|
||||||
my $sum = 0;
|
my $sum = 0;
|
||||||
|
@ -259,15 +286,14 @@ my %stdctx = (
|
||||||
return $v;
|
return $v;
|
||||||
},
|
},
|
||||||
# TODO: this is tricky as it needs to recurse into sub lists
|
# TODO: this is tricky as it needs to recurse into sub lists
|
||||||
'equal' => sub {
|
|
||||||
my ($a, $b) = @_;
|
|
||||||
return @$a == @$b;
|
|
||||||
},
|
|
||||||
|
|
||||||
# Constants
|
# Constants
|
||||||
't' => 1,
|
't' => 1,
|
||||||
'f' => 0,
|
'f' => 0,
|
||||||
'nil' => undef,
|
'nil' => undef,
|
||||||
|
|
||||||
|
# Multi-purpose
|
||||||
|
'equal' => \&lisp_equal,
|
||||||
);
|
);
|
||||||
|
|
||||||
sub parser {
|
sub parser {
|
||||||
|
|
Loading…
Reference in a new issue