lambda/interactive.hs
2017-12-01 06:05:47 +00:00

27 lines
716 B
Haskell

import qualified Lambda as L
import Data.Maybe
-- Helper type for using arbitrary strings as symbols
newtype StrSymbol = StrSymbol String
instance Show StrSymbol where
show (StrSymbol s) = s
instance Eq StrSymbol where
(StrSymbol a) == (StrSymbol b) = a == b
-- process a string line by line instead of all at once
linewise :: (String -> String) -> String -> String
linewise f = unlines . map f . lines
evaluate :: String -> String
evaluate s =
let result = return
. map (L.display True)
. L.evaluate
. fmap StrSymbol
l = fromMaybe ["Error: Could not parse expression."]
$ L.parseMaybe s >>= result
in unlines l
main = interact $ linewise evaluate