@@ -21,8 +21,10 @@ import Idris.Completion
22import Paths_idris
22import Paths_idris
23import Util.System
23import Util.System
24+import Util.DynamicLinker
25import Core.Evaluate
26import Core.Evaluate
27+import Core.Execute (execute)
26import Core.ProofShell
28import Core.ProofShell
27import Core.TT
29import Core.TT
28import Core.Constraints
30import Core.Constraints
@@ -51,6 +53,8 @@ import Data.List
51import Data.Char
53import Data.Char
52import Data.Version
54import Data.Version
54-- | Run the REPL
58-- | Run the REPL
55repl :: IState -- ^ The initial state
59repl :: IState -- ^ The initial state
56 -> [FilePath] -- ^ The loaded modules
60 -> [FilePath] -- ^ The loaded modules
@@ -185,17 +189,17 @@ process fn (Eval t)
185 imp <- impShow
189 imp <- impShow
186 iputStrLn (showImp imp (delab ist tm') ++ " : " ++
190 iputStrLn (showImp imp (delab ist tm') ++ " : " ++
187 showImp imp (delab ist ty'))
191 showImp imp (delab ist ty'))
188−process fn (ExecVal t)
192+process fn (ExecVal t)
193+ = do ctxt <- getContext
189− = do (tm, ty) <- elabVal toplevel False t
195+ (tm, ty) <- elabVal toplevel False t
190−-- (PApp fc (PRef fc (NS (UN "print") ["Prelude"]))
196+ let tm' = normaliseAll ctxt [] tm
191−-- [pexp t])
197+ let ty' = normaliseAll ctxt [] ty
192− (tmpn, tmph) <- liftIO tempfile
198+ res <- execute tm'
193− liftIO $ hClose tmph
199+ imp <- impShow
194− t <- target
200+ iputStrLn (showImp imp (delab ist res) ++ " : " ++
195− compile t tmpn tm
201+ showImp imp (delab ist ty'))
196− liftIO $ system tmpn
197− return ()
202+ return ()
198− where fc = FC "(input)" 0
199process fn (Check (PRef _ n))
203process fn (Check (PRef _ n))
200 = do ctxt <- getContext
204 = do ctxt <- getContext
201 ist <- getIState
205 ist <- getIState
@@ -380,7 +384,20 @@ process fn (Missing n) = do i <- getIState
380 iputStrLn (showSep "\n" (map (showImp True) tms))
384 iputStrLn (showSep "\n" (map (showImp True) tms))
381 [] -> iputStrLn $ show n ++ " undefined"
385 [] -> iputStrLn $ show n ++ " undefined"
382 _ -> iputStrLn $ "Ambiguous name"
386 _ -> iputStrLn $ "Ambiguous name"
387+process fn (DynamicLink l) = do i <- getIState
389+ handle <- lift $ tryLoadLib lib
391+ Nothing -> iputStrLn $ "Could not load dynamic lib \"" ++ l ++ "\""
392+ Just x -> do let libs = idris_dynamic_libs i
393+ putIState $ i { idris_dynamic_libs = x:libs }
394+ where trim = reverse . dropWhile isSpace . reverse . dropWhile isSpace
395+process fn ListDynamic = do i <- getIState
396+ iputStrLn "Dynamic libraries:"
397+ showLibs $ idris_dynamic_libs i
398+ where showLibs [] = return ()
399+ showLibs ((Lib name _):ls) = do iputStrLn $ "\t" ++ name; showLibs ls
383−process fn Metavars
400+process fn Metavars
384 = do ist <- getIState
401 = do ist <- getIState
385 let mvs = idris_metavars ist \\ primDefs
402 let mvs = idris_metavars ist \\ primDefs
386 case mvs of
403 case mvs of
@@ -441,41 +458,42 @@ parseTarget _ = error "unknown target" -- FIXME: partial function
442parseArgs :: [String] -> [Opt]
459parseArgs :: [String] -> [Opt]
443parseArgs [] = []
460parseArgs [] = []
444−parseArgs ("--quiet":ns) = Quiet : (parseArgs ns)
461+parseArgs ("--quiet":ns) = Quiet : (parseArgs ns)
445−parseArgs ("--log":lvl:ns) = OLogging (read lvl) : (parseArgs ns)
462+parseArgs ("--log":lvl:ns) = OLogging (read lvl) : (parseArgs ns)
446−parseArgs ("--noprelude":ns) = NoPrelude : (parseArgs ns)
463+parseArgs ("--noprelude":ns) = NoPrelude : (parseArgs ns)
447−parseArgs ("--check":ns) = NoREPL : (parseArgs ns)
464+parseArgs ("--check":ns) = NoREPL : (parseArgs ns)
448−parseArgs ("-o":n:ns) = NoREPL : Output n : (parseArgs ns)
465+parseArgs ("-o":n:ns) = NoREPL : Output n : (parseArgs ns)
449−parseArgs ("-no":n:ns) = NoREPL : NewOutput n : (parseArgs ns)
466+parseArgs ("-no":n:ns) = NoREPL : NewOutput n : (parseArgs ns)
450−parseArgs ("--typecase":ns) = TypeCase : (parseArgs ns)
467+parseArgs ("--typecase":ns) = TypeCase : (parseArgs ns)
451−parseArgs ("--typeintype":ns) = TypeInType : (parseArgs ns)
468+parseArgs ("--typeintype":ns) = TypeInType : (parseArgs ns)
452−parseArgs ("--total":ns) = DefaultTotal : (parseArgs ns)
469+parseArgs ("--total":ns) = DefaultTotal : (parseArgs ns)
453−parseArgs ("--partial":ns) = DefaultPartial : (parseArgs ns)
470+parseArgs ("--partial":ns) = DefaultPartial : (parseArgs ns)
454−parseArgs ("--warnpartial":ns) = WarnPartial : (parseArgs ns)
471+parseArgs ("--warnpartial":ns) = WarnPartial : (parseArgs ns)
455−parseArgs ("--nocoverage":ns) = NoCoverage : (parseArgs ns)
472+parseArgs ("--nocoverage":ns) = NoCoverage : (parseArgs ns)
456−parseArgs ("--errorcontext":ns) = ErrContext : (parseArgs ns)
473+parseArgs ("--errorcontext":ns) = ErrContext : (parseArgs ns)
457−parseArgs ("--help":ns) = Usage : (parseArgs ns)
474+parseArgs ("--help":ns) = Usage : (parseArgs ns)
458−parseArgs ("--link":ns) = ShowLibs : (parseArgs ns)
475+parseArgs ("--link":ns) = ShowLibs : (parseArgs ns)
459−parseArgs ("--libdir":ns) = ShowLibdir : (parseArgs ns)
476+parseArgs ("--libdir":ns) = ShowLibdir : (parseArgs ns)
460−parseArgs ("--include":ns) = ShowIncs : (parseArgs ns)
477+parseArgs ("--include":ns) = ShowIncs : (parseArgs ns)
461−parseArgs ("--version":ns) = Ver : (parseArgs ns)
478+parseArgs ("--version":ns) = Ver : (parseArgs ns)
462−parseArgs ("--verbose":ns) = Verbose : (parseArgs ns)
479+parseArgs ("--verbose":ns) = Verbose : (parseArgs ns)
463−parseArgs ("--ibcsubdir":n:ns) = IBCSubDir n : (parseArgs ns)
480+parseArgs ("--ibcsubdir":n:ns) = IBCSubDir n : (parseArgs ns)
464−parseArgs ("-i":n:ns) = ImportDir n : (parseArgs ns)
481+parseArgs ("-i":n:ns) = ImportDir n : (parseArgs ns)
465−parseArgs ("--warn":ns) = WarnOnly : (parseArgs ns)
482+parseArgs ("--warn":ns) = WarnOnly : (parseArgs ns)
466−parseArgs ("--package":n:ns) = Pkg n : (parseArgs ns)
483+parseArgs ("--package":n:ns) = Pkg n : (parseArgs ns)
467−parseArgs ("-p":n:ns) = Pkg n : (parseArgs ns)
484+parseArgs ("-p":n:ns) = Pkg n : (parseArgs ns)
468−parseArgs ("--build":n:ns) = PkgBuild n : (parseArgs ns)
485+parseArgs ("--build":n:ns) = PkgBuild n : (parseArgs ns)
469−parseArgs ("--install":n:ns) = PkgInstall n : (parseArgs ns)
486+parseArgs ("--install":n:ns) = PkgInstall n : (parseArgs ns)
470−parseArgs ("--clean":n:ns) = PkgClean n : (parseArgs ns)
487+parseArgs ("--clean":n:ns) = PkgClean n : (parseArgs ns)
471−parseArgs ("--bytecode":n:ns) = NoREPL : BCAsm n : (parseArgs ns)
488+parseArgs ("--bytecode":n:ns) = NoREPL : BCAsm n : (parseArgs ns)
472−parseArgs ("--fovm":n:ns) = NoREPL : FOVM n : (parseArgs ns)
489+parseArgs ("--fovm":n:ns) = NoREPL : FOVM n : (parseArgs ns)
473−parseArgs ("-S":ns) = OutputTy Raw : (parseArgs ns)
490+parseArgs ("-S":ns) = OutputTy Raw : (parseArgs ns)
474−parseArgs ("-c":ns) = OutputTy Object : (parseArgs ns)
491+parseArgs ("-c":ns) = OutputTy Object : (parseArgs ns)
475−parseArgs ("--dumpdefuns":n:ns) = DumpDefun n : (parseArgs ns)
492+parseArgs ("--dumpdefuns":n:ns) = DumpDefun n : (parseArgs ns)
476−parseArgs ("--dumpcases":n:ns) = DumpCases n : (parseArgs ns)
493+parseArgs ("--dumpcases":n:ns) = DumpCases n : (parseArgs ns)
477−parseArgs ("--target":n:ns) = UseTarget (parseTarget n) : (parseArgs ns)
494+parseArgs ("--target":n:ns) = UseTarget (parseTarget n) : (parseArgs ns)
495+parseArgs ("-XTypeProviders":ns) = Extension TypeProviders : (parseArgs ns)
478−parseArgs (n:ns) = Filename n : (parseArgs ns)
496+parseArgs (n:ns) = Filename n : (parseArgs ns)
480helphead =
498helphead =
481 [ (["Command"], "Arguments", "Purpose", ""),
499 [ (["Command"], "Arguments", "Purpose", ""),
@@ -510,6 +528,7 @@ idrisMain opts =
510 xs -> last xs
528 xs -> last xs
511 when (DefaultTotal `elem` opts) $ do i <- getIState
529 when (DefaultTotal `elem` opts) $ do i <- getIState
512 putIState (i { default_total = True })
530 putIState (i { default_total = True })
531+ mapM_ addLangExt (opt getLanguageExt opts)
513 setREPL runrepl
532 setREPL runrepl
514 setQuiet quiet
533 setQuiet quiet
515 setVerbose runrepl
534 setVerbose runrepl
@@ -609,6 +628,10 @@ getOutputTy :: Opt -> Maybe OutputType
609getOutputTy (OutputTy t) = Just t
628getOutputTy (OutputTy t) = Just t
610getOutputTy _ = Nothing
629getOutputTy _ = Nothing
631+getLanguageExt :: Opt -> Maybe LanguageExt
632+getLanguageExt (Extension e) = Just e
633+getLanguageExt _ = Nothing
612opt :: (Opt -> Maybe a) -> [Opt] -> [a]
635opt :: (Opt -> Maybe a) -> [Opt] -> [a]
613opt = mapMaybe
636opt = mapMaybe