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/reader.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/reader.pm')
| -rw-r--r-- | perl/reader.pm | 9 |
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)); } |
