DISABLE FDs (REMOVE ME).
[jackhill/mal.git] / picolisp / step4_if_fn_do.l
CommitLineData
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)