diff options
Diffstat (limited to 'src/Transfer/InterpreterAPI.hs')
| -rw-r--r-- | src/Transfer/InterpreterAPI.hs | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/src/Transfer/InterpreterAPI.hs b/src/Transfer/InterpreterAPI.hs new file mode 100644 index 000000000..d78265534 --- /dev/null +++ b/src/Transfer/InterpreterAPI.hs @@ -0,0 +1,31 @@ +module Transfer.InterpreterAPI (Env, load, loadFile, evaluateString) where + +import Transfer.Core.Abs +import Transfer.Core.Lex +import Transfer.Core.Par +import Transfer.Core.Print +import Transfer.Interpreter +import Transfer.ErrM + +-- | Read a transfer module in core format from a string. +load :: Monad m => + String -- ^ Input source name, for error messages. + -> String -- ^ Module contents. + -> m Env +load n s = case pModule (myLexer s) of + Bad e -> fail $ "Parse error in " ++ n ++ ": " ++ e + Ok m -> return $ addModuleEnv builtin m + +-- | Read a transfer module in core format from a file. +loadFile :: FilePath -> IO Env +loadFile f = readFile f >>= load f + +-- | Read a transfer expression from a string and evaluate it. +-- Returns the result as a string. +evaluateString :: Monad m => Env -> String -> m String +evaluateString env s = + case pExp (myLexer s) of + Bad e -> fail $ "Parse error: " ++ e + Ok e -> do + let v = eval env e + return $ printValue v |
