diff options
| author | Joel Martin <github@martintribe.org> | 2014-04-23 21:46:57 -0500 |
|---|---|---|
| committer | Joel Martin <github@martintribe.org> | 2014-04-23 21:46:57 -0500 |
| commit | 89bd4de1e2704c1bc562788b2c5e4fc08b71a538 (patch) | |
| tree | 3ec33ca7e1030fdef0905317fdf911b8487685f0 /perl/printer.pm | |
| parent | 85cc53f35b8302e13f0014454ac320b971c196db (diff) | |
| download | mal-89bd4de1e2704c1bc562788b2c5e4fc08b71a538.tar.gz mal-89bd4de1e2704c1bc562788b2c5e4fc08b71a538.zip | |
Perl: add vector, hash-map, metadata, atom support. TCO let*
- Changes all collections to be one level of inderection where the top
level is always a hash containing 'meta' and 'val'.
Diffstat (limited to 'perl/printer.pm')
| -rw-r--r-- | perl/printer.pm | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/perl/printer.pm b/perl/printer.pm index 4240ff0..e31bed5 100644 --- a/perl/printer.pm +++ b/perl/printer.pm @@ -7,21 +7,23 @@ our @EXPORT_OK = qw( _pr_str ); use types qw($nil $true $false); +use Data::Dumper; + sub _pr_str { my($obj, $print_readably) = @_; my($_r) = (defined $print_readably) ? $print_readably : 1; given (ref $obj) { when(/^List/) { - return '(' . join(' ', map {_pr_str($_, $_r)} @$obj) . ')'; + return '(' . join(' ', map {_pr_str($_, $_r)} @{$obj->{val}}) . ')'; } when(/^Vector/) { - return '[' . join(' ', map {_pr_str($_, $_r)} @$obj) . ']'; + return '[' . join(' ', map {_pr_str($_, $_r)} @{$obj->{val}}) . ']'; } when(/^HashMap/) { my @elems = (); - foreach my $key (keys %$obj) { + foreach my $key (keys $obj->{val}) { push(@elems, _pr_str(String->new($key), $_r)); - push(@elems, _pr_str($obj->{$key}, $_r)); + push(@elems, _pr_str($obj->{val}->{$key}, $_r)); } return '{' . join(' ', @elems) . '}'; @@ -41,6 +43,9 @@ sub _pr_str { return '<fn* ' . _pr_str($obj->{params}) . ' ' . _pr_str($obj->{ast}) . '>'; } + when(/^Atom/) { + return '(atom ' . _pr_str($obj->{val}) . ")"; + } when(/^CODE/) { return '<builtin_fn* ' . $obj . '>'; } default { return $$obj; } } |
