summaryrefslogtreecommitdiff
path: root/lambda-calcul/haskell/src/Minilang
diff options
context:
space:
mode:
Diffstat (limited to 'lambda-calcul/haskell/src/Minilang')
-rw-r--r--lambda-calcul/haskell/src/Minilang/Lambda/Parser.hs18
1 files changed, 12 insertions, 6 deletions
diff --git a/lambda-calcul/haskell/src/Minilang/Lambda/Parser.hs b/lambda-calcul/haskell/src/Minilang/Lambda/Parser.hs
index 426a8e8..9ed4626 100644
--- a/lambda-calcul/haskell/src/Minilang/Lambda/Parser.hs
+++ b/lambda-calcul/haskell/src/Minilang/Lambda/Parser.hs
@@ -11,7 +11,7 @@ import qualified Data.Text as Text
import Data.Void (Void)
import Minilang.Lambda.Eval (Term)
import qualified Minilang.Lambda.Eval as Eval
-import Text.Megaparsec (Parsec, between, empty, errorBundlePretty, parse, try)
+import Text.Megaparsec (Parsec, between, empty, errorBundlePretty, parse, some, try)
import Text.Megaparsec.Char (alphaNumChar, char, letterChar, space1, symbolChar)
import qualified Text.Megaparsec.Char.Lexer as L
@@ -75,17 +75,23 @@ letExpr =
rpar
( do
void $ lexeme "let"
- (bound, binding) <-
+ (bind : binds) <-
between
lpar
rpar
- ( (,) <$> identifier <*> ast
- )
+ (some binding)
body <- ast
- let fun = Abs [pack bound] body
- return $ App fun binding []
+ let fun = Abs (fst <$> (bind : binds)) body
+ return $ App fun (snd bind) (snd <$> binds)
)
+binding :: Parser (Text, AST)
+binding =
+ between
+ lpar
+ rpar
+ (((,) . pack <$> identifier) <*> ast)
+
lpar :: Parser Text
lpar = symbol "("