5b372a1b913dffec2ef086f6733887f7b055dcc2
3 use warnings FATAL
=> qw(all);
5 our @EXPORT_OK = qw($core_ns);
7 use types qw(_sequential_Q _equal_Q $nil $true $false _list_Q);
8 use reader qw(read_str);
9 use printer
qw(_pr_str);
16 return String
->new(join(" ", map {_pr_str
($_, 1)} @
{$_[0]}));
20 return String
->new(join("", map {_pr_str
($_, 0)} @
{$_[0]}));
24 print join(" ", map {_pr_str
($_, 1)} @
{$_[0]}) . "\n";
29 print join(" ", map {_pr_str
($_, 0)} @
{$_[0]}) . "\n";
34 my ($fname) = ${$_[0]};
35 open my $F, '<', $fname or die "error opening '$fname'";
36 my $data = do { local $/; <$F> };
45 my @new_arr = @
{[$a]};
51 if (scalar(@_) == 0) { return List
->new([]); }
54 map { push @new_arr, @
$_ } @_;
58 sub nth
{ my ($seq,$i) = @_; return scalar(@
$seq) > $i ?
$seq->[$i] : $nil; }
60 sub first
{ my ($seq) = @_; return scalar(@
$seq) > 0 ?
$seq->[0] : $nil; }
62 sub rest
{ return $_[0]->rest(); }
67 '=' => sub { _equal_Q
($_[0][0], $_[0][1]) ?
$true : $false },
69 'pr-str' => sub { pr_str
($_[0]) },
70 'str' => sub { str
($_[0]) },
71 'prn' => sub { prn
($_[0]) },
72 'println' => sub { println
($_[0]) },
73 'read-string' => sub { read_str
(${$_[0][0]}) },
74 'slurp' => sub { slurp
($_[0][0]) },
75 '<' => sub { ${$_[0][0]} < ${$_[0][1]} ?
$true : $false },
76 '<=' => sub { ${$_[0][0]} <= ${$_[0][1]} ?
$true : $false },
77 '>' => sub { ${$_[0][0]} > ${$_[0][1]} ?
$true : $false },
78 '>=' => sub { ${$_[0][0]} >= ${$_[0][1]} ?
$true : $false },
79 '+' => sub { Integer
->new(${$_[0][0]} + ${$_[0][1]})},
80 '-' => sub { Integer
->new(${$_[0][0]} - ${$_[0][1]})},
81 '*' => sub { Integer
->new(${$_[0][0]} * ${$_[0][1]})},
82 '/' => sub { Integer
->new(${$_[0][0]} / ${$_[0][1]})},
84 'list' => sub { $_[0] },
85 'list?' => sub { _list_Q
($_[0][0]) ?
$true : $false },
87 'nth' => sub { nth
($_[0][0], ${$_[0][1]}) },
88 'first' => sub { first
($_[0][0]) },
89 'rest' => sub { rest
($_[0][0]) },
90 'cons' => sub { cons
($_[0][0], $_[0][1]) },
91 'concat' => sub { concat
(@
{$_[0]}) },
92 'empty?' => sub { scalar(@
{$_[0][0]}) == 0 ?
$true : $false },
93 'count' => sub { Integer
->new(scalar(@
{$_[0][0]})) },