]> git.eli173.com Git - klapaucius/commitdiff
boutta make some big restructuring, makefile better
authorElijah Cohen <eli@eli173.com>
Wed, 24 Jul 2024 05:58:35 +0000 (00:58 -0500)
committerElijah Cohen <eli@eli173.com>
Wed, 24 Jul 2024 05:58:35 +0000 (00:58 -0500)
src/Makefile
src/builtins.c
src/builtins.h
src/builtins/core.c
src/builtins/core.h
src/eval.c

index 9d520083601706e87a7f628437dbf64576d4c252..7117825e2ba6fafe3e8918436037c2366a60fa90 100644 (file)
@@ -3,7 +3,7 @@ CC:=llvm-gcc
 
 # okay what the fuck am i doing with lex yacc generated stuff? just do it once? okay
 
-SRCS:= $(wildcard *.c)
+SRCS:= $(wildcard *.c */*.c)
 BUILD:= ../build
 BIN:=repl
 TEST_BIN:=test
index 74ddec4e439d826aa758955ad1bfe7edc0b07f5e..002897dfc871d76a20370ceff5260c78dd15aa1e 100644 (file)
@@ -9,12 +9,21 @@
 #include "builtins/core.h"
 
 
-Sexpr* dispatch(Sexpr* b) {
+Sexpr* apply(Sexpr* b, Sexpr* env) {
        uint64_t prefix = (b->value.b.opcode) >> 8;
        switch(prefix) {
        case CORE_PREFIX:
-               return x_core_dispatch(b);
+               return x_core_dispatch(b, env);
        default:
                return from_nil();
        }
 }
+
+Sexpr* append_arg(Sexpr* b, Sexpr* arg) {
+       // where b better be a builtin
+       Sexpr* ret = malloc(sizeof(Sexpr));
+       ret->type = BUILTIN;
+       ret->value.b.opcode = b->value.b.opcode;
+       ret->value.b.args = cons(arg, b->value.b.args);
+       return ret;
+}
index cc110c38c8e82363a2db08fc4b39dff2d00857c9..f5aa583a80e3c0b16acfd3e85107ca9dd4440971 100644 (file)
@@ -7,8 +7,8 @@
 
 #define _HIIIII
 
-Sexpr* dispatch(Sexpr* b);
-
+Sexpr* apply(Sexpr* b, Sexpr* env);
+Sexpr* append_arg(Sexpr* b, Sexpr* arg);
 
 
 #endif
index 8e08682e0c654405b4253cf679e63f47be09712d..f6d14a64ccada9215b6b6ec620de6810109bc0db 100644 (file)
@@ -4,13 +4,38 @@
 #include "../sexpr.h"
 #include "../eval.h"
 
+Sexpr* c_quote(Sexpr* args) {
+       return car(args);
+}
+Sexpr* c_cons(Sexpr* args) {
+       Sexpr* _car = car(args);
+       Sexpr* _cdr = car(cdr(args));
+       return cons(_car, _cdr);
+}
+Sexpr* c_car(Sexpr* args) {
+       return car(car(args));
+}
+Sexpr* c_cdr(Sexpr* args) {
+       return cdr(car(args));
+}
+Sexpr* c_if(Sexpr* args) {
+       Sexpr* cond = car(args);
+       Sexpr* truthy = car(cdr(args));
+       Sexpr* falsy = car(cdr(cdr(args)));
+
+}
 
+//Sexpr* c_quote(Sexpr* args);
+//Sexpr* c_cons(Sexpr* args);
 
-Sexpr* x_core_dispatch(Sexpr* s) {
+Sexpr* x_core_dispatch(Sexpr* s, Sexpr* env) {
        uint64_t code = s->value.b.opcode & 0xff;
+       Sexpr* args = s->value.b.args;
        switch(code) {
        case 0: // quote
-               
+               return c_quote(args);
+       case 1: // cons
+               return c_cons(args);
        default:
                return from_nil();
        }
index 7f941e0203854d979a4f3c50ca334d76b6e23542..bbcc74d1627ec8d2a2eb2d08b14e1ab54dec8bd7 100644 (file)
@@ -7,5 +7,5 @@
 #define CORE_PREFIX 0x00
 
 
-Sexpr* x_core_dispatch(Sexpr* s);
+Sexpr* x_core_dispatch(Sexpr* s, Sexpr* env);
 
index a28fd07881edfb5d046c8e006de89b0bd217a03e..e3a42ddda423b5bb7c97ea2f3250052bdee10813 100644 (file)
@@ -7,7 +7,7 @@
 #include "dict.h"
 #include "builtins.h"
 
-Sexpr* apply_builtin(Sexpr* func, Sexpr* arg);
+Sexpr* apply_builtin(Sexpr* func, Sexpr* arg, Sexpr* env);
 
 Sexpr* eval(Sexpr* s, Sexpr* dict) {
        // non-null s
@@ -39,7 +39,7 @@ Sexpr* eval(Sexpr* s, Sexpr* dict) {
        return curr;
 }
 
-Sexpr* apply_builtin(Sexpr* func, Sexpr* arg) {
+Sexpr* apply_builtin(Sexpr* func, Sexpr* arg, Sexpr* env) {
        if(func->type != BUILTIN)
                return from_nil(); // uhh this /should/ actually be impossible...
        uint8_t num_args = 0;
@@ -59,5 +59,5 @@ Sexpr* apply_builtin(Sexpr* func, Sexpr* arg) {
                return ret;
        // what's left now: all the args needed are there,
        // just gotta dispatch to whatever handles the opcode evals
-       return dispatch(ret);
+       return dispatch(ret, env);
 }