X-Git-Url: https://code.kerkeslager.com/?p=fur;a=blobdiff_plain;f=transformation.py;h=e8ee51c9bab31edc1a60c0d4dbb841d95baefa67;hp=56b61f323c50faefb541308899a35dbf5164bc96;hb=aa339c441f43849a8cae256aa130278ca7618b7e;hpb=68eb624cc15463008b9ed38e17315e9a1f8bdeb0 diff --git a/transformation.py b/transformation.py index 56b61f3..e8ee51c 100644 --- a/transformation.py +++ b/transformation.py @@ -1,7 +1,6 @@ import collections import conversion -import normalization CIntegerLiteral = collections.namedtuple( 'CIntegerLiteral', @@ -191,25 +190,24 @@ def transform_integer_literal_expression(accumulators, expression): CListConstructExpression = collections.namedtuple( 'CListConstructExpression', - [ + ( 'allocate', - ], + ), +) + +CLambdaExpression = collections.namedtuple( + 'CLambdaExpression', + ( + 'name', + ), ) CListAppendStatement = collections.namedtuple( 'CListAppendStatement', - [ + ( 'list_expression', 'item_expression', - ], -) - -CListGetExpression = collections.namedtuple( - 'CListGetExpression', - [ - 'list_expression', - 'index_expression', - ], + ), ) def transform_structure_literal_expression(accumulators, expression): @@ -219,15 +217,27 @@ def transform_structure_literal_expression(accumulators, expression): value_list_variable=expression.value_list_variable, ) +def transform_lambda_expression(accumulators, expression): + # TODO This function feels hacky + if len(accumulators.lambda_number_list) == 0: + accumulators.lambda_number_list.append(0) + else: + accumulators.lambda_number_list.append(accumulators.lambda_number_list[-1] + 1) + + name = '__lambda_{}'.format(accumulators.lambda_number_list[-1]) + + accumulators.function_definition_list.append(CFunctionDefinition( + name=name, + argument_name_list=expression.argument_name_list, + statement_list=tuple(transform_statement(accumulators, s) for s in expression.statement_list), + )) + + return CLambdaExpression(name=name) + + def transform_list_construct_expression(accumulators, expression): return CListConstructExpression(allocate=expression.allocate) -def transform_list_get_expression(accumulators, expression): - return CListGetExpression( - list_expression=transform_expression(accumulators, expression.list_expression), - index_expression=transform_expression(accumulators, expression.index_expression), - ) - def transform_list_append_statement(accumulators, expression): return CListAppendStatement( list_expression=transform_expression(accumulators, expression.list_expression), @@ -238,8 +248,8 @@ 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, - normalization.NormalListGetExpression: transform_list_get_expression, conversion.CPSStructureLiteralExpression: transform_structure_literal_expression, conversion.CPSStringLiteralExpression: transform_string_literal_expression, conversion.CPSSymbolExpression: transform_symbol_expression, @@ -356,6 +366,7 @@ Accumulators = collections.namedtuple( [ 'builtin_set', 'function_definition_list', + 'lambda_number_list', 'operator_set', 'symbol_list', 'string_literal_list', @@ -366,6 +377,7 @@ def transform(program): accumulators = Accumulators( builtin_set=set(), function_definition_list=[], + lambda_number_list=[], operator_set=set(), symbol_list=[], string_literal_list=[],