work in progress string interpolation
This commit is contained in:
27
k_prime.krak
27
k_prime.krak
@@ -718,15 +718,18 @@ fun main(argc: int, argv: **char): int {
|
||||
return KPResult::Ok(kpArray(vec(get_value(x[0])) + get_value(x[2]).get_array_rc().get()))
|
||||
})
|
||||
|
||||
grammar.add_to_nonterminal(form, vec(grammar.add_terminal("\\(", kpNil(), ret_nil_term),
|
||||
var call_form = grammar.add_new_nonterminal("call_form", vec(grammar.add_terminal("\\(", kpNil(), ret_nil_term),
|
||||
optional_WS,
|
||||
grammar.add_terminal("\\)", kpNil(), ret_nil_term)), kpNil(), fun(_: ref KPValue, x: ref vec<KPResult>): KPResult { return KPResult::Ok(kpArray(vec<KPValue>())); })
|
||||
grammar.add_to_nonterminal(form, vec(grammar.add_terminal("\\(", kpNil(), ret_nil_term),
|
||||
grammar.add_to_nonterminal(call_form, vec(grammar.add_terminal("\\(", kpNil(), ret_nil_term),
|
||||
optional_WS,
|
||||
space_forms,
|
||||
optional_WS,
|
||||
grammar.add_terminal("\\)", kpNil(), ret_nil_term)), kpNil(), fun(_: ref KPValue, x: ref vec<KPResult>): KPResult { return x[2]; })
|
||||
|
||||
grammar.add_to_nonterminal(form, vec(call_form), kpNil(), fun(_: ref KPValue, x: ref vec<KPResult>): KPResult {
|
||||
return x[0];
|
||||
})
|
||||
grammar.set_start_symbol(form)
|
||||
|
||||
|
||||
@@ -848,16 +851,20 @@ fun main(argc: int, argv: **char): int {
|
||||
if params.size != 1 {
|
||||
return make_pair(null<KPEnv>(), KPResult::Err(kpString(str("Need 1 param to len"))))
|
||||
}
|
||||
if !params[0].is_array() {
|
||||
return make_pair(null<KPEnv>(), KPResult::Err(kpString(str("Called len with not an array"))))
|
||||
if !params[0].is_array() && !params[0].is_string() {
|
||||
return make_pair(null<KPEnv>(), KPResult::Err(kpString(str("Called len with not an array/string ") + pr_str(params[0], true))))
|
||||
}
|
||||
if params[0].is_array() {
|
||||
return make_pair(null<KPEnv>(), KPResult::Ok(kpInt(params[0].get_array_rc().get().size)))
|
||||
} else {
|
||||
return make_pair(null<KPEnv>(), KPResult::Ok(kpInt(params[0].get_string().length())))
|
||||
}
|
||||
return make_pair(null<KPEnv>(), KPResult::Ok(kpInt(params[0].get_array_rc().get().size)))
|
||||
}));
|
||||
env->set(str("idx"), make_builtin_combiner(str("idx"), 1, false, fun(params: vec<KPValue>, dynamic_env: *KPEnv): pair<*KPEnv, KPResult> {
|
||||
if params.size != 2 {
|
||||
return make_pair(null<KPEnv>(), KPResult::Err(kpString(str("Need 2 params to idx"))))
|
||||
}
|
||||
if !params[0].is_array() { return make_pair(null<KPEnv>(), KPResult::Err(kpString(str("Param 1 to idx is not array")))); }
|
||||
if !params[0].is_array() { return make_pair(null<KPEnv>(), KPResult::Err(kpString(str("Param 1 to idx is not array") + pr_str(params[0], true)))); }
|
||||
if !params[1].is_int() { return make_pair(null<KPEnv>(), KPResult::Err(kpString(str("Param 2 to idx is not int")))); }
|
||||
|
||||
var index = params[1].get_int()
|
||||
@@ -882,13 +889,17 @@ fun main(argc: int, argv: **char): int {
|
||||
if params.size != 3 {
|
||||
return make_pair(null<KPEnv>(), KPResult::Err(kpString(str("Need 3 params to slice"))))
|
||||
}
|
||||
if !params[0].is_array() { return make_pair(null<KPEnv>(), KPResult::Err(kpString(str("first param to slice is not array")))); }
|
||||
if !params[0].is_array() && !params[0].is_string() { return make_pair(null<KPEnv>(), KPResult::Err(kpString(str("first param to slice is not string or array")))); }
|
||||
if !params[1].is_int() { return make_pair(null<KPEnv>(), KPResult::Err(kpString(str("second param to slice is not int")))); }
|
||||
var start = params[1].get_int();
|
||||
if !params[2].is_int() { return make_pair(null<KPEnv>(), KPResult::Err(kpString(str("third param to slice is not int")))); }
|
||||
var end = params[2].get_int();
|
||||
|
||||
return make_pair(null<KPEnv>(), KPResult::Ok(kpArray(params[0].get_array_rc().get().slice(start, end))))
|
||||
if params[0].is_array() {
|
||||
return make_pair(null<KPEnv>(), KPResult::Ok(kpArray(params[0].get_array_rc().get().slice(start, end))))
|
||||
} else {
|
||||
return make_pair(null<KPEnv>(), KPResult::Ok(kpString(params[0].get_string().slice(start, end))))
|
||||
}
|
||||
}));
|
||||
|
||||
env->set(str("+"), make_builtin_combiner(str("+"), 1, false, fun(params: vec<KPValue>, dynamic_env: *KPEnv): pair<*KPEnv, KPResult> {
|
||||
|
||||
Reference in New Issue
Block a user