diff options
Diffstat (limited to 'src/bootstrap/main.c')
-rwxr-xr-x | src/bootstrap/main.c | 57 |
1 files changed, 46 insertions, 11 deletions
diff --git a/src/bootstrap/main.c b/src/bootstrap/main.c index 2aa3038..8092bbd 100755 --- a/src/bootstrap/main.c +++ b/src/bootstrap/main.c | |||
@@ -11,8 +11,14 @@ | |||
11 | #include "lexer.c" | 11 | #include "lexer.c" |
12 | #include "objects.c" | 12 | #include "objects.c" |
13 | #include "parser.c" | 13 | #include "parser.c" |
14 | #include "environment.c" | ||
15 | #include "primitives.c" | ||
14 | 16 | ||
15 | #define MAKE_SYM(STR) make_symbol((StringView){(STR), sizeof(STR) - 1}) | 17 | #define MAKE_SYM(STR) make_symbol((StringView){(STR), sizeof(STR) - 1}) |
18 | #define MAKE_ENV_VAR(ENV,STR,VAR) \ | ||
19 | (env_add_symbol((ENV), MAKE_SYM(STR), (VAR))) | ||
20 | #define MAKE_ENV_PROC(ENV,STR,FUN) \ | ||
21 | (env_add_symbol((ENV), MAKE_SYM(STR), make_procedure(FUN))) | ||
16 | 22 | ||
17 | void | 23 | void |
18 | init(void) { | 24 | init(void) { |
@@ -24,8 +30,42 @@ init(void) { | |||
24 | 30 | ||
25 | // Global environment. | 31 | // Global environment. |
26 | global_env = env_create(NULL); | 32 | global_env = env_create(NULL); |
27 | env_add_symbol(global_env, MAKE_SYM("quote"), make_procedure(proc_quote)); | 33 | |
28 | env_add_symbol(global_env, MAKE_SYM("+"), make_procedure(proc_sum)); | 34 | // Primitive symbols. |
35 | MAKE_ENV_VAR(global_env, "else", obj_true); | ||
36 | MAKE_ENV_VAR(global_env, "nil", obj_nil); | ||
37 | |||
38 | // Primitive procedures. | ||
39 | MAKE_ENV_PROC(global_env, "quote", proc_quote); | ||
40 | MAKE_ENV_PROC(global_env, "car", proc_car); | ||
41 | MAKE_ENV_PROC(global_env, "cdr", proc_cdr); | ||
42 | MAKE_ENV_PROC(global_env, "cons", proc_cons); | ||
43 | MAKE_ENV_PROC(global_env, "list", proc_list); | ||
44 | MAKE_ENV_PROC(global_env, "+", proc_sum); | ||
45 | MAKE_ENV_PROC(global_env, "-", proc_sub); | ||
46 | MAKE_ENV_PROC(global_env, "*", proc_mul); | ||
47 | MAKE_ENV_PROC(global_env, "/", proc_div); | ||
48 | MAKE_ENV_PROC(global_env, "%", proc_mod); | ||
49 | MAKE_ENV_PROC(global_env, "print", proc_print); | ||
50 | MAKE_ENV_PROC(global_env, "display", proc_display); | ||
51 | MAKE_ENV_PROC(global_env, "newline", proc_newline); | ||
52 | MAKE_ENV_PROC(global_env, "boolean?", proc_is_boolean); | ||
53 | MAKE_ENV_PROC(global_env, "nil?", proc_is_nil); | ||
54 | MAKE_ENV_PROC(global_env, "symbol?", proc_is_symbol); | ||
55 | MAKE_ENV_PROC(global_env, "string?", proc_is_string); | ||
56 | MAKE_ENV_PROC(global_env, "fixnum?", proc_is_fixnum); | ||
57 | MAKE_ENV_PROC(global_env, "pair?", proc_is_pair); | ||
58 | MAKE_ENV_PROC(global_env, "procedure?", proc_is_procedure); | ||
59 | MAKE_ENV_PROC(global_env, "not", proc_not); | ||
60 | MAKE_ENV_PROC(global_env, "and", proc_and); | ||
61 | MAKE_ENV_PROC(global_env, "or", proc_or); | ||
62 | MAKE_ENV_PROC(global_env, "if", proc_if); | ||
63 | MAKE_ENV_PROC(global_env, "cond", proc_cond); | ||
64 | MAKE_ENV_PROC(global_env, "<", proc_num_less_than); | ||
65 | MAKE_ENV_PROC(global_env, "<=", proc_num_lesseq_than); | ||
66 | MAKE_ENV_PROC(global_env, ">", proc_num_greater_than); | ||
67 | MAKE_ENV_PROC(global_env, ">=", proc_num_greatereq_than); | ||
68 | MAKE_ENV_PROC(global_env, "=", proc_num_equal); | ||
29 | } | 69 | } |
30 | 70 | ||
31 | void | 71 | void |
@@ -51,12 +91,10 @@ process_source(const StringView *source) { | |||
51 | 91 | ||
52 | // FIXME: Not freeing result or intermediate objects, can leak memory. | 92 | // FIXME: Not freeing result or intermediate objects, can leak memory. |
53 | Object *result = eval(global_env, root); | 93 | Object *result = eval(global_env, root); |
54 | printf("AST: "); | 94 | if (result != obj_nil) { |
55 | display(root); | 95 | display(result); |
56 | printf("\n"); | 96 | printf("\n"); |
57 | printf("EVAL: "); | 97 | } |
58 | display(result); | ||
59 | printf("\n"); | ||
60 | free_objects(root); | 98 | free_objects(root); |
61 | } | 99 | } |
62 | 100 | ||
@@ -94,9 +132,6 @@ run_repl(void) { | |||
94 | errors_n = 0; | 132 | errors_n = 0; |
95 | continue; | 133 | continue; |
96 | } | 134 | } |
97 | if (sv.n != 0) { | ||
98 | printf("\n"); | ||
99 | } | ||
100 | } | 135 | } |
101 | } | 136 | } |
102 | 137 | ||