From 79eb1a7b01d4bef6869b6492e749718ee19025b9 Mon Sep 17 00:00:00 2001 From: Elijah Cohen Date: Thu, 25 Jul 2024 11:07:28 -0500 Subject: [PATCH] boutta implement repl i think --- src/builtins.c | 2 +- src/builtins.h | 4 +--- src/builtins/core.c | 22 ++++++++++++++++++++++ src/builtins/core.h | 4 ++++ src/dict.c | 15 ++++++++++++--- src/parser.h | 1 - src/repl.c | 10 +++++++++- src/sexpr.h | 10 ---------- src/test.c | 10 +++++----- src/types.h | 1 - 10 files changed, 54 insertions(+), 25 deletions(-) diff --git a/src/builtins.c b/src/builtins.c index 70e5b04..088012c 100644 --- a/src/builtins.c +++ b/src/builtins.c @@ -34,7 +34,7 @@ uint64_t u64_get_num_args(Sexpr* b) { } -Sexpr* load_into_env(Sexpr* env) { +Sexpr* load_env(Sexpr* env) { Sexpr* newenv = load_core_env(env); return newenv; } diff --git a/src/builtins.h b/src/builtins.h index 1ad8b0c..51b1aab 100644 --- a/src/builtins.h +++ b/src/builtins.h @@ -5,10 +5,8 @@ #include "builtins/core.h" -#define _HIIIII - Sexpr* dispatch(Sexpr* b, Sexpr* env); - uint64_t u64_get_num_args(Sexpr* b); +Sexpr* load_env(Sexpr* env); #endif diff --git a/src/builtins/core.c b/src/builtins/core.c index f71ba4e..01b5cc3 100644 --- a/src/builtins/core.c +++ b/src/builtins/core.c @@ -8,6 +8,7 @@ #include "core.h" #include +#include Sexpr* c_quote(Sexpr* b, Sexpr* env) { if(CORE_QUOTE_ARGS != u64_get_num_args(b)) @@ -82,6 +83,23 @@ Sexpr* c_atom(Sexpr* b, Sexpr* env) { } +Sexpr* c_def(Sexpr* b, Sexpr* env) { + if(CORE_ATOM_ARGS != u64_get_num_args(b)) + return b; + Sexpr* args = b->value.b.args; + Sexpr* val = eval(car(cdr(args)), env); + append_to_dict(env, car(args), cdr(args)); + return val; +} +Sexpr* c_exit(Sexpr* b, Sexpr* env) { + if(CORE_EXIT_ARGS != u64_get_num_args(b)) + return b; + Sexpr* args = b->value.b.args; + uint64_t value = car(args)->value.u; + exit(value); + return NULL; +} + Sexpr* x_core_dispatch(Sexpr* b, Sexpr* env) { uint64_t code = b->value.b.opcode & 0xff; @@ -102,6 +120,8 @@ Sexpr* x_core_dispatch(Sexpr* b, Sexpr* env) { return c_not(b, env); case CORE_ATOM: return c_atom(b, env); + case CORE_DEF: + return c_def(b, env); default: return from_nil(); } @@ -126,5 +146,7 @@ Sexpr* load_core_env(Sexpr* env) { append_to_dict(env, from_sym("not"), c_not); Sexpr* c_atom = from_opcode(CORE_ATOM); append_to_dict(env, from_sym("atom"), c_atom); + Sexpr* c_def = from_opcode(CORE_DEF); + append_to_dict(env, from_sym("def"), c_def); return env; } diff --git a/src/builtins/core.h b/src/builtins/core.h index c6963ae..c85342e 100644 --- a/src/builtins/core.h +++ b/src/builtins/core.h @@ -25,6 +25,10 @@ #define CORE_ATOM 0x07 #define CORE_ATOM_ARGS 1 +#define CORE_DEF 0xfe // huh do i want this so close to exit? +#define CORE_DEF_ARGS 2 +#define CORE_EXIT 0xff +#define CORE_EXIT_ARGS 1 Sexpr* x_core_dispatch(Sexpr* s, Sexpr* env); Sexpr* load_core_env(Sexpr* env); diff --git a/src/dict.c b/src/dict.c index dd5aa4f..92c088d 100644 --- a/src/dict.c +++ b/src/dict.c @@ -5,26 +5,35 @@ #include + +// IMMENSE WARNING: as of now this is the only place where any sort of variable is modified in place.. that may come to pass more later, but beware + // okay, doing an incredibly /incredibly/ naive dict implementation for now, // proper hash tables come later // wait, this naive method can totally just be done in sexprs that I already have + +// great redo: have it in a cons cell, so I can modify it without having to return anything + Sexpr* init_dict() { - return from_nil(); + return cons(from_nil(), from_nil()); } Sexpr* append_to_dict(Sexpr* dict, Sexpr* key, Sexpr* value) { // assumes dict well-formed, returns new dict // puts new things on the front of the dict, makes it so looking up gets the newest stuff first Sexpr* new = cons(key, value); - return cons(new, dict); + Sexpr* head = cons(new, car(dict)); + dict->value.c->car = head; + //return cons(new, dict); + return dict; } Sexpr* lookup(Sexpr* dict, Sexpr* key) { // assumes dict well-formed // returns nil if not found, returns (result) if it is - Sexpr* node = dict; + Sexpr* node = car(dict); while(node->type != NIL) { if(equal(key, car(car(node)))->type == T) { return cons(cdr(car(node)), from_nil()); diff --git a/src/parser.h b/src/parser.h index 073548e..627cd4f 100644 --- a/src/parser.h +++ b/src/parser.h @@ -3,7 +3,6 @@ #include "types.h" - Sexpr* tokenize(char* s); Sexpr* cons_parse(Sexpr* tokens); Sexpr* vals_parse(Sexpr* tokens); diff --git a/src/repl.c b/src/repl.c index 0d83371..e64cf3f 100644 --- a/src/repl.c +++ b/src/repl.c @@ -5,6 +5,8 @@ #include "types.h" #include "eval.h" #include "dict.h" +#include "parser.h" +#include "builtins.h" @@ -14,7 +16,13 @@ Sexpr* stepl(char* str, Sexpr* env) { } int main(int argc, char** argv) { - printf("makefile functional\n"); + printf("makefile functional lol\n"); + + Sexpr* env = init_dict(); + load_env(env); + // now do the loop, right? + char* input = NULL; + return 0; } diff --git a/src/sexpr.h b/src/sexpr.h index 873da1d..8946091 100644 --- a/src/sexpr.h +++ b/src/sexpr.h @@ -3,27 +3,17 @@ #include "types.h" - Sexpr* from_nil(); - Sexpr* from_t(); - Sexpr* from_sym(char* s); - Sexpr* from_uint(uint64_t u); - Sexpr* from_opcode(uint64_t u); Sexpr* cons(Sexpr* car, Sexpr* cdr); - Sexpr* car(Sexpr* s); - Sexpr* cdr(Sexpr* s); - Sexpr* reverse(Sexpr* s); - Sexpr* equal(Sexpr* a, Sexpr* b); - char* sprint_sexpr(Sexpr* s); #endif diff --git a/src/test.c b/src/test.c index 8cd28c8..3fc6d14 100644 --- a/src/test.c +++ b/src/test.c @@ -88,11 +88,11 @@ void test_dict() { void run_tests(){ - //test_basics(); - //test2(); - //test_parsing(); - //test_parser(); - //test_eq(); + test_basics(); + test2(); + test_parsing(); + test_parser(); + test_eq(); test_dict(); } diff --git a/src/types.h b/src/types.h index 33cf151..26f0336 100644 --- a/src/types.h +++ b/src/types.h @@ -3,7 +3,6 @@ // here is where i define the most relevant types for this project - #include #include #include -- 2.39.2