From 05c77e3ad9b8b3d8a98cd74cd78901a806525435 Mon Sep 17 00:00:00 2001 From: Nathan Braswell Date: Mon, 13 Apr 2020 22:45:40 -0400 Subject: [PATCH] let* generated --- bf.kp | 3 ++- k_prime.krak | 24 ++++++++++++++---------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/bf.kp b/bf.kp index 1b5ac17..92f84dd 100644 --- a/bf.kp +++ b/bf.kp @@ -48,5 +48,6 @@ (println (bf { ,>+++[<.>-] } [1337])) -(def! main (fn* [argv] 2)) +;(def! main (fn* [argv] 2)) +(def! main (fn* [] (let* (a 13 b 12 c 11) b))) ;(def! main (fn* [] (+ 13 1))) diff --git a/k_prime.krak b/k_prime.krak index 5648463..6007544 100644 --- a/k_prime.krak +++ b/k_prime.krak @@ -1394,7 +1394,7 @@ fun main(argc: int, argv: **char): int { println("Starting compile!") match (get_value(main)) { MalValue::Function(f) { - var main_s = str("int main(int argc, char** argv) {\n") + var main_s = str("#include \nint main(int argc, char** argv) {\n") var inner_main = compile(&main_s, env, *f.body) main_s += "return (" + inner_main + ")>>3;\n}\n" write_file(str(argv[1]) + ".c", main_s) @@ -1453,7 +1453,11 @@ fun compile_value(defs: *str, env: *Env, ast: MalValue): str { /*return MalResult::Ok(ast)*/ error("could not compile value: " + pr_str(ast, true)) } - +var tmp_idx: int = 0 +fun new_tmp(): str { + tmp_idx += 1 + return str("x") + tmp_idx +} fun compile(defs: *str, env: *Env, ast: MalValue): str { var expanded = macroexpand(ast, env) if (is_err(expanded)) { @@ -1476,7 +1480,7 @@ fun compile(defs: *str, env: *Env, ast: MalValue): str { } var to_set_name = get_symbol_text(l[1]) var to_set_value = compile(defs, env, l[2]) - *defs += "usize " + to_set_name + " = " + to_set_value + ";\n" + *defs += "size_t " + to_set_name + " = " + to_set_value + ";\n" return to_set_name } else if (is_symbol(l[0], "defmacro!")) { error("defmacro! doesn't make sense in compiled code") @@ -1491,18 +1495,18 @@ fun compile(defs: *str, env: *Env, ast: MalValue): str { if (bindings.size & 1 != 0) { error("let* list of bindings has odd number of entries") } + var let_val = new_tmp() + *defs += "size_t " + let_val + ";\n{\n" var new_env = new()->construct(env) for (var i = 0; i < bindings.size; i+=2;) { if (!is_symbol(bindings[i])) { error("let* var name not symbol") } var to_set_value = compile(defs, new_env, bindings[i+1]) - *defs += "usize " + get_symbol_text(bindings[i]) + " = " + to_set_value + ";\n" - /*var to_set_value = EVAL(new_env, bindings[i+1])*/ - /*new_env->set(get_symbol_text(bindings[i]), get_value(to_set_value))*/ + *defs += "size_t " + get_symbol_text(bindings[i]) + " = " + to_set_value + ";\n" } - // tco - return compile(defs, new_env, l[2]) + *defs += let_val + " = " + compile(defs, new_env, l[2]) + ";\n}\n" + return let_val } else if (is_symbol(l[0], "do")) { for (var i = 1; i < l.size-1; i++;) { var _ = compile(defs, env, l[i]) @@ -1514,8 +1518,8 @@ fun compile(defs: *str, env: *Env, ast: MalValue): str { error("if needs 2 or 3 children") } var cond = compile(defs, env, l[1]) - var tmp_name = str("tmp") - *defs += "usize " + tmp_name + "; if (" + cond + ") {\n" + var tmp_name = new_tmp() + *defs += "size_t " + tmp_name + "; if (" + cond + ") {\n" var then = compile(defs, env, l[2]) *defs += tmp_name + " = " + then + ";\n} else {\n" var else_ = compile(defs, env, l[3])