@@ -605,6 +605,8 @@ parseArgs ("-c":ns) = OutputTy Object : (parseArgs ns)
605parseArgs ("--dumpdefuns":n:ns) = DumpDefun n : (parseArgs ns)
605parseArgs ("--dumpdefuns":n:ns) = DumpDefun n : (parseArgs ns)
606parseArgs ("--dumpcases":n:ns) = DumpCases n : (parseArgs ns)
606parseArgs ("--dumpcases":n:ns) = DumpCases n : (parseArgs ns)
607parseArgs ("--target":n:ns) = UseTarget (parseTarget n) : (parseArgs ns)
607parseArgs ("--target":n:ns) = UseTarget (parseTarget n) : (parseArgs ns)
608+parseArgs ["--exec"] = InterpretScript "Main.main" : []
609+parseArgs ("--exec":expr:ns) = InterpretScript expr : parseArgs ns
608parseArgs ("-XTypeProviders":ns) = Extension TypeProviders : (parseArgs ns)
610parseArgs ("-XTypeProviders":ns) = Extension TypeProviders : (parseArgs ns)
609parseArgs (n:ns) = Filename n : (parseArgs ns)
611parseArgs (n:ns) = Filename n : (parseArgs ns)
@@ -640,11 +642,16 @@ idrisMain opts =
640 let tgt = case opt getTarget opts of
642 let tgt = case opt getTarget opts of
641 [] -> ViaC
643 [] -> ViaC
642 xs -> last xs
644 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)
643 when (DefaultTotal `elem` opts) $ do i <- getIState
650 when (DefaultTotal `elem` opts) $ do i <- getIState
644 putIState (i { default_total = True })
651 putIState (i { default_total = True })
645 mapM_ addLangExt (opt getLanguageExt opts)
652 mapM_ addLangExt (opt getLanguageExt opts)
646 setREPL runrepl
653 setREPL runrepl
647− setQuiet quiet
654+ setQuiet (quiet || isJust script)
648 setIdeSlave idesl
655 setIdeSlave idesl
649 setVerbose runrepl
656 setVerbose runrepl
650 setCmdLine opts
657 setCmdLine opts
@@ -670,16 +677,19 @@ idrisMain opts =
670 elabPrims
677 elabPrims
671 when (not (NoPrelude `elem` opts)) $ do x <- loadModule "Prelude"
678 when (not (NoPrelude `elem` opts)) $ do x <- loadModule "Prelude"
672 return ()
679 return ()
673− when (runrepl && not quiet && not idesl) $ iputStrLn banner
680+ when (runrepl && not quiet && not idesl && not (isJust script)) $ iputStrLn banner
674 ist <- getIState
681 ist <- getIState
675 mods <- mapM loadModule inputs
682 mods <- mapM loadModule inputs
676 ok <- noErrors
683 ok <- noErrors
677 when ok $ case output of
684 when ok $ case output of
678 [] -> return ()
685 [] -> return ()
679− (o:_) -> process "" (Compile tgt o)
686+ (o:_) -> process "" (Compile tgt o)
680 when ok $ case newoutput of
687 when ok $ case newoutput of
681 [] -> return ()
688 [] -> return ()
682− (o:_) -> process "" (NewCompile o)
689+ (o:_) -> process "" (NewCompile o)
691+ Nothing -> return ()
692+ Just expr -> execScript expr
683 when (runrepl && not idesl) $ runInputT replSettings $ repl ist inputs
693 when (runrepl && not idesl) $ runInputT replSettings $ repl ist inputs
684 when (idesl) $ ideslaveStart ist inputs
694 when (idesl) $ ideslaveStart ist inputs
685 ok <- noErrors
695 ok <- noErrors
@@ -696,6 +706,16 @@ idrisMain opts =
696 addPkgDir p = do ddir <- liftIO $ getDataDir
706 addPkgDir p = do ddir <- liftIO $ getDataDir
697 addImportDir (ddir </> p)
707 addImportDir (ddir </> p)
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
717+ liftIO $ exitWith ExitSuccess
699getFile :: Opt -> Maybe String
719getFile :: Opt -> Maybe String
700getFile (Filename str) = Just str
720getFile (Filename str) = Just str
701getFile _ = Nothing
721getFile _ = Nothing
@@ -741,6 +761,10 @@ getTarget :: Opt -> Maybe Target
741getTarget (UseTarget x) = Just x
761getTarget (UseTarget x) = Just x
742getTarget _ = Nothing
762getTarget _ = Nothing
764+getExecScript :: Opt -> Maybe String
765+getExecScript (InterpretScript expr) = Just expr
766+getExecScript _ = Nothing
744getOutputTy :: Opt -> Maybe OutputType
768getOutputTy :: Opt -> Maybe OutputType
745getOutputTy (OutputTy t) = Just t
769getOutputTy (OutputTy t) = Just t
746getOutputTy _ = Nothing
770getOutputTy _ = Nothing