X-Git-Url: https://code.kerkeslager.com/?p=fur;a=blobdiff_plain;f=desugaring.py;h=f3c7728844f4e3087412f3f933e9e34ea8c5313e;hp=e671e04c2c3292eaaa3f88e7da790801f51f12a9;hb=d70666abc2db430300d48691046ada2395b2f0d5;hpb=3a076cfd2c46c9f3b51815facd613445722a340b diff --git a/desugaring.py b/desugaring.py index e671e04..f3c7728 100644 --- a/desugaring.py +++ b/desugaring.py @@ -2,6 +2,14 @@ import collections import parsing +DesugaredBuiltinExpression = collections.namedtuple( + 'DesugaredBuiltinExpression', + ( + 'metadata', + 'symbol', + ), +) + DesugaredFunctionCallExpression = collections.namedtuple( 'DesugaredFunctionCallExpression', ( @@ -27,6 +35,22 @@ DesugaredIntegerLiteralExpression = collections.namedtuple( ), ) +_DesugaredLambdaExpression = collections.namedtuple( + 'DesugaredLambdaExpression', + ( + 'name', + 'argument_name_list', + 'statement_list', + ), +) + +class DesugaredLambdaExpression(_DesugaredLambdaExpression): + def __new__(cls, *args, **kwargs): + if 'name' not in kwargs: + kwargs['name'] = None + + return super(DesugaredLambdaExpression, cls).__new__(cls, *args, **kwargs) + DesugaredListLiteralExpression = collections.namedtuple( 'DesugaredListLiteralExpression', ( @@ -64,6 +88,14 @@ DesugaredSymbolExpression = collections.namedtuple( ), ) +DesugaredSymbolLiteralExpression = collections.namedtuple( + 'DesugaredSymbolLiteralExpression', + ( + 'metadata', + 'symbol', + ), +) + DesugaredAssignmentStatement = collections.namedtuple( 'DesugaredAssignmentStatement', ( @@ -79,15 +111,6 @@ DesugaredExpressionStatement = collections.namedtuple( ), ) -DesugaredFunctionDefinitionStatement = collections.namedtuple( - 'DesugaredFunctionDefinitionStatement', - ( - 'name', - 'argument_name_list', - 'statement_list', - ), -) - DesugaredProgram = collections.namedtuple( 'DesugaredProgram', ( @@ -145,13 +168,13 @@ def desugar_infix_expression(expression): if expression.operator == '.': return DesugaredFunctionCallExpression( metadata=expression.metadata, - function=DesugaredSymbolExpression( + function=DesugaredBuiltinExpression( metadata=expression.metadata, symbol='__field__', ), argument_list=( desugar_expression(expression.left), - DesugaredStringLiteralExpression(string=expression.right.symbol), + desugar_symbol_literal_expression(expression.right), ), ) @@ -172,7 +195,7 @@ def desugar_infix_expression(expression): return DesugaredFunctionCallExpression( metadata=expression.metadata, - function=DesugaredSymbolExpression( + function=DesugaredBuiltinExpression( metadata=expression.metadata, symbol=function, ), @@ -187,10 +210,16 @@ def desugar_integer_literal_expression(expression): integer=expression.integer, ) +def desugar_lambda_expression(expression): + return DesugaredLambdaExpression( + argument_name_list=expression.argument_name_list, + statement_list=tuple(desugar_statement(s) for s in expression.statement_list), + ) + def desugar_list_item_expression(expression): return DesugaredFunctionCallExpression( metadata=expression.metadata, - function=DesugaredSymbolExpression( + function=DesugaredBuiltinExpression( metadata=expression.metadata, symbol='__get__', ), @@ -208,7 +237,7 @@ def desugar_list_literal_expression(expression): def desugar_negation_expression(expression): return DesugaredFunctionCallExpression( metadata=expression.metadata, - function=DesugaredSymbolExpression( + function=DesugaredBuiltinExpression( metadata=expression.metadata, symbol='__negate__', ), @@ -238,12 +267,19 @@ def desugar_symbol_expression(expression): symbol=expression.symbol, ) +def desugar_symbol_literal_expression(expression): + return DesugaredSymbolLiteralExpression( + metadata=expression.metadata, + symbol=expression.symbol, + ) + def desugar_expression(expression): return { parsing.FurFunctionCallExpression: desugar_function_call_expression, parsing.FurIfExpression: desugar_if_expression, parsing.FurInfixExpression: desugar_infix_expression, parsing.FurIntegerLiteralExpression: desugar_integer_literal_expression, + parsing.FurLambdaExpression: desugar_lambda_expression, parsing.FurListItemExpression: desugar_list_item_expression, parsing.FurListLiteralExpression: desugar_list_literal_expression, parsing.FurNegationExpression: desugar_negation_expression, @@ -264,10 +300,13 @@ def desugar_expression_statement(statement): ) def desugar_function_definition_statement(statement): - return DesugaredFunctionDefinitionStatement( - name=statement.name, - argument_name_list=statement.argument_name_list, - statement_list=tuple(desugar_statement(s) for s in statement.statement_list), + return DesugaredAssignmentStatement( + target=statement.name, + expression=DesugaredLambdaExpression( + name=statement.name, + argument_name_list=statement.argument_name_list, + statement_list=tuple(desugar_statement(s) for s in statement.statement_list), + ), ) def desugar_statement(statement):