@@ -90,45 +90,37 @@ listTerm =
9090
9191parensTerm :: IParser Source.Expr
9292parensTerm =
93− choice
94− [ try opFn
95− , parens (tupleFn <|> parened)
96− ]
97− where
98− lambda start end x body =
99− A.at start end (E.Lambda (A.at start end (P.Var x)) body)
100−
101− var start end x =
102− A.at start end (E.rawVar x)
93+ let
94+ mkFunc args realBody start end =
95+ foldr
96+ (\arg body -> A.at start end (E.Lambda (A.at start end (P.Var arg)) body))
97+ (A.at start end (realBody (A.at start end . E.rawVar)))
98+ args
10399
104− opFn =
105− do (start, op, end) <- located (parens symOp)
106− return $
107− lambda start end "x" $
108− lambda start end "y" $
109− A.at start end $
110− E.Binop (Var.Raw op) (var start end "x") (var start end "y")
100+ mkBinop op =
101+ mkFunc ["x","y"] (\var -> E.Binop (Var.Raw op) (var "x") (var "y"))
111102
112103 tupleFn =
113− do (start, commas, end) <-
114− located (comma >> many (whitespace >> comma))
115−
116− let vars = map (('v':) . show) [ 0 .. length commas + 1 ]
117−
118− return $
119− foldr
120− (lambda start end)
121− (A.at start end (E.tuple (map (var start end) vars)))
122− vars
123−
124− parened =
125− do (start, expressions, end) <- located (commaSep expr)
126− return $
127− case expressions of
128− [expression] ->
129− expression
130− _ ->
131− A.at start end (E.tuple expressions)
104+ do commas <- many1 comma
105+ let args = map (('v':) . show) [ 0 .. length commas ]
106+ return $ mkFunc args (\var -> E.tuple (map var args))
107+
108+ parenedExpr =
109+ do expressions <- padded (commaSep expr)
110+ return $ \start end ->
111+ case expressions of
112+ [expression] ->
113+ expression
114+ _ ->
115+ A.at start end (E.tuple expressions)
116+ in
117+ do (start, mkExpr, end) <-
118+ located $ choice $
119+ [ mkBinop <$> try (parens symOp)
120+ , parens (tupleFn <|> parenedExpr)
121+ ]
122+ return (mkExpr start end)
123+
132124
133125
134126recordTerm :: IParser Source.Expr