@@ -21,8 +21,10 @@ import Idris.Completion
2121
2222import Paths_idris
2323import Util.System
24+import Util.DynamicLinker
2425
2526import Core.Evaluate
27+import Core.Execute (execute)
2628import Core.ProofShell
2729import Core.TT
2830import Core.Constraints
@@ -51,6 +53,8 @@ import Data.List
5153import Data.Char
5254import Data.Version
5355
56+import Debug.Trace
57+
5458-- | Run the REPL
5559repl :: IState -- ^ The initial state
5660 -> [FilePath] -- ^ The loaded modules
@@ -185,17 +189,17 @@ process fn (Eval t)
185189 imp <- impShow
186190 iputStrLn (showImp imp (delab ist tm') ++ " : " ++
187191 showImp imp (delab ist ty'))
188−process fn (ExecVal t)
189− = do (tm, ty) <- elabVal toplevel False t
190−-- (PApp fc (PRef fc (NS (UN "print") ["Prelude"]))
191−-- [pexp t])
192− (tmpn, tmph) <- liftIO tempfile
193− liftIO $ hClose tmph
194− t <- target
195− compile t tmpn tm
196− liftIO $ system tmpn
197− return ()
198− where fc = FC "(input)" 0
192+process fn (ExecVal t)
193+ = do ctxt <- getContext
194+ ist <- getIState
195+ (tm, ty) <- elabVal toplevel False t
196+ let tm' = normaliseAll ctxt [] tm
197+ let ty' = normaliseAll ctxt [] ty
198+ res <- execute tm'
199+ imp <- impShow
200+ iputStrLn (showImp imp (delab ist res) ++ " : " ++
201+ showImp imp (delab ist ty'))
202+ return ()
199203process fn (Check (PRef _ n))
200204 = do ctxt <- getContext
201205 ist <- getIState
@@ -380,7 +384,20 @@ process fn (Missing n) = do i <- getIState
380384 iputStrLn (showSep "\n" (map (showImp True) tms))
381385 [] -> iputStrLn $ show n ++ " undefined"
382386 _ -> iputStrLn $ "Ambiguous name"
383−process fn Metavars
387+process fn (DynamicLink l) = do i <- getIState
388+ let lib = trim l
389+ handle <- lift $ tryLoadLib lib
390+ case handle of
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
400+process fn Metavars
384401 = do ist <- getIState
385402 let mvs = idris_metavars ist \\ primDefs
386403 case mvs of
@@ -441,41 +458,42 @@ parseTarget _ = error "unknown target" -- FIXME: partial function
441458
442459parseArgs :: [String] -> [Opt]
443460parseArgs [] = []
444−parseArgs ("--quiet":ns) = Quiet : (parseArgs ns)
445−parseArgs ("--log":lvl:ns) = OLogging (read lvl) : (parseArgs ns)
446−parseArgs ("--noprelude":ns) = NoPrelude : (parseArgs ns)
447−parseArgs ("--check":ns) = NoREPL : (parseArgs ns)
448−parseArgs ("-o":n:ns) = NoREPL : Output n : (parseArgs ns)
449−parseArgs ("-no":n:ns) = NoREPL : NewOutput n : (parseArgs ns)
450−parseArgs ("--typecase":ns) = TypeCase : (parseArgs ns)
451−parseArgs ("--typeintype":ns) = TypeInType : (parseArgs ns)
452−parseArgs ("--total":ns) = DefaultTotal : (parseArgs ns)
453−parseArgs ("--partial":ns) = DefaultPartial : (parseArgs ns)
454−parseArgs ("--warnpartial":ns) = WarnPartial : (parseArgs ns)
455−parseArgs ("--nocoverage":ns) = NoCoverage : (parseArgs ns)
456−parseArgs ("--errorcontext":ns) = ErrContext : (parseArgs ns)
457−parseArgs ("--help":ns) = Usage : (parseArgs ns)
458−parseArgs ("--link":ns) = ShowLibs : (parseArgs ns)
459−parseArgs ("--libdir":ns) = ShowLibdir : (parseArgs ns)
460−parseArgs ("--include":ns) = ShowIncs : (parseArgs ns)
461−parseArgs ("--version":ns) = Ver : (parseArgs ns)
462−parseArgs ("--verbose":ns) = Verbose : (parseArgs ns)
463−parseArgs ("--ibcsubdir":n:ns) = IBCSubDir n : (parseArgs ns)
464−parseArgs ("-i":n:ns) = ImportDir n : (parseArgs ns)
465−parseArgs ("--warn":ns) = WarnOnly : (parseArgs ns)
466−parseArgs ("--package":n:ns) = Pkg n : (parseArgs ns)
467−parseArgs ("-p":n:ns) = Pkg n : (parseArgs ns)
468−parseArgs ("--build":n:ns) = PkgBuild n : (parseArgs ns)
469−parseArgs ("--install":n:ns) = PkgInstall n : (parseArgs ns)
470−parseArgs ("--clean":n:ns) = PkgClean n : (parseArgs ns)
471−parseArgs ("--bytecode":n:ns) = NoREPL : BCAsm n : (parseArgs ns)
472−parseArgs ("--fovm":n:ns) = NoREPL : FOVM n : (parseArgs ns)
473−parseArgs ("-S":ns) = OutputTy Raw : (parseArgs ns)
474−parseArgs ("-c":ns) = OutputTy Object : (parseArgs ns)
475−parseArgs ("--dumpdefuns":n:ns) = DumpDefun n : (parseArgs ns)
476−parseArgs ("--dumpcases":n:ns) = DumpCases n : (parseArgs ns)
477−parseArgs ("--target":n:ns) = UseTarget (parseTarget n) : (parseArgs ns)
478−parseArgs (n:ns) = Filename n : (parseArgs ns)
461+parseArgs ("--quiet":ns) = Quiet : (parseArgs ns)
462+parseArgs ("--log":lvl:ns) = OLogging (read lvl) : (parseArgs ns)
463+parseArgs ("--noprelude":ns) = NoPrelude : (parseArgs ns)
464+parseArgs ("--check":ns) = NoREPL : (parseArgs ns)
465+parseArgs ("-o":n:ns) = NoREPL : Output n : (parseArgs ns)
466+parseArgs ("-no":n:ns) = NoREPL : NewOutput n : (parseArgs ns)
467+parseArgs ("--typecase":ns) = TypeCase : (parseArgs ns)
468+parseArgs ("--typeintype":ns) = TypeInType : (parseArgs ns)
469+parseArgs ("--total":ns) = DefaultTotal : (parseArgs ns)
470+parseArgs ("--partial":ns) = DefaultPartial : (parseArgs ns)
471+parseArgs ("--warnpartial":ns) = WarnPartial : (parseArgs ns)
472+parseArgs ("--nocoverage":ns) = NoCoverage : (parseArgs ns)
473+parseArgs ("--errorcontext":ns) = ErrContext : (parseArgs ns)
474+parseArgs ("--help":ns) = Usage : (parseArgs ns)
475+parseArgs ("--link":ns) = ShowLibs : (parseArgs ns)
476+parseArgs ("--libdir":ns) = ShowLibdir : (parseArgs ns)
477+parseArgs ("--include":ns) = ShowIncs : (parseArgs ns)
478+parseArgs ("--version":ns) = Ver : (parseArgs ns)
479+parseArgs ("--verbose":ns) = Verbose : (parseArgs ns)
480+parseArgs ("--ibcsubdir":n:ns) = IBCSubDir n : (parseArgs ns)
481+parseArgs ("-i":n:ns) = ImportDir n : (parseArgs ns)
482+parseArgs ("--warn":ns) = WarnOnly : (parseArgs ns)
483+parseArgs ("--package":n:ns) = Pkg n : (parseArgs ns)
484+parseArgs ("-p":n:ns) = Pkg n : (parseArgs ns)
485+parseArgs ("--build":n:ns) = PkgBuild n : (parseArgs ns)
486+parseArgs ("--install":n:ns) = PkgInstall n : (parseArgs ns)
487+parseArgs ("--clean":n:ns) = PkgClean n : (parseArgs ns)
488+parseArgs ("--bytecode":n:ns) = NoREPL : BCAsm n : (parseArgs ns)
489+parseArgs ("--fovm":n:ns) = NoREPL : FOVM n : (parseArgs ns)
490+parseArgs ("-S":ns) = OutputTy Raw : (parseArgs ns)
491+parseArgs ("-c":ns) = OutputTy Object : (parseArgs ns)
492+parseArgs ("--dumpdefuns":n:ns) = DumpDefun n : (parseArgs ns)
493+parseArgs ("--dumpcases":n:ns) = DumpCases n : (parseArgs ns)
494+parseArgs ("--target":n:ns) = UseTarget (parseTarget n) : (parseArgs ns)
495+parseArgs ("-XTypeProviders":ns) = Extension TypeProviders : (parseArgs ns)
496+parseArgs (n:ns) = Filename n : (parseArgs ns)
479497
480498helphead =
481499 [ (["Command"], "Arguments", "Purpose", ""),
@@ -510,6 +528,7 @@ idrisMain opts =
510528 xs -> last xs
511529 when (DefaultTotal `elem` opts) $ do i <- getIState
512530 putIState (i { default_total = True })
531+ mapM_ addLangExt (opt getLanguageExt opts)
513532 setREPL runrepl
514533 setQuiet quiet
515534 setVerbose runrepl
@@ -609,6 +628,10 @@ getOutputTy :: Opt -> Maybe OutputType
609628getOutputTy (OutputTy t) = Just t
610629getOutputTy _ = Nothing
611630
631+getLanguageExt :: Opt -> Maybe LanguageExt
632+getLanguageExt (Extension e) = Just e
633+getLanguageExt _ = Nothing
634+
612635opt :: (Opt -> Maybe a) -> [Opt] -> [a]
613636opt = mapMaybe
614637