Commit | Line | Data |
---|---|---|
b5dedee0 | 1 | package printer; |
b5dedee0 | 2 | use strict; |
60f2b363 | 3 | use warnings FATAL => qw(all); |
a5a66058 | 4 | use feature qw(switch); |
b5dedee0 JM |
5 | use Exporter 'import'; |
6 | our @EXPORT_OK = qw( _pr_str ); | |
7 | ||
8 | use types qw($nil $true $false); | |
9 | ||
10 | sub _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 | ||
49 | 1; |