+def transform_integer_literal_expression(accumulators, expression):
+ return CIntegerLiteral(value=expression.integer)
+
+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):
+ return CStructureLiteralExpression(
+ field_count=expression.field_count,
+ symbol_list_variable=expression.symbol_list_variable,
+ 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)
+
+def transform_list_append_statement(accumulators, expression):
+ return CListAppendStatement(
+ list_expression=transform_expression(accumulators, expression.list_expression),
+ item_expression=transform_expression(accumulators, expression.item_expression),
+ )
+
+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,
+ conversion.CPSSymbolExpression: transform_symbol_expression,
+ conversion.CPSVariableExpression: transform_variable_expression,
+ }[type(expression)](accumulators, expression)
+
+def transform_symbol_assignment_statement(accumulators, assignment_statement):