From 712e5f6b75e484f4581348b28319d2c16940aeb6 Mon Sep 17 00:00:00 2001 From: Elijah Cohen Date: Sat, 23 Nov 2024 23:50:41 +0000 Subject: [PATCH] fixed problems with meta operations --- src/builtins.c | 18 ++++++++++++++++++ src/builtins/meta.c | 12 ++++++++++-- src/eval.c | 2 +- src/sexpr.c | 2 ++ src/test.c | 13 ++++++++++++- 5 files changed, 43 insertions(+), 4 deletions(-) diff --git a/src/builtins.c b/src/builtins.c index cc470a6..adc1da6 100644 --- a/src/builtins.c +++ b/src/builtins.c @@ -233,9 +233,27 @@ char* lookup_builtin(Sexpr* b) { return STRINGS_SUBSTR_STR; case STRINGS_STRTOK: return STRINGS_STRTOK_STR; + case STRINGS_TOSTR: + return STRINGS_TOSTR_STR; default: return "NOT FOUND (STRING)"; } + case META_PREFIX: + switch(suffix) { + case META_UTOB: + return META_UTOB_STR; + case META_BTOU: + return META_BTOU_STR; + case META_PARSE: + return META_PARSE_STR; + case META_GETARGS: + return META_GETARGS_STR; + case META_GETENV: + return META_GETENV_STR; + case META_SETENV: + return META_SETENV_STR; + default: return "NOT FOUND (META)"; + } default: return "NOT FOUND"; } diff --git a/src/builtins/meta.c b/src/builtins/meta.c index 54c3016..cf8ed88 100644 --- a/src/builtins/meta.c +++ b/src/builtins/meta.c @@ -8,6 +8,8 @@ #include "../parser.h" #include "meta.h" +#include + Sexpr* m_utob(Sexpr* b, Sexpr* rest, Sexpr* env) { if(META_UTOB_ARGS != u64_get_num_args(b)) { return cons(b, rest); @@ -101,7 +103,10 @@ Sexpr* m_getenv(Sexpr* b, Sexpr* rest, Sexpr* env) { sexpr_free(arg); return cons(from_nil(), rest); } - return cons(from_quote(clone(env)), rest); + sexpr_free(b); + sexpr_free(arg); + Sexpr* outpart = cons(from_quote(clone(env)), rest); + return outpart; } Sexpr* m_setenv(Sexpr* b, Sexpr* rest, Sexpr* env) { @@ -110,12 +115,15 @@ Sexpr* m_setenv(Sexpr* b, Sexpr* rest, Sexpr* env) { return cons(b, rest); } Sexpr* arg = eval(clone(car(b->value.b.args)), env); - if(arg->type != CONS && cdr(arg)->type != NIL) { + if(unquote(arg)->type != CONS && cdr(unquote(arg))->type != NIL) { ERR(META_SETENV_STR ": ", "not well-formed"); sexpr_free(b); sexpr_free(arg); return cons(from_nil(), rest); } + Sexpr* newenvbody = clone(car(unquote(arg))); + sexpr_free(car(env)); + env->value.c->car = newenvbody; // todo sexpr_free(b); sexpr_free(arg); diff --git a/src/eval.c b/src/eval.c index 18870ef..d07236d 100644 --- a/src/eval.c +++ b/src/eval.c @@ -11,7 +11,7 @@ Sexpr* apply_builtin(Sexpr* func, Sexpr* arg, Sexpr* env); Sexpr* eval(Sexpr* s, Sexpr* dict) { /* char* out = sprint_sexpr_builtin(s); - PRINT(out); + PRINTMV("evaling: ", out); free(out); */ // okay.. important to note, // this needs to free s diff --git a/src/sexpr.c b/src/sexpr.c index b0843dd..f57edc8 100644 --- a/src/sexpr.c +++ b/src/sexpr.c @@ -274,6 +274,7 @@ char* sprint_sexpr(Sexpr* s) { else { // non-nil char* cdrstr = sprint_sexpr(curr_cell); currsize += strlen(cdrstr) + 4; // dot, space, close, null-terminator + out = realloc(out, currsize); strcat(out, ". "); strcat(out, cdrstr); strcat(out, ")"); @@ -369,6 +370,7 @@ char* sprint_sexpr_builtin(Sexpr* s) { else { // non-nil char* cdrstr = sprint_sexpr_builtin(curr_cell); currsize += strlen(cdrstr) + 4; // dot, space, close, null-terminator + out = realloc(out, currsize); strcat(out, ". "); strcat(out, cdrstr); strcat(out, ")"); diff --git a/src/test.c b/src/test.c index 5514e9d..817882b 100644 --- a/src/test.c +++ b/src/test.c @@ -368,6 +368,16 @@ void eval_tests() { run_eval_test("(tostr (cons 43 \"test\"))"); + run_eval_test("(utob 512)"); + run_eval_test("(btou +)"); + run_eval_test("(parse \"(cons 4 5)\")"); + run_eval_test("(getargs 54)"); + run_eval_test("(getargs +)"); + run_eval_test("(getargs (+ 5))"); + + run_eval_test("(getenv t)"); + run_eval_test("(setenv (cons (cons nil nil) nil))"); + } void many_asserts() { @@ -426,9 +436,10 @@ void test_string_parsing() { } void isolating_problem() { + run_eval_test("(getenv t)"); //run_eval_test("(if t (cons 1 2) (cons 2 1))"); //run_eval_test("((cons 4 5) (cons 2 3))"); - run_eval_test("((quote asdf) 45)"); + //run_eval_test("((quote asdf) 45)"); //run_eval_test("((cons 4 5) 5)"); //Sexpr* env = init_dict(); //env = load_env(env); -- 2.39.5