Commit | Line | Data |
---|---|---|
b5dedee0 | 1 | use strict; |
60f2b363 | 2 | use warnings FATAL => qw(all); |
01c97316 | 3 | no if $] >= 5.018, warnings => "experimental::smartmatch"; |
f26bc011 JM |
4 | use File::Basename; |
5 | use lib dirname (__FILE__); | |
b8ee29b2 | 6 | use readline qw(mal_readline set_rl_mode); |
b5dedee0 JM |
7 | use feature qw(switch); |
8 | ||
a5a66058 JM |
9 | use reader; |
10 | use printer; | |
b5dedee0 JM |
11 | |
12 | # read | |
13 | sub READ { | |
14 | my $str = shift; | |
a5a66058 | 15 | return reader::read_str($str); |
b5dedee0 JM |
16 | } |
17 | ||
18 | # eval | |
19 | sub EVAL { | |
20 | my($ast, $env) = @_; | |
21 | return $ast; | |
22 | } | |
23 | ||
24 | ||
25 | sub PRINT { | |
26 | my $exp = shift; | |
a5a66058 | 27 | return printer::_pr_str($exp); |
b5dedee0 JM |
28 | } |
29 | ||
30 | # repl | |
31 | sub REP { | |
32 | my $str = shift; | |
33 | return PRINT(EVAL(READ($str), {})); | |
34 | } | |
35 | ||
b8ee29b2 JM |
36 | if (scalar(@ARGV) > 0 && $ARGV[0] eq "--raw") { |
37 | set_rl_mode("raw"); | |
38 | } | |
b5dedee0 | 39 | while (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 | } |