aboutsummaryrefslogtreecommitdiff
path: root/perl/printer.pm
diff options
context:
space:
mode:
authorJoel Martin <github@martintribe.org>2014-04-23 21:46:57 -0500
committerJoel Martin <github@martintribe.org>2014-04-23 21:46:57 -0500
commit89bd4de1e2704c1bc562788b2c5e4fc08b71a538 (patch)
tree3ec33ca7e1030fdef0905317fdf911b8487685f0 /perl/printer.pm
parent85cc53f35b8302e13f0014454ac320b971c196db (diff)
downloadmal-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.pm13
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; }
}