Skip to content

Commit

Permalink
Merge pull request #54 from EpitechPromo2027/53-parse-recursive-lambd…
Browse files Browse the repository at this point in the history
…a-calls

add: parse recursive `lambda` calls
  • Loading branch information
oriollinan authored Dec 9, 2024
2 parents 8baad29 + 7ebb3b1 commit d2be80f
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 0 deletions.
1 change: 1 addition & 0 deletions lib/Ast/Parser.hs
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ parseFunctionDefine = do
args <- M.many $ parseVarName <* M.optional sc
return (name, args)
mapM_ (\arg -> S.modify $ E.insertVar arg $ Var arg) args
S.modify $ E.insertFn name $ Lambda args $ Seq []
value <- parseExpr
let lambda = Lambda args value
S.modify $ E.insertFn name lambda
Expand Down
28 changes: 28 additions & 0 deletions test/Ast/ParserSpec.hs
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,34 @@ spec = do
(Op Add (Var "x") (Var "y"))
]
)
it "parses a recursive lambda" $ do
parse "" "(define (pow x n) ( if (< n 2) (x) (* x (pow x (- n 1)))))"
`shouldBe` Right
( AST
[ Define
"pow"
( Lambda
["x", "n"]
( If
( Op Lt (Var "n") (Lit (LInt 2))
)
(Seq [Var "x"])
( Op
Mult
(Var "x")
( Call
(Var "pow")
( Seq
[ Var "x",
Op Sub (Var "n") (Lit (LInt 1))
]
)
)
)
)
)
]
)

it "fails to parse a lambda with invalid parameter list" $ do
parse "" "(lambda 42 (* 2 2))" `shouldSatisfy` isLeft
Expand Down

0 comments on commit d2be80f

Please # to comment.