Handle arguments to functions
[fur] / transformation.py
index 6f46d43..6aa7080 100644 (file)
@@ -92,14 +92,6 @@ CVariableInitializationStatement = collections.namedtuple(
     ],
 )
 
-CVariableReassignmentStatement = collections.namedtuple(
-    'CVariableReassignmentStatement',
-    [
-        'variable',
-        'expression',
-    ],
-)
-
 CExpressionStatement = collections.namedtuple(
     'CExpressionStatement',
     [
@@ -107,8 +99,8 @@ CExpressionStatement = collections.namedtuple(
     ],
 )
 
-CIfElseStatement = collections.namedtuple(
-    'CIfElseStatement',
+CIfElseExpression = collections.namedtuple(
+    'CIfElseExpression',
     [
         'condition_expression',
         'if_statement_list',
@@ -122,6 +114,7 @@ CFunctionDefinition = collections.namedtuple(
     'CFunctionDefinition',
     [
         'name',
+        'index',
         'argument_name_list',
         'statement_list',
     ],
@@ -192,6 +185,7 @@ CLambdaExpression = collections.namedtuple(
     'CLambdaExpression',
     (
         'name',
+        'index',
     ),
 )
 
@@ -211,24 +205,25 @@ def transform_structure_literal_expression(accumulators, expression):
     )
 
 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)
-
     if expression.name is None:
-        name = '__lambda_{}'.format(accumulators.lambda_number_list[-1])
+        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)
+    return CLambdaExpression(
+        name=name,
+        index=index,
+    )
 
 
 def transform_list_construct_expression(accumulators, expression):
@@ -243,6 +238,7 @@ def transform_list_append_statement(accumulators, expression):
 def transform_expression(accumulators, expression):
     return {
         conversion.CPSFunctionCallExpression: transform_function_call_expression,
+        conversion.CPSIfElseExpression: transform_if_else_expression,
         conversion.CPSIntegerLiteralExpression: transform_integer_literal_expression,
         conversion.CPSLambdaExpression: transform_lambda_expression,
         conversion.CPSListConstructExpression: transform_list_construct_expression,
@@ -282,8 +278,8 @@ def transform_expression_statement(accumulators, statement):
         expression=transform_expression(accumulators, statement.expression),
     )
 
-def transform_if_else_statement(accumulators, statement):
-    return CIfElseStatement(
+def transform_if_else_expression(accumulators, statement):
+    return CIfElseExpression(
         condition_expression=transform_expression(accumulators, statement.condition_expression),
         if_statement_list=tuple(transform_statement(accumulators, s) for s in statement.if_statement_list),
         else_statement_list=tuple(transform_statement(accumulators, s) for s in statement.else_statement_list),
@@ -319,12 +315,6 @@ def transform_variable_initialization_statement(accumulators, statement):
         expression=transform_expression(accumulators, statement.expression),
     )
 
-def transform_variable_reassignment_statement(accumulators, statement):
-    return CVariableReassignmentStatement(
-        variable=statement.variable,
-        expression=transform_expression(accumulators, statement.expression),
-    )
-
 def transform_push_statement(accumulators, statement):
     return CPushStatement(expression=transform_expression(accumulators, statement.expression))
 
@@ -333,12 +323,10 @@ def transform_statement(accumulators, statement):
         conversion.CPSArrayVariableInitializationStatement: transform_array_variable_initialization_statement,
         conversion.CPSAssignmentStatement: transform_symbol_assignment_statement,
         conversion.CPSExpressionStatement: transform_expression_statement,
-        conversion.CPSIfElseStatement: transform_if_else_statement,
         conversion.CPSListAppendStatement: transform_list_append_statement,
         conversion.CPSPushStatement: transform_push_statement,
         conversion.CPSSymbolArrayVariableInitializationStatement: transform_symbol_array_variable_initialization_statement,
         conversion.CPSVariableInitializationStatement: transform_variable_initialization_statement,
-        conversion.CPSVariableReassignmentStatement: transform_variable_reassignment_statement,
     }[type(statement)](accumulators, statement)
 
 
@@ -347,7 +335,7 @@ Accumulators = collections.namedtuple(
     [
         'builtin_set',
         'function_definition_list',
-        'lambda_number_list',
+        'function_name_iterators',
         'operator_set',
         'symbol_list',
         'string_literal_list',
@@ -358,7 +346,7 @@ def transform(program):
     accumulators = Accumulators(
         builtin_set=set(),
         function_definition_list=[],
-        lambda_number_list=[],
+        function_name_iterators={},
         operator_set=set(),
         symbol_list=[],
         string_literal_list=[],