Commit | Line | Data |
---|---|---|
0067158f JM |
1 | program Mal; |
2 | ||
bc6a1f15 JM |
3 | {$H+} // Use AnsiString |
4 | ||
0067158f JM |
5 | Uses sysutils, |
6 | CMem, | |
bc6a1f15 | 7 | mal_readline, |
0067158f JM |
8 | mal_types, |
9 | reader, | |
10 | printer; | |
11 | ||
12 | var | |
bc6a1f15 JM |
13 | Repl_Env : string = ''; |
14 | Line : string; | |
0067158f JM |
15 | |
16 | // read | |
17 | function READ(const Str: string) : TMal; | |
18 | begin | |
19 | READ := read_str(Str); | |
20 | end; | |
21 | ||
22 | // eval | |
23 | function EVAL(Ast: TMal; Env: string) : TMal; | |
24 | begin | |
25 | EVAL := Ast; | |
26 | end; | |
27 | ||
28 | ||
29 | function PRINT(Exp: TMal) : string; | |
30 | begin | |
31 | PRINT := pr_str(Exp, True); | |
32 | end; | |
33 | ||
34 | // repl | |
35 | function REP(Str: string) : string; | |
36 | begin | |
37 | REP := PRINT(EVAL(READ(Str), Repl_Env)); | |
38 | end; | |
39 | ||
40 | begin | |
41 | while True do | |
42 | begin | |
0067158f | 43 | try |
bc6a1f15 JM |
44 | Line := _readline('user> '); |
45 | if Line = '' then continue; | |
0067158f JM |
46 | WriteLn(REP(Line)) |
47 | except | |
bc6a1f15 | 48 | On E : MalEOF do Halt(0); |
0067158f JM |
49 | On E : Exception do |
50 | begin | |
51 | WriteLn('Error: ' + E.message); | |
52 | WriteLn('Backtrace:'); | |
53 | WriteLn(GetBacktrace(E)); | |
54 | end; | |
55 | end; | |
56 | end; | |
57 | end. |