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 = []
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,
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(
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(
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(
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)