]> git.eli173.com Git - klapaucius/commitdiff
boutta implement repl i think
authorElijah Cohen <eli@eli173.com>
Thu, 25 Jul 2024 16:07:28 +0000 (11:07 -0500)
committerElijah Cohen <eli@eli173.com>
Thu, 25 Jul 2024 16:07:28 +0000 (11:07 -0500)
src/builtins.c
src/builtins.h
src/builtins/core.c
src/builtins/core.h
src/dict.c
src/parser.h
src/repl.c
src/sexpr.h
src/test.c
src/types.h

index 70e5b04dc95f8f42d023a323e1a23c32fa86745e..088012cee470f0b89fa0f9096656d3d9db4b9289 100644 (file)
@@ -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;
 }
index 1ad8b0c3572dfeb88e6f4e5d9d0bf57fd67c0ff2..51b1aabe4ef05e59355acd3ca0f69346f703f9f5 100644 (file)
@@ -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
index f71ba4e6052eb6a792e26fd66312a902f90de358..01b5cc3cc5313782579b8b34c775a3ba9d0290cf 100644 (file)
@@ -8,6 +8,7 @@
 #include "core.h"
 
 #include <inttypes.h>
+#include <stdlib.h>
 
 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;
 }
index c6963aef7b64cfc0a2a6c0b1b0cce43f9af89819..c85342e074d46674ec12552bbb8da5ab3785426a 100644 (file)
 #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);
index dd5aa4fb8efa2fa1c221cbbdcb73f6865c91d45d..92c088de14caac2b9c2e4bc8e9cadf6abfec42cc 100644 (file)
@@ -5,26 +5,35 @@
 
 #include <stdio.h>
 
+
+// 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());
index 073548ee535d7be915cf92aa6f60315541c8905a..627cd4f6f8a3c114fcf82f13664074f34a7697cd 100644 (file)
@@ -3,7 +3,6 @@
 
 #include "types.h"
 
-
 Sexpr* tokenize(char* s);
 Sexpr* cons_parse(Sexpr* tokens);
 Sexpr* vals_parse(Sexpr* tokens);
index 0d833716722c762e7ba77f0d19b2637f6a761ef1..e64cf3f41faf42a93055253b3a28a0afe5ce1501 100644 (file)
@@ -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;
 }
index 873da1d03a856afbbd93138cad69fc3ba3cefd79..89460910eaef3195752e47c7c19fc09048f23966 100644 (file)
@@ -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
index 8cd28c8691bab2fcdbdd989001e0aa4833e6760d..3fc6d14fa71253efb5d4cf09b9574560b80db81a 100644 (file)
@@ -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();
 }
 
index 33cf151beac7aa396bdd8ca02948390e16ad35c7..26f033610eb5f8fa0e55efa72e21bbd819dcae15 100644 (file)
@@ -3,7 +3,6 @@
 
 // here is where i define the most relevant types for this project
 
-
 #include <stdint.h>
 #include <inttypes.h>
 #include <stdbool.h>