Skip to content

Commit 57df2c0

Browse files
committed
Enhance the user experience
1 parent ed6a6e1 commit 57df2c0

File tree

3 files changed

+49
-13
lines changed

3 files changed

+49
-13
lines changed

lambda-parser.cabal

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ executable lambda-parser
3535
Substitution.Nameless
3636
Generator
3737
Stack
38+
Interaction
3839

3940
-- LANGUAGE extensions used by modules in this package.
4041
-- other-extensions:

src/Interaction.hs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
module Interaction where
2+
3+
import Prelude hiding (lookup)
4+
import Generator (generateTerm, generateNamelessTerm)
5+
import Parser (parseTerm)
6+
import Stack (emptyStack)
7+
import Substitution.Named (substitute)
8+
import Transformer (toNameless, toNamed)
9+
import Data.Map (empty, lookup)
10+
import Substitution.Nameless (substituteNameless)
11+
12+
data TermType = Nameless | Named deriving (Show, Eq)
13+
14+
parseTermType :: String -> TermType
15+
parseTermType "named" = Named
16+
parseTermType "Named" = Named
17+
parseTermType "nameless" = Nameless
18+
parseTermType "Nameless" = Nameless
19+
parseTermType _ = error "Invalid term type"
20+
21+
getOutputTermType :: IO TermType
22+
getOutputTermType = putStr "Please enter the type of the output terms (named, nameless): " >> parseTermType <$> getLine
23+
24+
getSubstitutionType :: IO TermType
25+
getSubstitutionType = putStr "Please enter the type of the substitution to be used (named, nameless): " >> parseTermType <$> getLine
26+
27+
doSubstituteNamed :: String -> String -> String -> String
28+
doSubstituteNamed term var substituteTerm = generateTerm $ substitute (parseTerm term emptyStack) (head var) (parseTerm substituteTerm emptyStack)
29+
30+
doSubstituteNameless :: String -> String -> String -> TermType -> String
31+
doSubstituteNameless term var substituteTerm outputTermType =
32+
let (namelessTerm, context) = toNameless (parseTerm term emptyStack) empty
33+
substituteVariable = head var `lookup` context
34+
in case substituteVariable of
35+
Nothing -> term
36+
Just index ->
37+
let (substituteNamelessTerm, updatedContext) = toNameless (parseTerm substituteTerm emptyStack) context
38+
result = substituteNameless namelessTerm index substituteNamelessTerm
39+
in if outputTermType == Named
40+
then generateTerm $ toNamed result updatedContext
41+
else generateNamelessTerm result

src/Main.hs

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,8 @@ import System.IO (BufferMode (BlockBuffering), hSetBuffering, stdout)
99
import Transformer (toNamed, toNameless)
1010
import Prelude hiding (lookup)
1111
import Stack (emptyStack)
12+
import Interaction (getSubstitutionType, getOutputTermType, doSubstituteNameless, TermType (Named), doSubstituteNamed)
1213

13-
-- TODO: let the user decide which substitution to be used and how the
14-
-- result should be displayed - either as named or nameless term
1514
main :: IO ()
1615
main = do
1716
hSetBuffering stdout $ BlockBuffering $ Just 1
@@ -20,15 +19,10 @@ main = do
2019
if length var /= 1
2120
then error "please provide valid variable"
2221
else do
23-
let (namelessTerm, context) = toNameless (parseTerm term emptyStack) empty
24-
substituteVariable = head var `lookup` context
2522
substituteTerm <- putStr "Input substitution term: " >> getLine
26-
case substituteVariable of
27-
Nothing -> putStrLn term
28-
Just index ->
29-
let (substituteNamelessTerm, updatedContext) = toNameless (parseTerm substituteTerm emptyStack) context
30-
in putStrLn $ generateTerm $ toNamed (substituteNameless namelessTerm index substituteNamelessTerm) updatedContext
31-
32-
-- let substituteVariable = head var
33-
-- substituteTerm <- putStr "Input substitution term: " >> getLine
34-
-- putStrLn $ generateTerm $ substitute (parseTerm term) substituteVariable (parseTerm substituteTerm)
23+
substitutionType <- getSubstitutionType
24+
if substitutionType == Named
25+
then putStrLn $ doSubstituteNamed term var substituteTerm
26+
else do
27+
outputFormat <- getOutputTermType
28+
putStrLn $ doSubstituteNameless term var substituteTerm outputFormat

0 commit comments

Comments
 (0)