Perl: add vector, hash-map, metadata, atom support. TCO let*
[jackhill/mal.git] / perl / step1_read_print.pl
1 use strict;
2 use warnings FATAL => qw(all);
3 use readline qw(mal_readline);
4 use feature qw(switch);
5
6 use reader;
7 use printer;
8
9 # read
10 sub READ {
11 my $str = shift;
12 return reader::read_str($str);
13 }
14
15 # eval
16 sub EVAL {
17 my($ast, $env) = @_;
18 return $ast;
19 }
20
21 # print
22 sub PRINT {
23 my $exp = shift;
24 return printer::_pr_str($exp);
25 }
26
27 # repl
28 sub REP {
29 my $str = shift;
30 return PRINT(EVAL(READ($str), {}));
31 }
32
33 while (1) {
34 my $line = mal_readline("user> ");
35 if (! defined $line) { last; }
36 do {
37 local $@;
38 my $ret;
39 eval {
40 use autodie; # always "throw" errors
41 print(REP($line), "\n");
42 1;
43 } or do {
44 my $err = $@;
45 given (ref $err) {
46 when (/^BlankException/) {
47 # ignore and continue
48 }
49 default {
50 chomp $err;
51 print "Error: $err\n";
52 }
53 }
54 };
55 };
56 }