From ed1f406102738812fafa5e49ee131fe06c177687 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Wed, 13 Oct 2021 16:44:17 +0200 Subject: Add a lot of primitive types --- src/bootstrap/main.c | 57 ++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 46 insertions(+), 11 deletions(-) (limited to 'src/bootstrap/main.c') 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 @@ #include "lexer.c" #include "objects.c" #include "parser.c" +#include "environment.c" +#include "primitives.c" #define MAKE_SYM(STR) make_symbol((StringView){(STR), sizeof(STR) - 1}) +#define MAKE_ENV_VAR(ENV,STR,VAR) \ + (env_add_symbol((ENV), MAKE_SYM(STR), (VAR))) +#define MAKE_ENV_PROC(ENV,STR,FUN) \ + (env_add_symbol((ENV), MAKE_SYM(STR), make_procedure(FUN))) void init(void) { @@ -24,8 +30,42 @@ init(void) { // Global environment. global_env = env_create(NULL); - env_add_symbol(global_env, MAKE_SYM("quote"), make_procedure(proc_quote)); - env_add_symbol(global_env, MAKE_SYM("+"), make_procedure(proc_sum)); + + // Primitive symbols. + MAKE_ENV_VAR(global_env, "else", obj_true); + MAKE_ENV_VAR(global_env, "nil", obj_nil); + + // Primitive procedures. + MAKE_ENV_PROC(global_env, "quote", proc_quote); + MAKE_ENV_PROC(global_env, "car", proc_car); + MAKE_ENV_PROC(global_env, "cdr", proc_cdr); + MAKE_ENV_PROC(global_env, "cons", proc_cons); + MAKE_ENV_PROC(global_env, "list", proc_list); + MAKE_ENV_PROC(global_env, "+", proc_sum); + MAKE_ENV_PROC(global_env, "-", proc_sub); + MAKE_ENV_PROC(global_env, "*", proc_mul); + MAKE_ENV_PROC(global_env, "/", proc_div); + MAKE_ENV_PROC(global_env, "%", proc_mod); + MAKE_ENV_PROC(global_env, "print", proc_print); + MAKE_ENV_PROC(global_env, "display", proc_display); + MAKE_ENV_PROC(global_env, "newline", proc_newline); + MAKE_ENV_PROC(global_env, "boolean?", proc_is_boolean); + MAKE_ENV_PROC(global_env, "nil?", proc_is_nil); + MAKE_ENV_PROC(global_env, "symbol?", proc_is_symbol); + MAKE_ENV_PROC(global_env, "string?", proc_is_string); + MAKE_ENV_PROC(global_env, "fixnum?", proc_is_fixnum); + MAKE_ENV_PROC(global_env, "pair?", proc_is_pair); + MAKE_ENV_PROC(global_env, "procedure?", proc_is_procedure); + MAKE_ENV_PROC(global_env, "not", proc_not); + MAKE_ENV_PROC(global_env, "and", proc_and); + MAKE_ENV_PROC(global_env, "or", proc_or); + MAKE_ENV_PROC(global_env, "if", proc_if); + MAKE_ENV_PROC(global_env, "cond", proc_cond); + MAKE_ENV_PROC(global_env, "<", proc_num_less_than); + MAKE_ENV_PROC(global_env, "<=", proc_num_lesseq_than); + MAKE_ENV_PROC(global_env, ">", proc_num_greater_than); + MAKE_ENV_PROC(global_env, ">=", proc_num_greatereq_than); + MAKE_ENV_PROC(global_env, "=", proc_num_equal); } void @@ -51,12 +91,10 @@ process_source(const StringView *source) { // FIXME: Not freeing result or intermediate objects, can leak memory. Object *result = eval(global_env, root); - printf("AST: "); - display(root); - printf("\n"); - printf("EVAL: "); - display(result); - printf("\n"); + if (result != obj_nil) { + display(result); + printf("\n"); + } free_objects(root); } @@ -94,9 +132,6 @@ run_repl(void) { errors_n = 0; continue; } - if (sv.n != 0) { - printf("\n"); - } } } -- cgit v1.2.1