Implement variable length arguments, but really only for print
[fur] / desugaring.py
index c951fd5..28d1a78 100644 (file)
@@ -2,6 +2,14 @@ import collections
 
 import parsing
 
+DesugaredBuiltinExpression = collections.namedtuple(
+    'DesugaredBuiltinExpression',
+    (
+        'metadata',
+        'symbol',
+    ),
+)
+
 DesugaredFunctionCallExpression = collections.namedtuple(
     'DesugaredFunctionCallExpression',
     (
@@ -27,14 +35,22 @@ DesugaredIntegerLiteralExpression = collections.namedtuple(
     ),
 )
 
-DesugaredLambdaExpression = 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',
     (
@@ -87,15 +103,6 @@ DesugaredExpressionStatement = collections.namedtuple(
     ),
 )
 
-DesugaredFunctionDefinitionStatement = collections.namedtuple(
-    'DesugaredFunctionDefinitionStatement',
-    (
-        'name',
-        'argument_name_list',
-        'statement_list',
-    ),
-)
-
 DesugaredProgram = collections.namedtuple(
     'DesugaredProgram',
     (
@@ -180,7 +187,7 @@ def desugar_infix_expression(expression):
 
     return DesugaredFunctionCallExpression(
         metadata=expression.metadata,
-        function=DesugaredSymbolExpression(
+        function=DesugaredBuiltinExpression(
             metadata=expression.metadata,
             symbol=function,
         ),
@@ -204,7 +211,7 @@ def desugar_lambda_expression(expression):
 def desugar_list_item_expression(expression):
     return DesugaredFunctionCallExpression(
         metadata=expression.metadata,
-        function=DesugaredSymbolExpression(
+        function=DesugaredBuiltinExpression(
             metadata=expression.metadata,
             symbol='__get__',
         ),
@@ -222,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__',
         ),
@@ -279,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):