Fix the quoting compile

This commit is contained in:
Nathan Braswell
2020-04-20 01:22:45 -04:00
parent d726705845
commit 19ae75b819
2 changed files with 25 additions and 9 deletions

4
bf.kp
View File

@@ -78,9 +78,11 @@
(def! test (fn* [] (let* (
;(l (list 3 4 5))
a 5
l '(a 4 5)
;l '(a 4 5)
;l (vector 3 4 5)
;l [a 4 5]
l '[3 4 5]
;l '[a 4 5]
)
(nth l 0))))
(def! main (fn* [] (let* (it (test)) (do (println it) it))))

View File

@@ -1674,7 +1674,7 @@ fun find_closed_vars(defined: set<str>, env: *Env, ast: MalValue): set<str> {
}
error("Can't get clsoure_vars for " + pr_str(ast, true))
}
fun compile_value(top_decs: *str, top_defs: *str, main_init: *str, defs: *str, env: *Env, ast: MalValue): str {
fun compile_value(top_decs: *str, top_defs: *str, main_init: *str, defs: *str, env: *Env, ast: MalValue, quoted: bool): str {
match (ast) {
MalValue::List(l) {
var call_str = str("_list_impl(NULL, ") + l.size + ", (size_t[]){ "
@@ -1682,8 +1682,12 @@ fun compile_value(top_decs: *str, top_defs: *str, main_init: *str, defs: *str, e
if i != 0 {
call_str += ", "
}
if quoted {
call_str += compile_value(top_decs, top_defs, main_init, defs, env, l[i], true)
} else {
call_str += compile(top_decs, top_defs, main_init, defs, env, l[i])
}
}
return call_str + "})"
}
MalValue::Vector(l) {
@@ -1692,11 +1696,18 @@ fun compile_value(top_decs: *str, top_defs: *str, main_init: *str, defs: *str, e
if i != 0 {
call_str += ", "
}
if quoted {
call_str += compile_value(top_decs, top_defs, main_init, defs, env, l[i], true)
} else {
call_str += compile(top_decs, top_defs, main_init, defs, env, l[i])
}
}
return call_str + "})"
}
MalValue::Symbol(s) {
if quoted {
error("cannot compile symbols yet")
}
if (s == "+") {
return str("((((size_t)&_plus_closure)<<3)|0x6)")
} else if (s == "-") {
@@ -1753,6 +1764,9 @@ fun compile_value(top_decs: *str, top_defs: *str, main_init: *str, defs: *str, e
return str("0x1F")
}
MalValue::Function(f) {
if quoted {
error("cannot compile quoted function - does this even make sense?")
}
var fun_name = "fun_" + new_tmp()
*top_decs += "size_t " + fun_name + "(size_t*, size_t, size_t*);\n"
@@ -1794,12 +1808,12 @@ fun compile(top_decs: *str, top_defs: *str, main_init: *str, defs: *str, env: *E
}
ast = get_value(expanded)
if !is_list(ast) {
return compile_value(top_decs, top_defs, main_init, defs, env, ast)
return compile_value(top_decs, top_defs, main_init, defs, env, ast, false)
}
match (ast) {
MalValue::List(l) {
if (l.size == 0) {
return compile_value(top_decs, top_defs, main_init, defs, env, ast)
return compile_value(top_decs, top_defs, main_init, defs, env, ast, false)
} else if (is_symbol(l[0], "def!")) {
if (l.size != 3) {
error("def! without exaclty key and value")
@@ -1860,12 +1874,12 @@ fun compile(top_decs: *str, top_defs: *str, main_init: *str, defs: *str, env: *E
return tmp_name
} else if (is_symbol(l[0], "fn*")) {
var f = EVAL(env, ast)
return compile_value(top_decs, top_defs, main_init, defs, env, get_value(f))
return compile_value(top_decs, top_defs, main_init, defs, env, get_value(f), false)
} else if (is_symbol(l[0], "quote")) {
if l.size == 1 {
error("compile quote with no arguments")
}
return compile_value(top_decs, top_defs, main_init, defs, env, l[1])
return compile_value(top_decs, top_defs, main_init, defs, env, l[1], true)
} else if (is_symbol(l[0], "quasiquote")) {
if l.size == 1 {
error("compile quasiquote with no arguments")
@@ -1905,5 +1919,5 @@ fun compile(top_decs: *str, top_defs: *str, main_init: *str, defs: *str, env: *E
}
}
}
return compile_value(top_decs, top_defs, main_init, defs, env, ast)
return compile_value(top_decs, top_defs, main_init, defs, env, ast, false)
}