Perl: add step9_interop test
[jackhill/mal.git] / perl / printer.pm
CommitLineData
b5dedee0 1package printer;
b5dedee0 2use strict;
60f2b363 3use warnings FATAL => qw(all);
a5a66058 4use feature qw(switch);
b5dedee0
JM
5use Exporter 'import';
6our @EXPORT_OK = qw( _pr_str );
7
8use types qw($nil $true $false);
9
10sub _pr_str {
a5a66058
JM
11 my($obj, $print_readably) = @_;
12 my($_r) = (defined $print_readably) ? $print_readably : 1;
b5dedee0
JM
13 given (ref $obj) {
14 when(/^List/) {
a5a66058 15 return '(' . join(' ', map {_pr_str($_, $_r)} @$obj) . ')';
b5dedee0
JM
16 }
17 when(/^Vector/) {
a5a66058 18 return '[' . join(' ', map {_pr_str($_, $_r)} @$obj) . ']';
b5dedee0
JM
19 }
20 when(/^HashMap/) {
21 my @elems = ();
22 foreach my $key (keys %$obj) {
a5a66058
JM
23 push(@elems, _pr_str(String->new($key), $_r));
24 push(@elems, _pr_str($obj->{$key}, $_r));
b5dedee0
JM
25 }
26
27 return '{' . join(' ', @elems) . '}';
28 }
a5a66058
JM
29 when(/^String/) {
30 if ($_r) {
31 my $str = $$obj;
32 $str =~ s/\\/\\\\/g;
33 $str =~ s/"/\\"/g;
074cd748 34 $str =~ s/\n/\\n/g;
a5a66058
JM
35 return '"' . $str . '"';
36 } else {
37 return $$obj;
38 }
39 }
60f2b363
JM
40 when(/^Function/) {
41 return '<fn* ' . _pr_str($obj->{params}) .
42 ' ' . _pr_str($obj->{ast}) . '>';
43 }
a3b0621d 44 when(/^CODE/) { return '<builtin_fn* ' . $obj . '>'; }
b5dedee0
JM
45 default { return $$obj; }
46 }
47}
48
491;