diff --git a/stdlib/ast_transformation.krak b/stdlib/ast_transformation.krak index 2b5ad0a..0962667 100644 --- a/stdlib/ast_transformation.krak +++ b/stdlib/ast_transformation.krak @@ -370,7 +370,9 @@ obj ast_transformation (Object) { } match (searching_for) { search_type::none() return identifier_lookup(name, scope) - search_type::function(type_vec) return function_lookup(name, scope, type_vec) + search_type::function(type_vec) { + return function_lookup(name, scope, type_vec) + } } println("FAILED SEARCH FOR") return null() @@ -378,7 +380,7 @@ obj ast_transformation (Object) { fun transform_value(node: *tree, scope: *ast_node): *ast_node { var value_str = concat_symbol_tree(node) var value_type = null() - if (value_str[0] == '"') + if (value_str[0] == '"') // " // Comment hack for emacs now value_type = type_ptr(base_type::character(), 1) else if (value_str[0] == '\'') //'// lol, comment hack for vim syntax highlighting (my fault, of course) value_type = type_ptr(base_type::character()) @@ -535,13 +537,13 @@ obj ast_transformation (Object) { var func_name = string() var parameters = vector<*ast_node>() if (node->children.size == 1) { - var possible_func = transform(node->children[0], scope, searching_for, template_replacements) - if (!possible_func) match (searching_for) { - search_type::function(type_vec) possible_func = find_or_instantiate_template_function(node->children[0], null>(), scope, type_vec, template_replacements, map()); + var possible_value = transform(node->children[0], scope, searching_for, template_replacements) + if (!possible_value) match (searching_for) { + search_type::function(type_vec) possible_value = find_or_instantiate_template_function(node->children[0], null>(), scope, type_vec, template_replacements, map()); } - if (!possible_func) + if (!possible_value) println(concat_symbol_tree(node) + ": HAS NO POSSIBLE FUNCTION OR FUNCTION TEMPLATE SOLUTIONS") - return possible_func + return possible_value } else if (node->children.size == 2) { var template_inst = get_node("template_inst", node) if (template_inst) { @@ -759,7 +761,7 @@ fun function_lookup(name: string, scope: *ast_node, param_types: vector<*type>): var results = scope_lookup(name, scope) print(results.size); println(" number of results") for (var i = 0; i < results.size; i++;) { - if (is_function(results[i]) && function_satisfies_params(results[i], param_types)) { + if ((is_function(results[i]) || is_identifier(results[i])) && function_satisfies_params(results[i], param_types)) { return results[i] } } diff --git a/stdlib/c_generator.krak b/stdlib/c_generator.krak index bfcc020..55cf321 100644 --- a/stdlib/c_generator.krak +++ b/stdlib/c_generator.krak @@ -76,6 +76,7 @@ obj code_triple (Object) { obj c_generator (Object) { var id_counter: int var ast_name_map: map<*ast_node, string> + var function_typedef_string: string fun construct(): *c_generator { id_counter = 0 ast_name_map.construct() @@ -100,8 +101,7 @@ obj c_generator (Object) { var top_level_c_passthrough: string = "" var variable_extern_declarations: string = "" var structs: string = "\n/**Type Structs**/\n" - var function_typedef_string_pre: string = "" - var function_typedef_string: string = "" + function_typedef_string.construct() var function_prototypes: string = "\n/**Function Prototypes**/\n" var function_definitions: string = "\n/**Function Definitions**/\n" var variable_declarations: string = "\n/**Variable Declarations**/\n" @@ -199,7 +199,7 @@ obj c_generator (Object) { }) }) - return make_pair(prequal+plain_typedefs+top_level_c_passthrough+variable_extern_declarations+structs+function_typedef_string_pre+function_typedef_string+function_prototypes+variable_declarations+function_definitions + "\n", linker_string) + return make_pair(prequal+plain_typedefs+top_level_c_passthrough+variable_extern_declarations+structs+function_typedef_string+function_prototypes+variable_declarations+function_definitions + "\n", linker_string) } fun generate_if_comp(node: *ast_node, enclosing_object: *ast_node, defer_stack: *stack>>): code_triple { if (node->if_comp.wanted_generator == "__C__") @@ -508,9 +508,18 @@ obj c_generator (Object) { return get_name(type->type_def) + indirection } base_type::function() { - var temp = indirection + string("function: (") - type->parameter_types.for_each(fun(parameter_type: *type) temp += parameter_type->to_string() + " ";) - return temp + ")" + type->return_type->to_string() + var temp_name = string("temp") + get_id() + var temp = temp_name + ")(" + var first = true + type->parameter_types.for_each(fun(parameter_type: *type) { + if (!first) { + temp += ", " + } + first = false + temp += type_to_c(parameter_type) + " " + }) + function_typedef_string += string("typedef ") + type_to_c(type->return_type) + " (*" + temp + ");" + return temp_name + indirection } } return string("impossible type") + indirection diff --git a/tests/test_map.krak b/tests/test_map.krak index 0dd039d..a6bbfc6 100644 --- a/tests/test_map.krak +++ b/tests/test_map.krak @@ -1,7 +1,7 @@ import io:* import map:* -fun main():int { +fun main(): int { var m = map(3,1) m.set(2,2) m.set(1,3) diff --git a/tests/to_parse.krak b/tests/to_parse.krak index 1bc3dfb..dfa28f2 100644 --- a/tests/to_parse.krak +++ b/tests/to_parse.krak @@ -1,29 +1,12 @@ import simple_print: * - -obj SimpleContainer { - var data: T - fun print_data() { - var indirection: T - indirection = data - println(indirection) - } - fun with_other(other: U) { - var indirection: U - indirection = other - println(data) - println(other) - } - fun return_as(): U { - var indirection: T - indirection = data - return data - } - fun construct(dataIn: T) data = dataIn +fun print_and_return(data: int): int { + println(data) + return data } fun main(): int { - var it: SimpleContainer - it.data = 8 - it.with_other("Wooo object template") - println(it.return_as()) + var v = print_and_return + println(v(7)) + // println(print_and_return(7)) + return 0 }