Merge pull request #158 from dubek/first-rest-nil
[jackhill/mal.git] / perl / step1_read_print.pl
CommitLineData
b5dedee0 1use strict;
60f2b363 2use warnings FATAL => qw(all);
01c97316 3no if $] >= 5.018, warnings => "experimental::smartmatch";
f26bc011
JM
4use File::Basename;
5use lib dirname (__FILE__);
b8ee29b2 6use readline qw(mal_readline set_rl_mode);
b5dedee0
JM
7use feature qw(switch);
8
a5a66058
JM
9use reader;
10use printer;
b5dedee0
JM
11
12# read
13sub READ {
14 my $str = shift;
a5a66058 15 return reader::read_str($str);
b5dedee0
JM
16}
17
18# eval
19sub EVAL {
20 my($ast, $env) = @_;
21 return $ast;
22}
23
24# print
25sub PRINT {
26 my $exp = shift;
a5a66058 27 return printer::_pr_str($exp);
b5dedee0
JM
28}
29
30# repl
31sub REP {
32 my $str = shift;
33 return PRINT(EVAL(READ($str), {}));
34}
35
b8ee29b2
JM
36if (scalar(@ARGV) > 0 && $ARGV[0] eq "--raw") {
37 set_rl_mode("raw");
38}
b5dedee0 39while (1) {
89bd4de1 40 my $line = mal_readline("user> ");
b5dedee0 41 if (! defined $line) { last; }
89bd4de1
JM
42 do {
43 local $@;
44 my $ret;
45 eval {
46 use autodie; # always "throw" errors
47 print(REP($line), "\n");
48 1;
49 } or do {
50 my $err = $@;
51 given (ref $err) {
52 when (/^BlankException/) {
53 # ignore and continue
54 }
55 default {
56 chomp $err;
57 print "Error: $err\n";
58 }
59 }
60 };
61 };
b5dedee0 62}