]> git.eli173.com Git - klapaucius/commitdiff
i fixed the problem of consing stuff evaluating weird... for now
authorElijah Cohen <eli@eli173.com>
Tue, 13 Aug 2024 04:21:30 +0000 (23:21 -0500)
committerElijah Cohen <eli@eli173.com>
Tue, 13 Aug 2024 04:21:30 +0000 (23:21 -0500)
ideas.org
src/builtins/core.c

index 9690f46af620b9139787bdf9dd37efb19f114a32..bbf6e651b37caa17e99d081f229ee86dde3fc90e 100644 (file)
--- a/ideas.org
+++ b/ideas.org
@@ -1,3 +1,14 @@
+okay the problem:
+(cons 1 (cons 2 nil))
+goes to (cons 1 (2))
+which evaluates down to
+(cons 1 2)
+which is
+(1 . 2)
+how do I get the expected result of (1 2)?
+
+I think I need to figure out how to properly abuse quotes?
+
 
 so i'm redoing the basic eval to not pass an arg, but pass the rest of the list... yeah?
 then the builtins just harvest the rest one at a time to get all their args,
index 99eb17c7ab8e14fd240155e3923a18ad302ecfb2..03791a61e9b98312bb8985cded5bf7072b5c408f 100644 (file)
@@ -23,10 +23,15 @@ Sexpr* c_quote(Sexpr* b, Sexpr* rest, Sexpr* env) {
 Sexpr* c_cons(Sexpr* b, Sexpr* rest, Sexpr* env) {
        if(CORE_CONS_ARGS != u64_get_num_args(b))
                return cons(b, rest);
+       // big problem: need to rewrite to wiggle around quotes
        Sexpr* args = b->value.b.args;
        Sexpr* _cdr = eval(car(args), env);
+       if(_cdr->type == QUOTE)
+               _cdr = _cdr->value.q;
        Sexpr* _car = eval(car(cdr(args)), env);
-       return cons(cons(_car, _cdr), rest);
+       if(_car->type == QUOTE)
+               _car = _car->value.q;
+       return cons(from_quote(cons(_car, _cdr)), rest);
 }
 Sexpr* c_car(Sexpr* b, Sexpr* rest, Sexpr* env) {
        if(CORE_CAR_ARGS != u64_get_num_args(b))