let* generated

This commit is contained in:
Nathan Braswell
2020-04-13 22:45:40 -04:00
parent 813d31cb2b
commit 05c77e3ad9
2 changed files with 16 additions and 11 deletions

3
bf.kp
View File

@@ -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)))

View File

@@ -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 <stddef.h>\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<Env>()->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])