From 31620dd79f352259cc88dd70e8d955fe0b57e933 Mon Sep 17 00:00:00 2001 From: DaQuirm Date: Tue, 8 Jan 2019 00:44:08 +0100 Subject: [PATCH 1/3] Add defs and an AST type to support it --- example.lambda | 1 - examples/def.lambda | 3 +++ examples/helloworld.lambda | 1 + src/AST.hs | 41 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 45 insertions(+), 1 deletion(-) delete mode 100644 example.lambda create mode 100644 examples/def.lambda create mode 100644 examples/helloworld.lambda create mode 100644 src/AST.hs diff --git a/example.lambda b/example.lambda deleted file mode 100644 index f79d9f3..0000000 --- a/example.lambda +++ /dev/null @@ -1 +0,0 @@ -((λ x (λ y x)) "Hello, world!") diff --git a/examples/def.lambda b/examples/def.lambda new file mode 100644 index 0000000..91c0918 --- /dev/null +++ b/examples/def.lambda @@ -0,0 +1,3 @@ +const = (λ x (λ y x)) +id = (λ x x) +main = (((const id) const) (λ y (λ x (λ z y)))) \ No newline at end of file diff --git a/examples/helloworld.lambda b/examples/helloworld.lambda new file mode 100644 index 0000000..0280b9c --- /dev/null +++ b/examples/helloworld.lambda @@ -0,0 +1 @@ +((λ x (λ y x)) "Hello, world!") \ No newline at end of file diff --git a/src/AST.hs b/src/AST.hs new file mode 100644 index 0000000..5b2222b --- /dev/null +++ b/src/AST.hs @@ -0,0 +1,41 @@ +{-# OPTIONS_GHC -fno-warn-unused-do-bind #-} + +module AST where + +import Control.Applicative (Alternative, some) +import Control.Monad (guard) + +import Lib (Expr, Identifier, Error, betaReduce, compile) +import Parser (Parser, char, identifier, expr) + +type Definition = (Identifier, Expr) + +data AST = AST + { defs :: [Definition] + , main :: Expr + } deriving (Show) + +definition :: (Alternative m, Monad m) => Parser String m Definition +definition = do + name <- identifier + char ' ' + char '=' + char ' ' + ex <- expr + pure (name, ex) + +ast :: (Alternative m, Monad m) => Parser String m AST +ast = AST <$> some p <*> mainP + where + p = do + def@(name, _) <- definition + guard $ name /= "main" + char '\n' + pure def + mainP = do + def@(name, ex) <- definition + guard $ name == "main" + pure ex + +compileAst :: AST -> Either Error String +compileAst (AST defs main) = betaReduce defs main >>= compile \ No newline at end of file From 96005e72e126fde0a554b01654b9d394992a3014 Mon Sep 17 00:00:00 2001 From: DaQuirm Date: Tue, 8 Jan 2019 00:52:35 +0100 Subject: [PATCH 2/3] Add a Church numerals example --- examples/church.lambda | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 examples/church.lambda diff --git a/examples/church.lambda b/examples/church.lambda new file mode 100644 index 0000000..d4b19fb --- /dev/null +++ b/examples/church.lambda @@ -0,0 +1,6 @@ +zero = (λ f (λ x x)) +one = (λ f (λ x (f x))) +two = (λ f (λ x (f (f x)))) +three = (λ f (λ x (f ((two f) x)))) +const = (λ x (λ y x)) +main = (three const) "whoa" \ No newline at end of file From b8766e29a72254d57d332f22d579b35eef402206 Mon Sep 17 00:00:00 2001 From: DaQuirm Date: Tue, 8 Jan 2019 01:01:59 +0100 Subject: [PATCH 3/3] Change naming to address linting issues --- src/AST.hs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/AST.hs b/src/AST.hs index 5b2222b..8af97b4 100644 --- a/src/AST.hs +++ b/src/AST.hs @@ -11,8 +11,8 @@ import Parser (Parser, char, identifier, expr) type Definition = (Identifier, Expr) data AST = AST - { defs :: [Definition] - , main :: Expr + { defs :: [Definition] + , mainExpr :: Expr } deriving (Show) definition :: (Alternative m, Monad m) => Parser String m Definition @@ -33,9 +33,9 @@ ast = AST <$> some p <*> mainP char '\n' pure def mainP = do - def@(name, ex) <- definition + (name, ex) <- definition guard $ name == "main" pure ex compileAst :: AST -> Either Error String -compileAst (AST defs main) = betaReduce defs main >>= compile \ No newline at end of file +compileAst (AST definitions mainEx) = betaReduce definitions mainEx >>= compile \ No newline at end of file