aboutsummaryrefslogtreecommitdiff
path: root/perl/reader.pm
diff options
context:
space:
mode:
authorJoel Martin <github@martintribe.org>2014-04-21 21:13:04 -0500
committerJoel Martin <github@martintribe.org>2014-04-21 21:13:04 -0500
commitfd637e0385f4b39a0d9e109c8b4b8afe20874fa7 (patch)
treec5bec673165e467a827a2a69d314e5fc3a3386b7 /perl/reader.pm
parent074cd7482bd5e6b0f5170f0128d417c1560ca00e (diff)
downloadmal-fd637e0385f4b39a0d9e109c8b4b8afe20874fa7.tar.gz
mal-fd637e0385f4b39a0d9e109c8b4b8afe20874fa7.zip
Perl: add step7_quote
Diffstat (limited to 'perl/reader.pm')
-rw-r--r--perl/reader.pm22
1 files changed, 15 insertions, 7 deletions
diff --git a/perl/reader.pm b/perl/reader.pm
index 6fac066..e173910 100644
--- a/perl/reader.pm
+++ b/perl/reader.pm
@@ -78,13 +78,21 @@ sub read_form {
my($rdr) = @_;
my $token = $rdr->peek();
given ($token) {
- when(')') { die "unexpected ')'"; }
- when('(') { return read_list($rdr, 'List'); }
- when(']') { die "unexpected ']'"; }
- when('[') { return read_list($rdr, 'Vector', '[', ']'); }
- when('}') { die "unexpected '}'"; }
- when('{') { return read_list($rdr, 'HashMap', '{', '}'); }
- default { return read_atom($rdr); }
+ when("'") { $rdr->next(); List->new([Symbol->new('quote'),
+ read_form($rdr)]) }
+ when('`') { $rdr->next(); List->new([Symbol->new('quasiquote'),
+ read_form($rdr)]) }
+ when('~') { $rdr->next(); List->new([Symbol->new('unquote'),
+ read_form($rdr)]) }
+ when('~@') { $rdr->next(); List->new([Symbol->new('splice-unquote'),
+ read_form($rdr)]) }
+ when(')') { die "unexpected ')'" }
+ when('(') { return read_list($rdr, 'List') }
+ when(']') { die "unexpected ']'" }
+ when('[') { return read_list($rdr, 'Vector', '[', ']') }
+ when('}') { die "unexpected '}'" }
+ when('{') { return read_list($rdr, 'HashMap', '{', '}') }
+ default { return read_atom($rdr) }
}
}