Perl: add step5_tco
[jackhill/mal.git] / perl / core.pm
CommitLineData
a5a66058
JM
1package core;
2use strict;
60f2b363 3use warnings FATAL => qw(all);
a5a66058
JM
4use Exporter 'import';
5our @EXPORT_OK = qw($core_ns);
6
7use types qw(_sequential_Q _equal_Q $nil $true $false _list_Q);
8use printer qw(_pr_str);
9
10use Data::Dumper;
11
12# String functions
13
14sub pr_str {
15 return String->new(join(" ", map {_pr_str($_, 1)} @{$_[0]}));
16}
17
18sub str {
19 return String->new(join("", map {_pr_str($_, 0)} @{$_[0]}));
20}
21
22sub prn {
23 print join(" ", map {_pr_str($_, 1)} @{$_[0]}) . "\n";
24 return $nil
25}
26
27sub println {
28 print join(" ", map {_pr_str($_, 0)} @{$_[0]}) . "\n";
29 return $nil
30}
31
32
33our $core_ns = {
34 '=' => sub { _equal_Q($_[0][0], $_[0][1]) ? $true : $false },
35
36 'pr-str' => sub { pr_str($_[0]) },
37 'str' => sub { str($_[0]) },
38 'prn' => sub { prn($_[0]) },
39 'println' => sub { println($_[0]) },
40 '<' => sub { ${$_[0][0]} < ${$_[0][1]} ? $true : $false },
41 '<=' => sub { ${$_[0][0]} <= ${$_[0][1]} ? $true : $false },
42 '>' => sub { ${$_[0][0]} > ${$_[0][1]} ? $true : $false },
43 '>=' => sub { ${$_[0][0]} >= ${$_[0][1]} ? $true : $false },
44 '+' => sub { Integer->new(${$_[0][0]} + ${$_[0][1]})},
45 '-' => sub { Integer->new(${$_[0][0]} - ${$_[0][1]})},
46 '*' => sub { Integer->new(${$_[0][0]} * ${$_[0][1]})},
47 '/' => sub { Integer->new(${$_[0][0]} / ${$_[0][1]})},
48
49 'list' => sub { $_[0] },
50 'list?' => sub { _list_Q($_[0][0]) ? $true : $false },
51 'empty?' => sub { scalar(@{$_[0][0]}) == 0 ? $true : $false },
52 'count' => sub { Integer->new(scalar(@{$_[0][0]})) },
53};
54
551;