aboutsummaryrefslogtreecommitdiff
path: root/perl/reader.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/reader.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/reader.pm')
-rw-r--r--perl/reader.pm9
1 files changed, 8 insertions, 1 deletions
diff --git a/perl/reader.pm b/perl/reader.pm
index cd1e19d..e49d5a1 100644
--- a/perl/reader.pm
+++ b/perl/reader.pm
@@ -81,6 +81,12 @@ sub read_form {
read_form($rdr)]) }
when('~@') { $rdr->next(); List->new([Symbol->new('splice-unquote'),
read_form($rdr)]) }
+ when('^') { $rdr->next(); my $meta = read_form($rdr);
+ List->new([Symbol->new('with-meta'),
+ read_form($rdr), $meta]) }
+ when('@') { $rdr->next(); List->new([Symbol->new('deref'),
+ read_form($rdr)]) }
+
when(')') { die "unexpected ')'" }
when('(') { return read_list($rdr, 'List') }
when(']') { die "unexpected ']'" }
@@ -94,7 +100,8 @@ sub read_form {
sub read_str {
my($str) = @_;
my @tokens = tokenize($str);
- #print join(" / ", @tokens) . "\n";
+ #print "tokens: " . Dumper(\@tokens);
+ if (scalar(@tokens) == 0) { die BlankException->new(); }
return read_form(Reader->new(\@tokens));
}