]> git.eli173.com Git - klapaucius/commitdiff
refactored environment loading, much simpler
authorElijah Cohen <cohen@eli173.com>
Sat, 17 Aug 2024 06:15:09 +0000 (06:15 +0000)
committerElijah Cohen <cohen@eli173.com>
Sat, 17 Aug 2024 06:16:42 +0000 (06:16 +0000)
src/builtins.c
src/builtins.h
src/builtins/arithmetic.c
src/builtins/combinators.c
src/builtins/core.c

index 9641ea0238d1142508bc8d9450ff53615e3c0ccc..c336bfa121c1af194fd5ad4c919a057ce111515a 100644 (file)
@@ -39,6 +39,13 @@ uint64_t u64_get_num_args(Sexpr* b) {
        return curr_num;
 }
 
+void load_builtin(char* ks, uint64_t op, Sexpr* env) {
+  Sexpr* k = from_sym(ks);
+       Sexpr* v = from_opcode(op);
+       append_to_dict(env, k, v);
+       sexpr_free(v);
+       sexpr_free(k);
+}
 
 Sexpr* load_env(Sexpr* env) {
        Sexpr* nilk = from_sym("nil");
index c20e829f00c300d3e12304ecf2bf07da34f6ddbb..a37b2c6fe8a1f08897a2ea7d680fa412c0df6481 100644 (file)
@@ -7,6 +7,7 @@
 
 Sexpr* dispatch(Sexpr* b, Sexpr* rest, Sexpr* env);
 uint64_t u64_get_num_args(Sexpr* b);
+void load_builtin(char* ks, uint64_t op, Sexpr* env);
 Sexpr* load_env(Sexpr* env);
 
 #endif
index 521ba178a00c5d8781bd9012931b0038106ec283..c99cda0cdeb2bb71ef6a04b1a7c4ad8e536273d4 100644 (file)
@@ -107,37 +107,11 @@ Sexpr* x_arith_dispatch(Sexpr* b, Sexpr* rest, Sexpr* env) {
 }
 
 Sexpr* load_arith_env(Sexpr* env) {
-       Sexpr* k;
-       Sexpr* v;
-
-       k = from_sym("+");
-       v = from_opcode((ARITH_PREFIX << 8) | ARITH_ADD);
-       append_to_dict(env, k, v);
-       sexpr_free(v);
-       sexpr_free(k);
-
-       k = from_sym("-");
-       v = from_opcode((ARITH_PREFIX << 8) | ARITH_SUB);
-       append_to_dict(env, k, v);
-       sexpr_free(v);
-       sexpr_free(k);
-
-               k = from_sym("*");
-       v = from_opcode((ARITH_PREFIX << 8) | ARITH_MUL);
-       append_to_dict(env, k, v);
-       sexpr_free(v);
-       sexpr_free(k);
-
-               k = from_sym("/");
-       v = from_opcode((ARITH_PREFIX << 8) | ARITH_DIV);
-       append_to_dict(env, k, v);
-       sexpr_free(v);
-       sexpr_free(k);
-
-               k = from_sym("%");
-       v = from_opcode((ARITH_PREFIX << 8) | ARITH_MOD);
-       append_to_dict(env, k, v);
-       sexpr_free(v);
-       sexpr_free(k);
+       load_builtin("+", (ARITH_PREFIX << 8) | ARITH_ADD, env);
+       load_builtin("-", (ARITH_PREFIX << 8) | ARITH_SUB, env);
+       load_builtin("*", (ARITH_PREFIX << 8) | ARITH_MUL, env);
+       load_builtin("/", (ARITH_PREFIX << 8) | ARITH_DIV, env);
+       load_builtin("%", (ARITH_PREFIX << 8) | ARITH_MOD, env);
+       
        return env;
 }
index b9d1ac963e5b77aacb21e6692a14ca879d565605..ac1d352b2e4ec8a3079daf34a13bbbcccbf23a7f 100644 (file)
@@ -113,44 +113,12 @@ Sexpr* x_comb_dispatch(Sexpr* b, Sexpr* rest, Sexpr* env) {
 }
 
 Sexpr* load_comb_env(Sexpr* env) {
-       Sexpr* k;
-       Sexpr* v;
+       load_builtin("I", (COMB_PREFIX << 8) | COMB_I, env);
+       load_builtin("S", (COMB_PREFIX << 8) | COMB_S, env);
+       load_builtin("K", (COMB_PREFIX << 8) | COMB_K, env);
+       load_builtin("B", (COMB_PREFIX << 8) | COMB_B, env);
+       load_builtin("C", (COMB_PREFIX << 8) | COMB_C, env);
+       load_builtin("W", (COMB_PREFIX << 8) | COMB_W, env);
        
-       k = from_sym("I");
-       v = from_opcode((COMB_PREFIX << 8) | COMB_I);
-       append_to_dict(env, k, v);
-       sexpr_free(v);
-       sexpr_free(k);
-
-       k = from_sym("S");
-       v = from_opcode((COMB_PREFIX << 8) | COMB_S);
-       append_to_dict(env, k, v);
-       sexpr_free(v);
-       sexpr_free(k);
-
-       k = from_sym("K");
-       v = from_opcode((COMB_PREFIX << 8) | COMB_K);
-       append_to_dict(env, k, v);
-       sexpr_free(v);
-       sexpr_free(k);
-
-       k = from_sym("B");
-       v = from_opcode((COMB_PREFIX << 8) | COMB_B);
-       append_to_dict(env, k, v);
-       sexpr_free(v);
-       sexpr_free(k);
-
-       k = from_sym("C");
-       v = from_opcode((COMB_PREFIX << 8) | COMB_C);
-       append_to_dict(env, k, v);
-       sexpr_free(v);
-       sexpr_free(k);
-
-       k = from_sym("W");
-       v = from_opcode((COMB_PREFIX << 8) | COMB_W);
-       append_to_dict(env, k, v);
-       sexpr_free(v);
-       sexpr_free(k);
-
        return env;
 }
index d7b97e1027d71ac517dc93b2c9e25ad4dc039887..a72b87f1f0a568b37b6d849b0bcc34c5ff6e214b 100644 (file)
@@ -189,65 +189,17 @@ Sexpr* x_core_dispatch(Sexpr* b, Sexpr* rest, Sexpr* env) {
 
 
 Sexpr* load_core_env(Sexpr* env) {
-       Sexpr* k = from_sym("quote");
-       Sexpr* c_quote = from_opcode(CORE_QUOTE);
-       append_to_dict(env, k, c_quote);
-       sexpr_free(c_quote);
-       sexpr_free(k);
+       load_builtin("quote", (CORE_PREFIX << 8) | CORE_QUOTE, env);
+       load_builtin("cons", (CORE_PREFIX << 8) | CORE_CONS, env);
+       load_builtin("car", (CORE_PREFIX << 8) | CORE_CAR, env);
+       load_builtin("cdr", (CORE_PREFIX << 8) | CORE_CDR, env);
+       load_builtin("if", (CORE_PREFIX << 8) | CORE_IF, env);
+       load_builtin("eq", (CORE_PREFIX << 8) | CORE_EQ, env);
+       load_builtin("not", (CORE_PREFIX << 8) | CORE_NOT, env);
+       load_builtin("atom", (CORE_PREFIX << 8) | CORE_ATOM, env);
        
-       k = from_sym("cons");
-       Sexpr* c_cons = from_opcode(CORE_CONS);
-       append_to_dict(env, k, c_cons);
-       sexpr_free(c_cons);
-       sexpr_free(k);
-
-       k = from_sym("car");
-       Sexpr* c_car = from_opcode(CORE_CAR);
-       append_to_dict(env, k, c_car);
-       sexpr_free(c_car);
-       sexpr_free(k);
+       load_builtin("def", (CORE_PREFIX << 8) | CORE_DEF, env);
+       load_builtin("exit", (CORE_PREFIX << 8) | CORE_EXIT, env);
        
-       k = from_sym("cdr");
-       Sexpr* c_cdr = from_opcode(CORE_CDR);
-       append_to_dict(env, k, c_cdr);
-       sexpr_free(c_cdr);
-       sexpr_free(k);
-
-       k = from_sym("if");
-       Sexpr* c_if = from_opcode(CORE_IF);
-       append_to_dict(env, k, c_if);
-       sexpr_free(c_if);
-       sexpr_free(k);
-
-       k = from_sym("eq");
-       Sexpr* c_eq = from_opcode(CORE_EQ);
-       append_to_dict(env, k, c_eq);
-       sexpr_free(c_eq);
-       sexpr_free(k);
-
-       k = from_sym("not");
-       Sexpr* c_not = from_opcode(CORE_NOT);
-       append_to_dict(env, k, c_not);
-       sexpr_free(c_not);
-       sexpr_free(k);
-
-       k = from_sym("atom");
-       Sexpr* c_atom = from_opcode(CORE_ATOM);
-       append_to_dict(env, k, c_atom);
-       sexpr_free(c_atom);
-       sexpr_free(k);
-
-       k = from_sym("def");
-       Sexpr* c_def = from_opcode(CORE_DEF);
-       append_to_dict(env, k, c_def);
-       sexpr_free(c_def);
-       sexpr_free(k);
-
-       k = from_sym("exit");
-       Sexpr* c_exit = from_opcode(CORE_EXIT);
-       append_to_dict(env, k, c_exit);
-       sexpr_free(c_exit);
-       sexpr_free(k);
-
        return env;
 }