From 63f82d0550eaff243e32619d4902a2fa1a15bcb2 Mon Sep 17 00:00:00 2001 From: Jed Barber Date: Fri, 14 Mar 2014 13:30:38 +1100 Subject: Separated monad and datatype definitions from rest of code --- Unlambda/Interpreter.hs | 29 +++-------------------------- 1 file changed, 3 insertions(+), 26 deletions(-) (limited to 'Unlambda/Interpreter.hs') diff --git a/Unlambda/Interpreter.hs b/Unlambda/Interpreter.hs index 26050e6..44dcad9 100644 --- a/Unlambda/Interpreter.hs +++ b/Unlambda/Interpreter.hs @@ -4,40 +4,17 @@ module Unlambda.Interpreter ( import System.IO.Error -import Control.Exception( Exception(..), Handler(..), throw, catches ) -import Control.Monad.Trans.Class import Control.Monad.Trans.Cont -import Control.Monad.Trans.State.Lazy import Control.Monad.IO.Class -import Data.Typeable import Data.Maybe import Unlambda.Parser +import Unlambda.Monad -type ULM a = ContT UnlambdaTerm (StateT (Maybe Char) IO) a - - -data UnlambdaException = UnlambdaException { exitValue :: UnlambdaTerm } - deriving (Show, Typeable) - -instance Exception UnlambdaException - - unlambda :: UnlambdaTerm -> IO UnlambdaTerm -unlambda term = catches ((`evalStateT` Nothing) . (`runContT` return) $ eval term) - [ Handler ((\e -> return . exitValue $ e) :: UnlambdaException -> IO UnlambdaTerm) ] - - - -setCurChar :: Maybe Char -> ULM () -setCurChar x = lift (put x) - - - -getCurChar :: ULM (Maybe Char) -getCurChar = lift (get) +unlambda term = getResult $ eval term @@ -88,7 +65,7 @@ apply firstTerm secondTerm = liftIO (putChar '\n') return t - E -> eval secondTerm >>= throw . UnlambdaException + E -> eval secondTerm >>= doExit Reed -> do t <- eval secondTerm -- cgit