let* generated
This commit is contained in:
3
bf.kp
3
bf.kp
@@ -48,5 +48,6 @@
|
|||||||
|
|
||||||
(println (bf { ,>+++[<.>-] } [1337]))
|
(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)))
|
;(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!")
|
println("Starting compile!")
|
||||||
match (get_value(main)) {
|
match (get_value(main)) {
|
||||||
MalValue::Function(f) {
|
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)
|
var inner_main = compile(&main_s, env, *f.body)
|
||||||
main_s += "return (" + inner_main + ")>>3;\n}\n"
|
main_s += "return (" + inner_main + ")>>3;\n}\n"
|
||||||
write_file(str(argv[1]) + ".c", main_s)
|
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)*/
|
/*return MalResult::Ok(ast)*/
|
||||||
error("could not compile value: " + pr_str(ast, true))
|
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 {
|
fun compile(defs: *str, env: *Env, ast: MalValue): str {
|
||||||
var expanded = macroexpand(ast, env)
|
var expanded = macroexpand(ast, env)
|
||||||
if (is_err(expanded)) {
|
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_name = get_symbol_text(l[1])
|
||||||
var to_set_value = compile(defs, env, l[2])
|
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
|
return to_set_name
|
||||||
} else if (is_symbol(l[0], "defmacro!")) {
|
} else if (is_symbol(l[0], "defmacro!")) {
|
||||||
error("defmacro! doesn't make sense in compiled code")
|
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) {
|
if (bindings.size & 1 != 0) {
|
||||||
error("let* list of bindings has odd number of entries")
|
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)
|
var new_env = new<Env>()->construct(env)
|
||||||
for (var i = 0; i < bindings.size; i+=2;) {
|
for (var i = 0; i < bindings.size; i+=2;) {
|
||||||
if (!is_symbol(bindings[i])) {
|
if (!is_symbol(bindings[i])) {
|
||||||
error("let* var name not symbol")
|
error("let* var name not symbol")
|
||||||
}
|
}
|
||||||
var to_set_value = compile(defs, new_env, bindings[i+1])
|
var to_set_value = compile(defs, new_env, bindings[i+1])
|
||||||
*defs += "usize " + get_symbol_text(bindings[i]) + " = " + to_set_value + ";\n"
|
*defs += "size_t " + 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))*/
|
|
||||||
}
|
}
|
||||||
// tco
|
*defs += let_val + " = " + compile(defs, new_env, l[2]) + ";\n}\n"
|
||||||
return compile(defs, new_env, l[2])
|
return let_val
|
||||||
} else if (is_symbol(l[0], "do")) {
|
} else if (is_symbol(l[0], "do")) {
|
||||||
for (var i = 1; i < l.size-1; i++;) {
|
for (var i = 1; i < l.size-1; i++;) {
|
||||||
var _ = compile(defs, env, l[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")
|
error("if needs 2 or 3 children")
|
||||||
}
|
}
|
||||||
var cond = compile(defs, env, l[1])
|
var cond = compile(defs, env, l[1])
|
||||||
var tmp_name = str("tmp")
|
var tmp_name = new_tmp()
|
||||||
*defs += "usize " + tmp_name + "; if (" + cond + ") {\n"
|
*defs += "size_t " + tmp_name + "; if (" + cond + ") {\n"
|
||||||
var then = compile(defs, env, l[2])
|
var then = compile(defs, env, l[2])
|
||||||
*defs += tmp_name + " = " + then + ";\n} else {\n"
|
*defs += tmp_name + " = " + then + ";\n} else {\n"
|
||||||
var else_ = compile(defs, env, l[3])
|
var else_ = compile(defs, env, l[3])
|
||||||
|
|||||||
Reference in New Issue
Block a user