Remove dead namedtuple
[fur] / crossplatform_ir_generation.py
index 332a74f..7f8a6ec 100644 (file)
@@ -60,16 +60,18 @@ def generate_integer_literal_expression(counters, expression):
 
     return referenced_entry_list, instruction_list
 
+def escape_name(name):
+    return name.replace('$','$$').replace('_','$')
+
 def generate_lambda_expression(counters, expression):
-    if expression.name is None or 'lambda' in expression.name.lower():
-        import ipdb; ipdb.set_trace()
+    if expression.name is None:
+        name = '__lambda__'
+    else:
+        name = escape_name(expression.name)
 
-    name_counter = counters.get(expression.name, 0)
+    name_counter = counters.get(name, 0)
     counters[expression.name] = name_counter + 1
-    label = '{}${}'.format(expression.name, name_counter)
-
-    for argument_name in expression.argument_name_list:
-        import ipdb; ipdb.set_trace()
+    label = '{}${}'.format(name, name_counter)
 
     referenced_entry_list_list = []
     instruction_list_list = []
@@ -79,9 +81,16 @@ def generate_lambda_expression(counters, expression):
         referenced_entry_list_list.append(referenced_entry_list)
         instruction_list_list.append(instruction_list)
 
+    # Pop from the stack in reversed order, because arguments were pushed onto
+    # the stack in order
+    argument_bindings = tuple(
+        CIRInstruction(instruction='pop', argument='sym({})'.format(arg))
+        for arg in reversed(expression.argument_name_list)
+    )
+
     lambda_body = flatten(instruction_list_list)
     assert lambda_body[-1].instruction == 'drop'
-    lambda_body = lambda_body[:-1] + (CIRInstruction(instruction='return', argument=None),)
+    lambda_body = argument_bindings + lambda_body[:-1] + (CIRInstruction(instruction='return', argument=None),)
 
     referenced_entry_list_list.append(
         (CIRLabel(label=label),) + lambda_body,
@@ -93,6 +102,14 @@ def generate_lambda_expression(counters, expression):
 
     return flatten(referenced_entry_list_list), instruction_list
 
+def generate_list_construct_expression(counters, expression):
+    referenced_entry_list = ()
+    instruction_list = (CIRInstruction(
+        instruction='list',
+        argument=2,
+    ),)
+    return referenced_entry_list, instruction_list
+
 def generate_string_literal_expression(counters, expression):
     referenced_entry_list = ()
     instruction_list = (CIRInstruction(
@@ -102,6 +119,15 @@ def generate_string_literal_expression(counters, expression):
 
     return referenced_entry_list, instruction_list
 
+def generate_structure_literal_expression(counters, expression):
+    referenced_entry_list = ()
+    instruction_list = (CIRInstruction(
+        instruction='structure',
+        argument=expression.field_count,
+    ),)
+
+    return referenced_entry_list, instruction_list
+
 def generate_symbol_expression(counters, expression):
     referenced_entry_list = ()
     instruction_list = (CIRInstruction(
@@ -111,6 +137,15 @@ def generate_symbol_expression(counters, expression):
 
     return referenced_entry_list, instruction_list
 
+def generate_symbol_literal_expression(counters, expression):
+    referenced_entry_list = ()
+    instruction_list = (CIRInstruction(
+        instruction='push_value',
+        argument=generate_symbol_literal(expression.symbol),
+    ),)
+
+    return referenced_entry_list, instruction_list
+
 def generate_variable_expression(counters, expression):
     referenced_entry_list = ()
     instruction_list = (CIRInstruction(
@@ -126,8 +161,11 @@ def generate_expression(counters, expression):
         conversion.CPSIfElseExpression: generate_if_else_expression,
         conversion.CPSIntegerLiteralExpression: generate_integer_literal_expression,
         conversion.CPSLambdaExpression: generate_lambda_expression,
+        conversion.CPSListConstructExpression: generate_list_construct_expression,
         conversion.CPSStringLiteralExpression: generate_string_literal_expression,
+        conversion.CPSStructureLiteralExpression: generate_structure_literal_expression,
         conversion.CPSSymbolExpression: generate_symbol_expression,
+        conversion.CPSSymbolLiteralExpression: generate_symbol_literal_expression,
         conversion.CPSVariableExpression: generate_variable_expression,
     }[type(expression)](counters, expression)