]> git.eli173.com Git - klapaucius/commitdiff
fixed problems with meta operations
authorElijah Cohen <cohen@eli173.com>
Sat, 23 Nov 2024 23:50:41 +0000 (23:50 +0000)
committerElijah Cohen <cohen@eli173.com>
Sat, 23 Nov 2024 23:50:41 +0000 (23:50 +0000)
src/builtins.c
src/builtins/meta.c
src/eval.c
src/sexpr.c
src/test.c

index cc470a69ad1abda8622ebde0a72a6edd2447799c..adc1da6760725562983677403c03fbf338381d80 100644 (file)
@@ -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";
        }
index 54c3016f2d7904f6dc44f2e726118a7dc7b7944f..cf8ed886d33e27081f690990c48cbb101846afc1 100644 (file)
@@ -8,6 +8,8 @@
 #include "../parser.h"
 #include "meta.h"
 
+#include <stdlib.h>
+
 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);
index 18870ef47b560f21d1eb1ed1154f103f1e44cc86..d07236d23c14c3c7e73e71eabf29506b85c838ca 100644 (file)
@@ -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
index b0843ddd22c878a82433fa6b4e1478273c029825..f57edc8ca380e18a7d5d17fa94d7a1779924e593 100644 (file)
@@ -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, ")");
index 5514e9d4df2e3e3b0866e5b5e969b0afe7a67474..817882b3f0cbfc9fab5b3d08faf87f0f4f06a73c 100644 (file)
@@ -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);