summaryrefslogtreecommitdiff
path: root/lambda-calcul/haskell/src/Minilang/Lambda
diff options
context:
space:
mode:
authorArnaud Bailly <arnaud@pankzsoft.com>2025-10-17 22:24:04 +0200
committerArnaud Bailly <arnaud@pankzsoft.com>2025-10-17 22:24:04 +0200
commit2488429444c2740a075a1f13217ca1838f11026f (patch)
tree5394b1052eb91c2b08e92201288378815da789e1 /lambda-calcul/haskell/src/Minilang/Lambda
parent794003e6c0684e04dcde24abe86a490b32342d27 (diff)
downloadlambda-nantes-2488429444c2740a075a1f13217ca1838f11026f.tar.gz
feat: can desugar expressions
Diffstat (limited to 'lambda-calcul/haskell/src/Minilang/Lambda')
-rw-r--r--lambda-calcul/haskell/src/Minilang/Lambda/Parser.hs16
1 files changed, 16 insertions, 0 deletions
diff --git a/lambda-calcul/haskell/src/Minilang/Lambda/Parser.hs b/lambda-calcul/haskell/src/Minilang/Lambda/Parser.hs
index 28da47f..37834d3 100644
--- a/lambda-calcul/haskell/src/Minilang/Lambda/Parser.hs
+++ b/lambda-calcul/haskell/src/Minilang/Lambda/Parser.hs
@@ -11,6 +11,8 @@ import Data.Void (Void)
import Text.Megaparsec (Parsec, between, empty, errorBundlePretty, manyTill, notFollowedBy, optional, parse, try)
import Text.Megaparsec.Char (alphaNumChar, char, letterChar, space1, string, symbolChar)
import qualified Text.Megaparsec.Char.Lexer as L
+import Minilang.Lambda.Eval (Term)
+import qualified Minilang.Lambda.Eval as Eval
type Parser = Parsec Void Text
@@ -20,6 +22,20 @@ data ParseError = ParseError Text
data AST = Sym Text | Abs [Text] AST | App AST AST [AST]
deriving (Eq, Show)
+desugar :: AST -> Term
+desugar = \case
+ Sym sym -> Eval.Var sym
+ Abs bound body ->
+ foldr
+ Eval.Lam
+ (desugar body)
+ bound
+ App x y rest ->
+ foldl
+ (\acc a -> Eval.App acc (desugar a))
+ (Eval.App (desugar x) (desugar y))
+ rest
+
pretty :: AST -> Text
pretty = \case
Sym sym -> sym