X-Git-Url: https://code.kerkeslager.com/?p=fur;a=blobdiff_plain;f=desugaring.py;h=28d1a7820748b4ae463d1dc2b8aab73e3f47cdd7;hp=e671e04c2c3292eaaa3f88e7da790801f51f12a9;hb=3dc627f8d6b5846081ef8ed15d5546e51d2ecb8d;hpb=3a076cfd2c46c9f3b51815facd613445722a340b diff --git a/desugaring.py b/desugaring.py index e671e04..28d1a78 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', ( @@ -79,15 +103,6 @@ DesugaredExpressionStatement = collections.namedtuple( ), ) -DesugaredFunctionDefinitionStatement = collections.namedtuple( - 'DesugaredFunctionDefinitionStatement', - ( - 'name', - 'argument_name_list', - 'statement_list', - ), -) - DesugaredProgram = collections.namedtuple( 'DesugaredProgram', ( @@ -172,7 +187,7 @@ def desugar_infix_expression(expression): return DesugaredFunctionCallExpression( metadata=expression.metadata, - function=DesugaredSymbolExpression( + function=DesugaredBuiltinExpression( metadata=expression.metadata, symbol=function, ), @@ -187,10 +202,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 +229,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__', ), @@ -244,6 +265,7 @@ def desugar_expression(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 +286,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):