From bd83156c1259285386936259a618e483a6c95630 Mon Sep 17 00:00:00 2001 From: Nathan Braswell Date: Mon, 12 Jun 2017 23:52:12 -0400 Subject: [PATCH] work in progress --- stdlib/adt_lower.krak | 4 ++-- stdlib/c_line_control.krak | 2 +- stdlib/ctce_lower.krak | 2 +- stdlib/function_value_lower.krak | 2 +- stdlib/node_counter.krak | 2 +- stdlib/obj_lower.krak | 10 +++++----- stdlib/pass_common.krak | 8 ++++++-- stdlib/ref_lower.krak | 2 +- stdlib/stack.krak | 4 ++++ test_function_value.krak | 7 +++++-- 10 files changed, 27 insertions(+), 16 deletions(-) diff --git a/stdlib/adt_lower.krak b/stdlib/adt_lower.krak index 4c4132c..996ec3d 100644 --- a/stdlib/adt_lower.krak +++ b/stdlib/adt_lower.krak @@ -132,7 +132,7 @@ fun adt_lower(name_ast_map: *map,*ast_node>>, ast_to_ } } } - run_on_tree(helper_before, empty_pass_second_half, syntax_ast_pair.second, &visited1) + run_on_tree(helper_before, empty_pass_second_half(), syntax_ast_pair.second, &visited1) }) name_ast_map->for_each(fun(name: string, syntax_ast_pair: pair<*tree,*ast_node>) { var second_helper = fun(node: *ast_node, parent_chain: *stack<*ast_node>) { @@ -185,7 +185,7 @@ fun adt_lower(name_ast_map: *map,*ast_node>>, ast_to_ } } } - run_on_tree(second_helper, empty_pass_second_half, syntax_ast_pair.second, &visited2) + run_on_tree(second_helper, empty_pass_second_half(), syntax_ast_pair.second, &visited2) }) } diff --git a/stdlib/c_line_control.krak b/stdlib/c_line_control.krak index b089d1b..02b8b7b 100644 --- a/stdlib/c_line_control.krak +++ b/stdlib/c_line_control.krak @@ -29,7 +29,7 @@ fun c_line_control(name_ast_map: *map,*ast_node>>, as /*}*/ /*}*/ /*if (first)*/ - /*run_on_tree(helper, empty_pass_second_half, syntax_ast_pair.second)*/ + /*run_on_tree(helper, empty_pass_second_half(), syntax_ast_pair.second)*/ first = false }) } diff --git a/stdlib/ctce_lower.krak b/stdlib/ctce_lower.krak index 78fa191..bfa4873 100644 --- a/stdlib/ctce_lower.krak +++ b/stdlib/ctce_lower.krak @@ -31,7 +31,7 @@ fun ctce_lower(name_ast_map: *map,*ast_node>>, ast_to } } } - run_on_tree(helper_before, empty_pass_second_half, syntax_ast_pair.second, &visited) + run_on_tree(helper_before, empty_pass_second_half(), syntax_ast_pair.second, &visited) }) ctce_passes.for_each(fun(func: *ast_node) { // don't want to pick up the ast_node::value diff --git a/stdlib/function_value_lower.krak b/stdlib/function_value_lower.krak index 903229d..cf228bd 100644 --- a/stdlib/function_value_lower.krak +++ b/stdlib/function_value_lower.krak @@ -78,7 +78,7 @@ fun function_value_lower(name_ast_map: *map,*ast_node } } } - run_on_tree(helper_before, empty_pass_second_half, syntax_ast_pair.second, &visited) + run_on_tree(helper_before, empty_pass_second_half(), syntax_ast_pair.second, &visited) }) println(string("there are ") + function_value_creation_points.size + " function value creation points in the program.") println(string("there are ") + all_types.size() + " all types in the program.") diff --git a/stdlib/node_counter.krak b/stdlib/node_counter.krak index 746c823..a59467e 100644 --- a/stdlib/node_counter.krak +++ b/stdlib/node_counter.krak @@ -27,7 +27,7 @@ fun node_counter_helper(name_ast_map: *map,*ast_node> var helper = fun(node: *ast_node, parent_chain: *stack<*ast_node>) { counter++ } - run_on_tree(helper, empty_pass_second_half, syntax_ast_pair.second, &visited) + run_on_tree(helper, empty_pass_second_half(), syntax_ast_pair.second, &visited) }) return counter } diff --git a/stdlib/obj_lower.krak b/stdlib/obj_lower.krak index ca66f7c..a522a6e 100644 --- a/stdlib/obj_lower.krak +++ b/stdlib/obj_lower.krak @@ -72,7 +72,7 @@ fun obj_lower(name_ast_map: *map,*ast_node>>, ast_to_ } } } - run_on_tree(ensure_block_and_munge, empty_pass_second_half, syntax_ast_pair.second, &visited1) + run_on_tree(ensure_block_and_munge, empty_pass_second_half(), syntax_ast_pair.second, &visited1) // Pass 2 var short_circut_op: fun(*ast_node,*stack<*ast_node>,*hash_set<*ast_node>): bool = fun(node: *ast_node, parent_chain: *stack<*ast_node>, visited: *hash_set<*ast_node>): bool { match(*node) { @@ -103,15 +103,15 @@ fun obj_lower(name_ast_map: *map,*ast_node>>, ast_to_ add_before_in(short_circuit_if, parent_chain->from_top(enclosing_block_idx-1), parent_chain->from_top(enclosing_block_idx)) replace_with_in(node, short_circuit_result, parent_chain) var shorter_tree = stack_from_vector( parent_chain->data.slice(0, parent_chain->size()-enclosing_block_idx)) - run_on_tree_helper(short_circut_op, empty_pass_second_half, short_circuit_declaration, &shorter_tree, visited) - run_on_tree_helper(short_circut_op, empty_pass_second_half, short_circuit_if, &shorter_tree, visited) + run_on_tree_helper(short_circut_op, empty_pass_second_half(), short_circuit_declaration, &shorter_tree, visited) + run_on_tree_helper(short_circut_op, empty_pass_second_half(), short_circuit_if, &shorter_tree, visited) return false } } } return true } - run_on_tree(short_circut_op, empty_pass_second_half, syntax_ast_pair.second, &visited2) + run_on_tree(short_circut_op, empty_pass_second_half(), syntax_ast_pair.second, &visited2) // Pass 3 var construct_in_destruct_out = fun(node: *ast_node, parent_chain: *stack<*ast_node>) { match(*node) { @@ -204,7 +204,7 @@ fun obj_lower(name_ast_map: *map,*ast_node>>, ast_to_ } } } - run_on_tree(empty_pass_first_half, construct_in_destruct_out, syntax_ast_pair.second, &visited3) + run_on_tree(empty_pass_first_half(), construct_in_destruct_out, syntax_ast_pair.second, &visited3) }) } diff --git a/stdlib/pass_common.krak b/stdlib/pass_common.krak index 8253aef..392cb22 100644 --- a/stdlib/pass_common.krak +++ b/stdlib/pass_common.krak @@ -418,8 +418,12 @@ fun add_after_in(to_add: *ast_node, before: *ast_node, in: *ast_node) { error(string("cannot add_after_in to ") + get_ast_name(in)) } -fun empty_pass_first_half(node: *ast_node, parent_chain: *stack<*ast_node>, visited: *hash_set<*ast_node>): bool { return true; } -fun empty_pass_second_half(node: *ast_node, parent_chain: *stack<*ast_node>) {} +fun empty_pass_first_half(): fun(*ast_node, *stack<*ast_node>, *hash_set<*ast_node>): bool { + return fun(node: *ast_node, parent_chain: *stack<*ast_node>, visited: *hash_set<*ast_node>): bool { return true; } +} +fun empty_pass_second_half(): fun(*ast_node, *stack<*ast_node>): void { + return fun(node: *ast_node, parent_chain: *stack<*ast_node>) {} +} fun run_on_tree(func_before: fun(*ast_node,*stack<*ast_node>):void, func_after: fun(*ast_node,*stack<*ast_node>):void, tree: *ast_node, visited: *hash_set<*ast_node>) run_on_tree(fun(n: *ast_node, s: *stack<*ast_node>, v: *hash_set<*ast_node>): bool {func_before(n, s);return true;}, func_after, tree, visited) diff --git a/stdlib/ref_lower.krak b/stdlib/ref_lower.krak index c3a66ba..c9c76da 100644 --- a/stdlib/ref_lower.krak +++ b/stdlib/ref_lower.krak @@ -74,7 +74,7 @@ fun ref_lower(name_ast_map: *map,*ast_node>>, ast_to_ } } } - run_on_tree(helper_before, empty_pass_second_half, syntax_ast_pair.second, &visited) + run_on_tree(helper_before, empty_pass_second_half(), syntax_ast_pair.second, &visited) }) remove_ref_type_set.for_each(fun(p: pair) { var t = p.second diff --git a/stdlib/stack.krak b/stdlib/stack.krak index d30de54..41cdcb9 100644 --- a/stdlib/stack.krak +++ b/stdlib/stack.krak @@ -89,6 +89,10 @@ obj stack (Object, Serializable) { return i return -1 } + fun item_from_top_satisfying(func_raw: run(T):bool): T { + var temp_lambda = fun(i: T):bool { return func_raw(i); } + return item_from_top_satisfying(temp_lambda); + } fun item_from_top_satisfying(func: fun(T):bool): T { return from_top(index_from_top_satisfying(func)) } diff --git a/test_function_value.krak b/test_function_value.krak index e079ca4..5c0e5d0 100644 --- a/test_function_value.krak +++ b/test_function_value.krak @@ -1,7 +1,10 @@ - +fun call(f: fun(int, int):int):int { + return f(1,2) +} fun main(argc: int, argv: **char): int { var y = 20 var a = fun(i: int, x: int): int { return i+x+y; } - return a(12, 11) + /*return a(12, 11)*/ + return call(a) }