@@ -605,6 +605,8 @@ parseArgs ("-c":ns) = OutputTy Object : (parseArgs ns)
605605parseArgs ("--dumpdefuns":n:ns) = DumpDefun n : (parseArgs ns)
606606parseArgs ("--dumpcases":n:ns) = DumpCases n : (parseArgs ns)
607607parseArgs ("--target":n:ns) = UseTarget (parseTarget n) : (parseArgs ns)
608+parseArgs ["--exec"] = InterpretScript "Main.main" : []
609+parseArgs ("--exec":expr:ns) = InterpretScript expr : parseArgs ns
608610parseArgs ("-XTypeProviders":ns) = Extension TypeProviders : (parseArgs ns)
609611parseArgs (n:ns) = Filename n : (parseArgs ns)
610612
@@ -640,11 +642,16 @@ idrisMain opts =
640642 let tgt = case opt getTarget opts of
641643 [] -> ViaC
642644 xs -> last xs
645+ script <- case opt getExecScript opts of
646+ [] -> return Nothing
647+ x:y:xs -> do iputStrLn "More than one interpreter expression found."
648+ liftIO $ exitWith (ExitFailure 1)
649+ [expr] -> return (Just expr)
643650 when (DefaultTotal `elem` opts) $ do i <- getIState
644651 putIState (i { default_total = True })
645652 mapM_ addLangExt (opt getLanguageExt opts)
646653 setREPL runrepl
647− setQuiet quiet
654+ setQuiet (quiet || isJust script)
648655 setIdeSlave idesl
649656 setVerbose runrepl
650657 setCmdLine opts
@@ -670,16 +677,19 @@ idrisMain opts =
670677 elabPrims
671678 when (not (NoPrelude `elem` opts)) $ do x <- loadModule "Prelude"
672679 return ()
673− when (runrepl && not quiet && not idesl) $ iputStrLn banner
680+ when (runrepl && not quiet && not idesl && not (isJust script)) $ iputStrLn banner
674681 ist <- getIState
675682 mods <- mapM loadModule inputs
676683 ok <- noErrors
677684 when ok $ case output of
678685 [] -> return ()
679− (o:_) -> process "" (Compile tgt o)
686+ (o:_) -> process "" (Compile tgt o)
680687 when ok $ case newoutput of
681688 [] -> return ()
682− (o:_) -> process "" (NewCompile o)
689+ (o:_) -> process "" (NewCompile o)
690+ case script of
691+ Nothing -> return ()
692+ Just expr -> execScript expr
683693 when (runrepl && not idesl) $ runInputT replSettings $ repl ist inputs
684694 when (idesl) $ ideslaveStart ist inputs
685695 ok <- noErrors
@@ -696,6 +706,16 @@ idrisMain opts =
696706 addPkgDir p = do ddir <- liftIO $ getDataDir
697707 addImportDir (ddir </> p)
698708
709+execScript :: String -> Idris ()
710+execScript expr = do i <- getIState
711+ case parseExpr i expr of
712+ Left err -> do iputStrLn $ show err
713+ liftIO $ exitWith (ExitFailure 1)
714+ Right term -> do ctxt <- getContext
715+ (tm, _) <- elabVal toplevel False term
716+ res <- execute tm
717+ liftIO $ exitWith ExitSuccess
718+
699719getFile :: Opt -> Maybe String
700720getFile (Filename str) = Just str
701721getFile _ = Nothing
@@ -741,6 +761,10 @@ getTarget :: Opt -> Maybe Target
741761getTarget (UseTarget x) = Just x
742762getTarget _ = Nothing
743763
764+getExecScript :: Opt -> Maybe String
765+getExecScript (InterpretScript expr) = Just expr
766+getExecScript _ = Nothing
767+
744768getOutputTy :: Opt -> Maybe OutputType
745769getOutputTy (OutputTy t) = Just t
746770getOutputTy _ = Nothing