let* generated
This commit is contained in:
3
bf.kp
3
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)))
|
||||
|
||||
24
k_prime.krak
24
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 <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])
|
||||
|
||||
Reference in New Issue
Block a user