From 34f11b0874bdae6370810466b888880a3942074e Mon Sep 17 00:00:00 2001 From: Nathan Braswell Date: Sun, 21 Feb 2016 17:22:16 -0500 Subject: [PATCH] Plain lambdas implemented, but not fully tested. No closures yet --- stdlib/ast_nodes.krak | 8 ++++++-- stdlib/ast_transformation.krak | 14 +++++++++++++- stdlib/c_generator.krak | 2 +- tests/to_parse.krak | 9 ++++----- 4 files changed, 24 insertions(+), 9 deletions(-) diff --git a/stdlib/ast_nodes.krak b/stdlib/ast_nodes.krak index 1295318..2b620e7 100644 --- a/stdlib/ast_nodes.krak +++ b/stdlib/ast_nodes.krak @@ -64,21 +64,25 @@ fun is_translation_unit(node: *ast_node): bool { obj translation_unit (Object) { var scope: map> var children: vector<*ast_node> + var lambdas: vector<*ast_node> var name: string fun construct(nameIn: string): *translation_unit { scope.construct() children.construct() + lambdas.construct() name.copy_construct(&nameIn) return this } fun copy_construct(old: *translation_unit) { scope.copy_construct(&old->scope) children.copy_construct(&old->children) + lambdas.copy_construct(&old->lambdas) name.copy_construct(&old->name) } fun destruct() { scope.destruct() children.destruct() + lambdas.destruct() name.destruct() } fun operator=(other: ref translation_unit) { @@ -86,7 +90,7 @@ obj translation_unit (Object) { copy_construct(&other) } fun operator==(other: ref translation_unit): bool { - return children == other.children && name == other.name + return children == other.children && name == other.name && lambdas == other.lambdas } } fun ast_import_ptr(name: string, translation_unit: *ast_node): *ast_node { @@ -959,7 +963,7 @@ obj value (Object) { fun get_ast_children(node: *ast_node): vector<*ast_node> { match (*node) { - ast_node::translation_unit(backing) return backing.children + ast_node::translation_unit(backing) return backing.children + backing.lambdas ast_node::import(backing) return vector<*ast_node>() ast_node::identifier(backing) return vector<*ast_node>() ast_node::type_def(backing) return backing.variables + backing.methods diff --git a/stdlib/ast_transformation.krak b/stdlib/ast_transformation.krak index 705726e..004c4e2 100644 --- a/stdlib/ast_transformation.krak +++ b/stdlib/ast_transformation.krak @@ -139,7 +139,10 @@ obj ast_transformation (Object) { }) } fun second_pass_function(node: *tree, scope: *ast_node, template_replacements: map, do_raw_template: bool): *ast_node { - var function_name = concat_symbol_tree(get_node("func_identifier", node)) + var func_identifier_node = get_node("func_identifier", node) + var function_name = string("lambda") + if (func_identifier_node) + function_name = concat_symbol_tree(func_identifier_node) var template_dec = get_node("template_dec", node) if (do_raw_template && template_dec) { var template_types = vector() @@ -342,6 +345,8 @@ obj ast_transformation (Object) { return transform_defer_statement(node, scope, template_replacements) } else if (name == "function_call") { return transform_function_call(node, scope, template_replacements) + } else if (name == "lambda") { + return transform_lambda(node, scope, template_replacements) } else if (name == "boolean_expression" || name == "and_boolean_expression" || name == "bool_exp" || name == "expression" || name == "shiftand" || name == "term" @@ -533,6 +538,13 @@ obj ast_transformation (Object) { f->function_call.parameters.for_each(fun(param: *ast_node) print(param);) return f } + fun transform_lambda(node: *tree, scope: *ast_node, template_replacements: map): *ast_node { + var function_node = second_pass_function(node, scope, template_replacements, false) + function_node->function.body_statement = transform_statement(get_node("statement", node), function_node, template_replacements) + while (!is_translation_unit(scope)) scope = get_ast_scope(scope)->get(string("~enclosing_scope"))[0] + scope->translation_unit.lambdas.add(function_node) + return function_node + } fun transform_expression(node: *tree, scope: *ast_node, template_replacements: map): *ast_node return transform_expression(node, scope, search_type::none(), template_replacements) fun transform_expression(node: *tree, scope: *ast_node, searching_for: search_type, template_replacements: map): *ast_node { var func_name = string() diff --git a/stdlib/c_generator.krak b/stdlib/c_generator.krak index 55cf321..ee193f5 100644 --- a/stdlib/c_generator.krak +++ b/stdlib/c_generator.krak @@ -144,7 +144,7 @@ obj c_generator (Object) { name_ast_map.for_each(fun(name: string, tree_pair: pair<*tree,*ast_node>) { // iterate through children for each ast // assert translation_unit? - tree_pair.second->translation_unit.children.for_each(fun(child: *ast_node) { + (tree_pair.second->translation_unit.children + tree_pair.second->translation_unit.lambdas).for_each(fun(child: *ast_node) { match (*child) { // should really check the genrator ast_node::if_comp(backing) { diff --git a/tests/to_parse.krak b/tests/to_parse.krak index 9e6b0b8..27f1fa6 100644 --- a/tests/to_parse.krak +++ b/tests/to_parse.krak @@ -1,11 +1,10 @@ import simple_print: * -fun print_and_return(data: int): int { - println(data) - return data -} fun main(): int { var v: fun(int):int - v = print_and_return + v = fun(data: int): int { + println(data) + return data + } println(v(7)) // println(print_and_return(7)) return 0