X-Git-Url: https://code.kerkeslager.com/?p=fur;a=blobdiff_plain;f=transformation.py;h=a9cad95b600141efa33a873942f1f06f54f0cb95;hp=e5a1bd52368eb16cf4f2b57d3acc249584f93774;hb=37d4a702fda63b87c1482a59b2ef4c1bba2e3696;hpb=521bb843144e1c835f9eeff8172eea580ef02c4d diff --git a/transformation.py b/transformation.py index e5a1bd5..a9cad95 100644 --- a/transformation.py +++ b/transformation.py @@ -116,19 +116,13 @@ CIfElseStatement = collections.namedtuple( ], ) -CFunctionDeclaration = collections.namedtuple( - 'CFunctionDeclaration', - [ - 'name', - ], -) - # TODO If a function definition doesn't end with an expression, we have issues currently because we try to return statement. # TODO Closures currently wrap entire defining environment, even symbols that are not used, which makes garbage collection ineffective. CFunctionDefinition = collections.namedtuple( 'CFunctionDefinition', [ 'name', + 'index', 'argument_name_list', 'statement_list', ], @@ -190,17 +184,25 @@ def transform_integer_literal_expression(accumulators, expression): CListConstructExpression = collections.namedtuple( 'CListConstructExpression', - [ + ( 'allocate', - ], + ), +) + +CLambdaExpression = collections.namedtuple( + 'CLambdaExpression', + ( + 'name', + 'index', + ), ) CListAppendStatement = collections.namedtuple( 'CListAppendStatement', - [ + ( 'list_expression', 'item_expression', - ], + ), ) def transform_structure_literal_expression(accumulators, expression): @@ -210,6 +212,28 @@ def transform_structure_literal_expression(accumulators, expression): value_list_variable=expression.value_list_variable, ) +def transform_lambda_expression(accumulators, expression): + if expression.name is None: + name = '__lambda' + else: + name = expression.name + + index = accumulators.function_name_iterators.get(name, 0) + accumulators.function_name_iterators[name] = index + 1 + + accumulators.function_definition_list.append(CFunctionDefinition( + name=name, + index=index, + argument_name_list=expression.argument_name_list, + statement_list=tuple(transform_statement(accumulators, s) for s in expression.statement_list), + )) + + return CLambdaExpression( + name=name, + index=index, + ) + + def transform_list_construct_expression(accumulators, expression): return CListConstructExpression(allocate=expression.allocate) @@ -223,6 +247,7 @@ def transform_expression(accumulators, expression): return { conversion.CPSFunctionCallExpression: transform_function_call_expression, conversion.CPSIntegerLiteralExpression: transform_integer_literal_expression, + conversion.CPSLambdaExpression: transform_lambda_expression, conversion.CPSListConstructExpression: transform_list_construct_expression, conversion.CPSStructureLiteralExpression: transform_structure_literal_expression, conversion.CPSStringLiteralExpression: transform_string_literal_expression, @@ -303,20 +328,6 @@ def transform_variable_reassignment_statement(accumulators, statement): expression=transform_expression(accumulators, statement.expression), ) -def transform_function_definition_statement(accumulators, statement): - # TODO Allow defining the same function in different contexts - if any(fd.name == statement.name for fd in accumulators.function_definition_list): - raise Exception('A function with name "{}" already exists'.format(statement.name)) - - # TODO Add argument names to the symbol table - accumulators.function_definition_list.append(CFunctionDefinition( - name=statement.name, - argument_name_list=statement.argument_name_list, - statement_list=tuple(transform_statement(accumulators, s) for s in statement.statement_list) - )) - - return CFunctionDeclaration(name=statement.name) - def transform_push_statement(accumulators, statement): return CPushStatement(expression=transform_expression(accumulators, statement.expression)) @@ -325,7 +336,6 @@ def transform_statement(accumulators, statement): conversion.CPSArrayVariableInitializationStatement: transform_array_variable_initialization_statement, conversion.CPSAssignmentStatement: transform_symbol_assignment_statement, conversion.CPSExpressionStatement: transform_expression_statement, - conversion.CPSFunctionDefinitionStatement: transform_function_definition_statement, conversion.CPSIfElseStatement: transform_if_else_statement, conversion.CPSListAppendStatement: transform_list_append_statement, conversion.CPSPushStatement: transform_push_statement, @@ -340,6 +350,7 @@ Accumulators = collections.namedtuple( [ 'builtin_set', 'function_definition_list', + 'function_name_iterators', 'operator_set', 'symbol_list', 'string_literal_list', @@ -350,6 +361,7 @@ def transform(program): accumulators = Accumulators( builtin_set=set(), function_definition_list=[], + function_name_iterators={}, operator_set=set(), symbol_list=[], string_literal_list=[],