Commit | Line | Data |
---|---|---|
118269ab VS |
1 | (de load-relative (Path) |
2 | (load (pack (car (file)) Path)) ) | |
3 | ||
4 | (load-relative "readline.l") | |
5 | (load-relative "types.l") | |
6 | (load-relative "reader.l") | |
7 | (load-relative "printer.l") | |
8 | (load-relative "env.l") | |
9 | (load-relative "func.l") | |
10 | (load-relative "core.l") | |
11 | ||
12 | (de READ (String) | |
13 | (read-str String) ) | |
14 | ||
0e9990bc VS |
15 | (def '*ReplEnv (MAL-env NIL)) |
16 | (for Bind *Ns (set> *ReplEnv (car Bind) (cdr Bind))) | |
118269ab VS |
17 | |
18 | (de EVAL (Ast Env) | |
19 | (if (= (MAL-type Ast) 'list) | |
20 | (if (not (MAL-value Ast)) | |
21 | Ast | |
22 | (let (Ast* (MAL-value Ast) | |
23 | A0* (MAL-value (car Ast*)) | |
24 | A1 (cadr Ast*) | |
25 | A1* (MAL-value A1) | |
26 | A2 (caddr Ast*) | |
27 | A3 (cadddr Ast*) ) | |
28 | (cond | |
29 | ((= A0* 'def!) | |
30 | (set> Env A1* (EVAL A2 Env)) ) | |
31 | ((= A0* 'let*) | |
32 | (let Env* (MAL-env Env) | |
33 | (for (Bindings A1* Bindings) | |
34 | (let (Key (MAL-value (pop 'Bindings)) | |
35 | Value (EVAL (pop 'Bindings) Env*)) | |
36 | (set> Env* Key Value) ) ) | |
37 | (EVAL A2 Env*) ) ) | |
38 | ((= A0* 'do) | |
39 | (for Form (cdr Ast*) | |
40 | (EVAL Form Env) ) ) | |
41 | ((= A0* 'if) | |
42 | (if (not (memq (MAL-type (EVAL A1 Env)) '(nil false))) | |
43 | (EVAL A2 Env) | |
44 | (if A3 | |
45 | (EVAL A3 Env) | |
46 | *MAL-nil ) ) ) | |
47 | ((= A0* 'fn*) | |
48 | (let (Binds (mapcar MAL-value A1*) | |
49 | Body A2) | |
50 | (MAL-fn | |
51 | (curry (Env Binds Body) @ | |
52 | (let Env* (MAL-env Env Binds (rest)) | |
53 | (EVAL Body Env*) ) ) ) ) ) | |
54 | (T | |
55 | (let (Ast* (MAL-value (eval-ast Ast Env)) | |
56 | Fn (MAL-value (car Ast*)) | |
57 | Args (cdr Ast*)) | |
58 | (apply Fn Args) ) ) ) ) ) | |
59 | (eval-ast Ast Env) ) ) | |
60 | ||
61 | (de eval-ast (Ast Env) | |
62 | (let Value (MAL-value Ast) | |
63 | (case (MAL-type Ast) | |
64 | (symbol (get> Env Value)) | |
65 | (list (MAL-list (mapcar '((Form) (EVAL Form Env)) Value))) | |
66 | (vector (MAL-vector (mapcar '((Form) (EVAL Form Env)) Value))) | |
67 | (map (MAL-map (mapcar '((Form) (EVAL Form Env)) Value))) | |
68 | (T Ast) ) ) ) | |
69 | ||
70 | (de PRINT (Ast) | |
71 | (pr-str Ast T) ) | |
72 | ||
872ae9c4 VS |
73 | (de rep (String) |
74 | (PRINT (EVAL (READ String) *ReplEnv)) ) | |
118269ab | 75 | |
872ae9c4 | 76 | (rep "(def! not (fn* (a) (if a false true)))") |
118269ab VS |
77 | |
78 | (load-history ".mal_history") | |
79 | ||
80 | (use Input | |
81 | (until (=0 (setq Input (readline "user> "))) | |
872ae9c4 | 82 | (let Output (catch 'err (rep Input)) |
118269ab VS |
83 | (if (isa '+MALError Output) |
84 | (let Message (MAL-value Output) | |
1809f9ba VS |
85 | (unless (= (MAL-value Message) "end of token stream") |
86 | (prinl "[error] " (pr-str Message)) ) ) | |
118269ab VS |
87 | (prinl Output) ) ) ) ) |
88 | ||
89 | (prinl) | |
90 | (bye) |