aboutsummaryrefslogtreecommitdiffstats
path: root/src/bootstrap/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/bootstrap/main.c')
-rwxr-xr-xsrc/bootstrap/main.c57
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
17void 23void
18init(void) { 24init(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
31void 71void
@@ -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