idris 0.9.18.1 → 0.9.19
raw patch · 217 files changed
+7672/−4024 lines, 217 filesdep −lensdep −xmldep ~annotated-wl-pprintdep ~blaze-htmldep ~blaze-markupPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependencies removed: lens, xml
Dependency ranges changed: annotated-wl-pprint, blaze-html, blaze-markup, directory, utf8-string
API changes (from Hackage documentation)
- Idris.ASTUtils: Field :: (rec -> fld) -> (fld -> rec -> rec) -> Field rec fld
- Idris.ASTUtils: fget :: Field rec fld -> rec -> fld
- Idris.ASTUtils: fmodify :: Field rec fld -> (fld -> fld) -> rec -> rec
- Idris.ASTUtils: fset :: Field rec fld -> fld -> rec -> rec
- Idris.ASTUtils: maybe_default :: a -> Field (Maybe a) a
- Idris.AbsSyntax: iLOG :: String -> Idris ()
- Idris.AbsSyntaxTree: HNF :: PTerm -> Command
- Idris.Core.TT: CheckConv :: Option
- Idris.Core.TT: TTypeInTType :: Option
- Idris.Core.TT: Wk :: (EnvTT n) -> WkEnvTT n
- Idris.Core.TT: bindTC :: TC a -> (a -> TC b) -> TC b
- Idris.Core.TT: data Option
- Idris.Core.TT: failMsg :: String -> TC a
- Idris.Core.TT: intTyWidth :: IntTy -> Int
- Idris.Core.TT: itBitsName :: NativeTy -> [Char]
- Idris.Core.TT: newtype WkEnvTT n
- Idris.Core.TT: pToV' :: Eq n => n -> Int -> TT n -> TT n
- Idris.Core.TT: sParentN :: Name -> String -> SpecialName
- Idris.Core.TT: score :: Err -> Int
- Idris.Core.TT: showEnv' :: (Show a, Eq a) => [(a, Binder (TT a))] -> TT a -> Bool -> [Char]
- Idris.Core.TT: trun :: FC -> TC a -> TC a
- Idris.Core.TT: type WkEnv = WkEnvTT Name
- Idris.Core.TT: vinstances :: Int -> TT n -> Int
- Idris.Core.TT: weakenEnv :: EnvTT n -> EnvTT n
- Idris.Core.TT: weakenTmEnv :: Int -> EnvTT n -> EnvTT n
- Idris.DataOpts: applyDataOptRT :: Name -> Int -> Int -> Bool -> [Term] -> Term
- Idris.DataOpts: class Optimisable term
- Idris.DataOpts: prel :: [Text]
- Idris.DeepSeq: instance NFData ErrorReportPart
- Idris.Directives: disambiguate :: Name -> Idris Name
- Idris.Elab.Term: findInstances :: IState -> Term -> [Name]
- Idris.Elab.Term: resTC' :: (Num a, Eq a) => [TT Name] -> Bool -> [Name] -> a -> Term -> Name -> IState -> StateT (ElabState EState) TC ()
- Idris.Elab.Term: resolveTC :: Bool -> Bool -> Int -> Term -> Name -> IState -> ElabD ()
- Idris.Elab.Term: runTactical :: IState -> FC -> Env -> Term -> ElabD ()
- Idris.Imports: caseSensitive :: (FilePath -> IO Bool) -> FilePath -> IO Bool
- Idris.Imports: doesDirectoryExist' :: FilePath -> IO Bool
- Idris.Imports: doesFileExist' :: FilePath -> IO Bool
- Idris.Imports: ibcPath :: FilePath -> Bool -> FilePath -> FilePath
- Idris.Imports: ibcPathWithFallback :: FilePath -> FilePath -> IO FilePath
- Idris.Imports: lsrcPath :: FilePath -> FilePath
- Idris.Imports: srcPath :: FilePath -> FilePath
- Idris.Prover: assumptionNames :: ElabState EState -> [String]
- Idris.Prover: dumpState :: IState -> ProofState -> Idris ()
- Idris.Prover: elabStep :: ElabState EState -> ElabD a -> Idris (a, ElabState EState)
- Idris.Prover: lifte :: ElabState EState -> ElabD a -> Idris a
- Idris.Prover: ploop :: Name -> Bool -> String -> [String] -> ElabState EState -> Maybe History -> Idris (Term, [String])
- Idris.Prover: prove :: Ctxt OptInfo -> Context -> Bool -> Name -> Type -> Idris ()
- Idris.Prover: proverSettings :: ElabState EState -> Settings Idris
- Idris.Prover: receiveInput :: Handle -> ElabState EState -> Idris (Maybe String)
- Idris.REPL: banner :: [Char]
- Idris.REPL: defaultPort :: PortID
- Idris.REPL: displayHelp :: [Char]
- Idris.REPL: edit :: FilePath -> IState -> Idris ()
- Idris.REPL: execScript :: String -> Idris ()
- Idris.REPL: getBC :: Opt -> Maybe String
- Idris.REPL: getCPU :: Opt -> Maybe String
- Idris.REPL: getCodegen :: Opt -> Maybe Codegen
- Idris.REPL: getColour :: Opt -> Maybe Bool
- Idris.REPL: getConsoleWidth :: Opt -> Maybe ConsoleWidth
- Idris.REPL: getEvalExpr :: Opt -> Maybe String
- Idris.REPL: getExecScript :: Opt -> Maybe String
- Idris.REPL: getFile :: Opt -> Maybe String
- Idris.REPL: getIBCSubDir :: Opt -> Maybe String
- Idris.REPL: getIdrisUserDataDir :: Idris FilePath
- Idris.REPL: getImportDir :: Opt -> Maybe String
- Idris.REPL: getInitScript :: Idris FilePath
- Idris.REPL: getLanguageExt :: Opt -> Maybe LanguageExt
- Idris.REPL: getOptLevel :: Opt -> Maybe Int
- Idris.REPL: getOptimisation :: Opt -> Maybe (Idris ())
- Idris.REPL: getOutput :: Opt -> Maybe String
- Idris.REPL: getOutputTy :: Opt -> Maybe OutputType
- Idris.REPL: getPkgDir :: Opt -> Maybe String
- Idris.REPL: getPkgIndex :: Opt -> Maybe FilePath
- Idris.REPL: getTriple :: Opt -> Maybe String
- Idris.REPL: helphead :: [([[Char]], CmdArg, [Char])]
- Idris.REPL: ideModeForceTermImplicits :: Handle -> Integer -> [(Name, Bool)] -> Bool -> Term -> Idris ()
- Idris.REPL: idemode :: Handle -> IState -> [FilePath] -> Idris ()
- Idris.REPL: idemodeProcess :: FilePath -> Command -> Idris ()
- Idris.REPL: idemodeStart :: Bool -> IState -> [FilePath] -> Idris ()
- Idris.REPL: initIdemodeSocket :: IO Handle
- Idris.REPL: initScript :: Idris ()
- Idris.REPL: insertScript :: String -> [String] -> [String]
- Idris.REPL: lit :: FilePath -> Bool
- Idris.REPL: mkPrompt :: [FilePath] -> [Char]
- Idris.REPL: pprintDef :: Name -> Idris [Doc OutputAnnotation]
- Idris.REPL: process :: FilePath -> Command -> Idris ()
- Idris.REPL: processInput :: String -> IState -> [FilePath] -> FilePath -> Idris (Maybe [FilePath])
- Idris.REPL: processNetCmd :: IState -> IState -> Handle -> FilePath -> String -> IO (IState, FilePath)
- Idris.REPL: proofs :: IState -> Idris ()
- Idris.REPL: removeProof :: Name -> Idris ()
- Idris.REPL: repl :: IState -> [FilePath] -> FilePath -> InputT Idris ()
- Idris.REPL: replSettings :: Maybe FilePath -> Settings Idris
- Idris.REPL: resolveProof :: Name -> Idris Name
- Idris.REPL: runIdeModeCommand :: Handle -> Integer -> IState -> FilePath -> [FilePath] -> IdeModeCommand -> Idris ()
- Idris.REPL: showTotal :: Totality -> IState -> Doc OutputAnnotation
- Idris.REPL: showTotalN :: IState -> Name -> Doc OutputAnnotation
- Idris.REPL: splitName :: String -> Either String Name
- Idris.REPL: startServer :: PortID -> IState -> [FilePath] -> Idris ()
- Idris.REPL: warranty :: [Char]
- Idris.Reflection: claimTT :: Name -> ElabD Name
- Idris.Reflection: data RArg
- Idris.Reflection: instance Show RArg
- Idris.Reflection: rArgToPArg :: RArg -> PArg
- Idris.Reflection: tcArgName :: RTyConArg -> Name
- Idris.Reflection: tcArgTy :: RTyConArg -> Raw
+ IRTS.JavaScript.AST: JSDelete :: JS -> JS
+ Idris.AbsSyntax: getDumpHighlighting :: Idris Bool
+ Idris.AbsSyntax: setDepth :: Maybe Int -> Idris ()
+ Idris.AbsSyntax: setEvalTypes :: Bool -> Idris ()
+ Idris.AbsSyntax: typeDescription :: String
+ Idris.AbsSyntaxTree: CodegenArgs :: String -> Opt
+ Idris.AbsSyntaxTree: DeclRule :: [SSymbol] -> [PDecl] -> Syntax
+ Idris.AbsSyntaxTree: DumpHighlights :: Opt
+ Idris.AbsSyntaxTree: EAbandon :: ElabShellCmd
+ Idris.AbsSyntaxTree: ECheck :: PTerm -> ElabShellCmd
+ Idris.AbsSyntaxTree: EDocStr :: (Either Name Const) -> ElabShellCmd
+ Idris.AbsSyntaxTree: EEval :: PTerm -> ElabShellCmd
+ Idris.AbsSyntaxTree: EProofState :: ElabShellCmd
+ Idris.AbsSyntaxTree: EProofTerm :: ElabShellCmd
+ Idris.AbsSyntaxTree: EQED :: ElabShellCmd
+ Idris.AbsSyntaxTree: ESearch :: PTerm -> ElabShellCmd
+ Idris.AbsSyntaxTree: EUndo :: ElabShellCmd
+ Idris.AbsSyntaxTree: EvalTypes :: Opt
+ Idris.AbsSyntaxTree: MakeCase :: Bool -> Int -> Name -> Command
+ Idris.AbsSyntaxTree: PConstSugar :: FC -> PTerm -> PTerm
+ Idris.AbsSyntaxTree: PEGenerated :: FnOpt
+ Idris.AbsSyntaxTree: PRunElabDecl :: FC -> t -> [String] -> PDecl' t
+ Idris.AbsSyntaxTree: SetPrinterDepth :: (Maybe Int) -> Command
+ Idris.AbsSyntaxTree: TryImplicit :: PAltType
+ Idris.AbsSyntaxTree: WHNF :: PTerm -> Command
+ Idris.AbsSyntaxTree: annotationColour :: IState -> OutputAnnotation -> Maybe IdrisColour
+ Idris.AbsSyntaxTree: data ElabShellCmd
+ Idris.AbsSyntaxTree: idris_highlightedRegions :: IState -> [(FC, OutputAnnotation)]
+ Idris.AbsSyntaxTree: idris_parserHighlights :: IState -> [(FC, OutputAnnotation)]
+ Idris.AbsSyntaxTree: instance Data Using
+ Idris.AbsSyntaxTree: instance Eq ElabShellCmd
+ Idris.AbsSyntaxTree: instance Show ElabShellCmd
+ Idris.AbsSyntaxTree: instance Typeable Using
+ Idris.AbsSyntaxTree: mapPDataFC :: (FC -> FC) -> (FC -> FC) -> PData -> PData
+ Idris.AbsSyntaxTree: mapPDeclFC :: (FC -> FC) -> (FC -> FC) -> PDecl -> PDecl
+ Idris.AbsSyntaxTree: mapPTermFC :: (FC -> FC) -> (FC -> FC) -> PTerm -> PTerm
+ Idris.AbsSyntaxTree: opt_evaltypes :: IOption -> Bool
+ Idris.AbsSyntaxTree: opt_printdepth :: IOption -> Maybe Int
+ Idris.AbsSyntaxTree: ppopt_depth :: PPOption -> Maybe Int
+ Idris.AbsSyntaxTree: ppopt_pinames :: PPOption -> Bool
+ Idris.AbsSyntaxTree: showTmOpts :: PPOption -> PTerm -> String
+ Idris.Colours: hEndColourise :: Handle -> IdrisColour -> IO ()
+ Idris.Colours: hStartColourise :: Handle -> IdrisColour -> IO ()
+ Idris.Core.DeepSeq: instance NFData ErrorReportPart
+ Idris.Core.Elaborate: addPSname :: Name -> Elab' aux ()
+ Idris.Core.Elaborate: getPSnames :: Elab' aux [Name]
+ Idris.Core.Elaborate: get_usedns :: Elab' aux [Name]
+ Idris.Core.Elaborate: patvar' :: Name -> Elab' aux ()
+ Idris.Core.Elaborate: transformErr :: (Err -> Err) -> Elab' aux a -> Elab' aux a
+ Idris.Core.Evaluate: Generated :: Totality
+ Idris.Core.Evaluate: quoteTerm :: Value -> TT Name
+ Idris.Core.Evaluate: toValue :: Context -> Env -> TT Name -> Value
+ Idris.Core.ProofState: psnames :: ProofState -> [Name]
+ Idris.Core.TT: AnnAntiquote :: OutputAnnotation
+ Idris.Core.TT: AnnLink :: String -> OutputAnnotation
+ Idris.Core.TT: AnnQuasiquote :: OutputAnnotation
+ Idris.Core.TT: NoValidAlts :: [Name] -> Err' t
+ Idris.Core.TT: RawPart :: Raw -> ErrorReportPart
+ Idris.Core.TT: RunningElabScript :: (Err' t) -> Err' t
+ Idris.Core.TT: fcIn :: FC -> FC -> Bool
+ Idris.Core.TT: instance Eq NameOutput
+ Idris.Core.TT: instance Eq OutputAnnotation
+ Idris.Core.TT: instance Eq TextFormatting
+ Idris.Core.TT: localnames :: Binder b -> [Name]
+ Idris.Core.TT: pprintRaw :: [Name] -> Raw -> Doc OutputAnnotation
+ Idris.Core.TT: termSmallerThan :: Int -> Term -> Bool
+ Idris.Core.WHNF: data WEnv
+ Idris.Core.WHNF: instance Show WEnv
+ Idris.Core.WHNF: whnf :: Context -> Term -> Term
+ Idris.Delaborate: delabSugared :: IState -> Term -> PTerm
+ Idris.Delaborate: resugar :: IState -> PTerm -> PTerm
+ Idris.Docs: pprintTypeDoc :: IState -> Doc OutputAnnotation
+ Idris.Elab.RunElab: elabRunElab :: ElabInfo -> FC -> PTerm -> [String] -> Idris ()
+ Idris.Elab.Term: ETransLHS :: ElabMode
+ Idris.Elab.Term: isPlausible :: IState -> Bool -> Env -> Name -> Type -> Bool
+ Idris.Elab.Term: metavarName :: Maybe [String] -> Name -> Name
+ Idris.Elab.Term: resolveTC' :: Bool -> Bool -> Int -> Term -> Name -> IState -> ElabD ()
+ Idris.Elab.Term: runElabAction :: IState -> FC -> Env -> Term -> [String] -> ElabD Term
+ Idris.Elab.Value: elabREPL :: ElabInfo -> ElabMode -> PTerm -> Idris (Term, Type)
+ Idris.IBC: hasValidIBCVersion :: FilePath -> Idris Bool
+ Idris.IdeMode: MakeCaseBlock :: Int -> String -> IdeModeCommand
+ Idris.IdeMode: sExpToString :: SExp -> String
+ Idris.Interactive: makeCase :: FilePath -> Bool -> Int -> Name -> Idris ()
+ Idris.Output: clearHighlights :: Idris ()
+ Idris.Output: hWriteDoc :: Handle -> IState -> SimpleDoc OutputAnnotation -> Idris ()
+ Idris.Output: sendParserHighlighting :: Idris ()
+ Idris.Output: writeHighlights :: FilePath -> Idris ()
+ Idris.ParseExpr: instance Show SynMatch
+ Idris.ParseExpr: updateSynMatch :: [(Name, SynMatch)] -> PTerm -> PTerm
+ Idris.ParseHelpers: commaSeparated :: MonadicParsing m => m a -> m [a]
+ Idris.ParseHelpers: highlightP :: FC -> OutputAnnotation -> IdrisParser ()
+ Idris.ParseHelpers: lcharFC :: MonadicParsing m => Char -> m FC
+ Idris.ParseHelpers: reservedHL :: String -> IdrisParser ()
+ Idris.ParseHelpers: symbolFC :: MonadicParsing m => String -> m FC
+ Idris.Parser: declExtension :: SyntaxInfo -> [Maybe (Name, SynMatch)] -> [Syntax] -> IdrisParser [PDecl]
+ Idris.Parser: declExtensions :: SyntaxInfo -> [Syntax] -> IdrisParser [PDecl]
+ Idris.Parser: externalDecl :: SyntaxInfo -> IdrisParser [PDecl]
+ Idris.Parser: internalDecl :: SyntaxInfo -> IdrisParser [PDecl]
+ Idris.Parser: parseElabShellStep :: IState -> String -> Result (Either ElabShellCmd PDo)
+ Idris.Parser: runElabDecl :: SyntaxInfo -> IdrisParser PDecl
+ Idris.ProofSearch: resolveTC :: Bool -> Bool -> Int -> Term -> Name -> (PTerm -> ElabD ()) -> IState -> ElabD ()
+ Idris.Prover: showRunElab :: Bool -> Name -> [String] -> String
+ Idris.Reflection: RCtorField :: RFunArg -> RCtorArg
+ Idris.Reflection: RCtorParameter :: RFunArg -> RCtorArg
+ Idris.Reflection: RErased :: RErasure
+ Idris.Reflection: RFunArg :: Name -> Raw -> RPlicity -> RErasure -> RFunArg
+ Idris.Reflection: RNotErased :: RErasure
+ Idris.Reflection: argPlicity :: RFunArg -> RPlicity
+ Idris.Reflection: claimTy :: Name -> Raw -> ElabD Name
+ Idris.Reflection: data RCtorArg
+ Idris.Reflection: data RErasure
+ Idris.Reflection: data RFunArg
+ Idris.Reflection: data RPlicity
+ Idris.Reflection: erasure :: RFunArg -> RErasure
+ Idris.Reflection: getArgs :: [PArg] -> Raw -> ([RFunArg], Raw)
+ Idris.Reflection: instance Show RCtorArg
+ Idris.Reflection: instance Show RErasure
+ Idris.Reflection: instance Show RFunArg
+ Idris.Reflection: instance Show RPlicity
+ Idris.Reflection: intToReflectedNat :: Int -> Raw
+ Idris.Reflection: rArgOpts :: RErasure -> [ArgOpt]
+ Idris.Reflection: rFunArgToPArg :: RFunArg -> PArg
+ Idris.Reflection: rawTriple :: (Raw, Raw, Raw) -> (Raw, Raw, Raw) -> Raw
+ Idris.Reflection: rawTripleTy :: Raw -> Raw -> Raw -> Raw
+ Idris.Reflection: reflectArg :: RFunArg -> Raw
+ Idris.Reflection: reflectCtorArg :: RCtorArg -> Raw
+ Idris.Reflection: reflectErasure :: RErasure -> Raw
+ Idris.Reflection: reflectFixity :: Fixity -> Raw
+ Idris.Reflection: reflectPlicity :: RPlicity -> Raw
+ Idris.Reflection: reifyBool :: Term -> ElabD Bool
+ Idris.Reflection: reifyEnv :: Term -> ElabD Env
+ Idris.Reflection: reifyErasure :: Term -> ElabD RErasure
+ Idris.Reflection: reifyInt :: Term -> ElabD Int
+ Idris.Reflection: reifyList :: (Term -> ElabD a) -> Term -> ElabD [a]
+ Idris.Reflection: reifyPair :: (Term -> ElabD a) -> (Term -> ElabD b) -> Term -> ElabD (a, b)
+ Idris.Reflection: reifyPlicity :: Term -> ElabD RPlicity
+ Idris.Reflection: reifyRFunArg :: Term -> ElabD RFunArg
+ Idris.Reflection: reifyUniverse :: Term -> ElabD Universe
+ Idris.Reflection: unApplyRaw :: Raw -> (Raw, [Raw])
+ Pkg.Package: inPkgDir :: PkgDesc -> IO a -> IO a
+ Util.System: isATTY :: IO Bool
+ Util.System: writeSourceText :: FilePath -> Text -> IO ()
- Idris.AbsSyntax: addDeferred :: [(Name, (Int, Maybe Name, Type, Bool))] -> Idris ()
+ Idris.AbsSyntax: addDeferred :: [(Name, (Int, Maybe Name, Type, [Name], Bool))] -> Idris ()
- Idris.AbsSyntax: addDeferred' :: NameType -> [(Name, (Int, Maybe Name, Type, Bool))] -> Idris ()
+ Idris.AbsSyntax: addDeferred' :: NameType -> [(Name, (Int, Maybe Name, Type, [Name], Bool))] -> Idris ()
- Idris.AbsSyntax: addDeferredTyCon :: [(Name, (Int, Maybe Name, Type, Bool))] -> Idris ()
+ Idris.AbsSyntax: addDeferredTyCon :: [(Name, (Int, Maybe Name, Type, [Name], Bool))] -> Idris ()
- Idris.AbsSyntax: mkUniqueNames :: [Name] -> PTerm -> PTerm
+ Idris.AbsSyntax: mkUniqueNames :: [Name] -> [(Name, Name)] -> PTerm -> PTerm
- Idris.AbsSyntaxTree: DErrorHandlers :: Name -> Name -> [Name] -> Directive
+ Idris.AbsSyntaxTree: DErrorHandlers :: Name -> FC -> Name -> FC -> [(Name, FC)] -> Directive
- Idris.AbsSyntaxTree: DNameHint :: Name -> [Name] -> Directive
+ Idris.AbsSyntaxTree: DNameHint :: Name -> FC -> [(Name, FC)] -> Directive
- Idris.AbsSyntaxTree: IOption :: Int -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Codegen -> OutputType -> FilePath -> [FilePath] -> String -> String -> [Opt] -> Bool -> Bool -> [FilePath] -> [Optimisation] -> IOption
+ Idris.AbsSyntaxTree: IOption :: Int -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Codegen -> OutputType -> FilePath -> [FilePath] -> String -> String -> [Opt] -> Bool -> Bool -> [FilePath] -> [Optimisation] -> Maybe Int -> Bool -> IOption
- Idris.AbsSyntaxTree: IState :: Context -> Set ConstraintFC -> [FixDecl] -> Ctxt [PArg] -> Ctxt [Bool] -> Ctxt ClassInfo -> Ctxt DSL -> Ctxt OptInfo -> Ctxt TypeInfo -> Ctxt [Name] -> Ctxt ([([Name], Term, Term)], [PTerm]) -> Ctxt [FnOpt] -> Ctxt CGInfo -> Ctxt [Name] -> Ctxt (Docstring DocTerm, [(Name, Docstring DocTerm)]) -> Ctxt (Docstring DocTerm) -> Ctxt TIData -> Ctxt FnInfo -> Ctxt [(Term, Term)] -> Ctxt [Name] -> [(FC, Name)] -> [(FC, Name)] -> [(FC, String)] -> IOption -> Int -> [((FilePath, Int), PTerm)] -> [(Name, (Maybe Name, Int, Bool))] -> [Name] -> [(Term, Term)] -> SyntaxRules -> [String] -> [FilePath] -> [(Name, (Int, PrimFn))] -> [(Codegen, FilePath)] -> [(Codegen, String)] -> [(Codegen, String)] -> [(Codegen, String)] -> [(FilePath, Bool)] -> [(Name, [String])] -> Maybe FC -> [(FC, Err)] -> Maybe Name -> [Int] -> [Maybe Int] -> Maybe FC -> Maybe FC -> [(Name, Maybe Accessibility)] -> Accessibility -> Bool -> [IBCWrite] -> Maybe String -> [DynamicLib] -> [LanguageExt] -> OutputMode -> Bool -> ColourTheme -> [Name] -> (Int, Ctxt (Int, Name)) -> Ctxt (Map Name (Set Name)) -> Map [Text] [Text] -> ConsoleWidth -> Set Name -> Set (Name, Int) -> [(Name, Int)] -> Maybe (Map Name [Name]) -> Maybe (Map Name [Name]) -> [Name] -> [(Name, Bool)] -> Map Name Name -> [Name] -> IState
+ Idris.AbsSyntaxTree: IState :: Context -> Set ConstraintFC -> [FixDecl] -> Ctxt [PArg] -> Ctxt [Bool] -> Ctxt ClassInfo -> Ctxt DSL -> Ctxt OptInfo -> Ctxt TypeInfo -> Ctxt [Name] -> Ctxt ([([Name], Term, Term)], [PTerm]) -> Ctxt [FnOpt] -> Ctxt CGInfo -> Ctxt [Name] -> Ctxt (Docstring DocTerm, [(Name, Docstring DocTerm)]) -> Ctxt (Docstring DocTerm) -> Ctxt TIData -> Ctxt FnInfo -> Ctxt [(Term, Term)] -> Ctxt [Name] -> [(FC, Name)] -> [(FC, Name)] -> [(FC, String)] -> IOption -> Int -> [((FilePath, Int), PTerm)] -> [(Name, (Maybe Name, Int, [Name], Bool))] -> [Name] -> [(Term, Term)] -> SyntaxRules -> [String] -> [FilePath] -> [(Name, (Int, PrimFn))] -> [(Codegen, FilePath)] -> [(Codegen, String)] -> [(Codegen, String)] -> [(Codegen, String)] -> [(FilePath, Bool)] -> [(Name, (Bool, [String]))] -> Maybe FC -> [(FC, Err)] -> Maybe Name -> [Int] -> [Maybe Int] -> Maybe FC -> Maybe FC -> [(Name, Maybe Accessibility)] -> Accessibility -> Bool -> [IBCWrite] -> Maybe String -> [DynamicLib] -> [LanguageExt] -> OutputMode -> Bool -> ColourTheme -> [Name] -> (Int, Ctxt (Int, Name)) -> Ctxt (Map Name (Set Name)) -> Map [Text] [Text] -> ConsoleWidth -> Set Name -> Set (Name, Int) -> [(Name, Int)] -> Maybe (Map Name [Name]) -> Maybe (Map Name [Name]) -> [Name] -> [(Name, Bool)] -> Map Name Name -> [Name] -> [(FC, OutputAnnotation)] -> [(FC, OutputAnnotation)] -> IState
- Idris.AbsSyntaxTree: PAlternative :: PAltType -> [PTerm] -> PTerm
+ Idris.AbsSyntaxTree: PAlternative :: [(Name, Name)] -> PAltType -> [PTerm] -> PTerm
- Idris.AbsSyntaxTree: PClass :: (Docstring (Either Err PTerm)) -> SyntaxInfo -> FC -> [(Name, t)] -> Name -> FC -> [(Name, FC, t)] -> [(Name, Docstring (Either Err PTerm))] -> [(Name, FC)] -> [PDecl' t] -> (Maybe (Name, FC)) -> (Docstring (Either Err PTerm)) -> PDecl' t
+ Idris.AbsSyntaxTree: PClass :: (Docstring (Either Err t)) -> SyntaxInfo -> FC -> [(Name, t)] -> Name -> FC -> [(Name, FC, t)] -> [(Name, Docstring (Either Err t))] -> [(Name, FC)] -> [PDecl' t] -> (Maybe (Name, FC)) -> (Docstring (Either Err t)) -> PDecl' t
- Idris.AbsSyntaxTree: PDPair :: FC -> PunInfo -> PTerm -> PTerm -> PTerm -> PTerm
+ Idris.AbsSyntaxTree: PDPair :: FC -> [FC] -> PunInfo -> PTerm -> PTerm -> PTerm -> PTerm
- Idris.AbsSyntaxTree: PData :: (Docstring (Either Err PTerm)) -> [(Name, Docstring (Either Err PTerm))] -> SyntaxInfo -> FC -> DataOpts -> (PData' t) -> PDecl' t
+ Idris.AbsSyntaxTree: PData :: (Docstring (Either Err t)) -> [(Name, Docstring (Either Err t))] -> SyntaxInfo -> FC -> DataOpts -> (PData' t) -> PDecl' t
- Idris.AbsSyntaxTree: PInferRef :: FC -> Name -> PTerm
+ Idris.AbsSyntaxTree: PInferRef :: FC -> [FC] -> Name -> PTerm
- Idris.AbsSyntaxTree: PInstance :: (Docstring (Either Err PTerm)) -> [(Name, Docstring (Either Err PTerm))] -> SyntaxInfo -> FC -> [(Name, t)] -> Name -> FC -> [t] -> t -> (Maybe Name) -> [PDecl' t] -> PDecl' t
+ Idris.AbsSyntaxTree: PInstance :: (Docstring (Either Err t)) -> [(Name, Docstring (Either Err t))] -> SyntaxInfo -> FC -> [(Name, t)] -> Name -> FC -> [t] -> t -> (Maybe Name) -> [PDecl' t] -> PDecl' t
- Idris.AbsSyntaxTree: PPOption :: Bool -> PPOption
+ Idris.AbsSyntaxTree: PPOption :: Bool -> Bool -> Maybe Int -> PPOption
- Idris.AbsSyntaxTree: PPair :: FC -> PunInfo -> PTerm -> PTerm -> PTerm
+ Idris.AbsSyntaxTree: PPair :: FC -> [FC] -> PunInfo -> PTerm -> PTerm -> PTerm
- Idris.AbsSyntaxTree: PPostulate :: Bool -> (Docstring (Either Err PTerm)) -> SyntaxInfo -> FC -> FnOpts -> Name -> t -> PDecl' t
+ Idris.AbsSyntaxTree: PPostulate :: Bool -> (Docstring (Either Err t)) -> SyntaxInfo -> FC -> FC -> FnOpts -> Name -> t -> PDecl' t
- Idris.AbsSyntaxTree: PProvider :: (Docstring (Either Err PTerm)) -> SyntaxInfo -> FC -> (ProvideWhat' t) -> Name -> PDecl' t
+ Idris.AbsSyntaxTree: PProvider :: (Docstring (Either Err t)) -> SyntaxInfo -> FC -> FC -> (ProvideWhat' t) -> Name -> PDecl' t
- Idris.AbsSyntaxTree: PQuoteName :: Name -> PTerm
+ Idris.AbsSyntaxTree: PQuoteName :: Name -> FC -> PTerm
- Idris.AbsSyntaxTree: PRecord :: (Docstring (Either Err PTerm)) -> SyntaxInfo -> FC -> DataOpts -> Name -> FC -> [(Name, FC, Plicity, t)] -> [(Name, Docstring (Either Err PTerm))] -> [(Maybe (Name, FC), Plicity, t, Maybe (Docstring (Either Err PTerm)))] -> (Maybe (Name, FC)) -> (Docstring (Either Err PTerm)) -> SyntaxInfo -> PDecl' t
+ Idris.AbsSyntaxTree: PRecord :: (Docstring (Either Err t)) -> SyntaxInfo -> FC -> DataOpts -> Name -> FC -> [(Name, FC, Plicity, t)] -> [(Name, Docstring (Either Err t))] -> [(Maybe (Name, FC), Plicity, t, Maybe (Docstring (Either Err t)))] -> (Maybe (Name, FC)) -> (Docstring (Either Err t)) -> SyntaxInfo -> PDecl' t
- Idris.AbsSyntaxTree: PRef :: FC -> Name -> PTerm
+ Idris.AbsSyntaxTree: PRef :: FC -> [FC] -> Name -> PTerm
- Idris.AbsSyntaxTree: PRunElab :: FC -> PTerm -> PTerm
+ Idris.AbsSyntaxTree: PRunElab :: FC -> PTerm -> [String] -> PTerm
- Idris.AbsSyntaxTree: PTy :: (Docstring (Either Err PTerm)) -> [(Name, Docstring (Either Err PTerm))] -> SyntaxInfo -> FC -> FnOpts -> Name -> FC -> t -> PDecl' t
+ Idris.AbsSyntaxTree: PTy :: (Docstring (Either Err t)) -> [(Name, Docstring (Either Err t))] -> SyntaxInfo -> FC -> FnOpts -> Name -> FC -> t -> PDecl' t
- Idris.AbsSyntaxTree: ProofSearch :: Bool -> Bool -> Int -> (Maybe Name) -> [Name] -> PTactic' t
+ Idris.AbsSyntaxTree: ProofSearch :: Bool -> Bool -> Int -> (Maybe Name) -> [Name] -> [Name] -> PTactic' t
- Idris.AbsSyntaxTree: Prove :: Name -> Command
+ Idris.AbsSyntaxTree: Prove :: Bool -> Name -> Command
- Idris.AbsSyntaxTree: idris_metavars :: IState -> [(Name, (Maybe Name, Int, Bool))]
+ Idris.AbsSyntaxTree: idris_metavars :: IState -> [(Name, (Maybe Name, Int, [Name], Bool))]
- Idris.AbsSyntaxTree: proof_list :: IState -> [(Name, [String])]
+ Idris.AbsSyntaxTree: proof_list :: IState -> [(Name, (Bool, [String]))]
- Idris.Core.Elaborate: debugElaborator :: Maybe String -> Elab' aux a
+ Idris.Core.Elaborate: debugElaborator :: [ErrorReportPart] -> Elab' aux a
- Idris.Core.Evaluate: addCasedef :: Name -> ErasureInfo -> CaseInfo -> Bool -> SC -> Bool -> Bool -> [Type] -> [Int] -> [Either Term (Term, Term)] -> [([Name], Term, Term)] -> [([Name], Term, Term)] -> [([Name], Term, Term)] -> [([Name], Term, Term)] -> Type -> Context -> Context
+ Idris.Core.Evaluate: addCasedef :: Name -> ErasureInfo -> CaseInfo -> Bool -> SC -> Bool -> Bool -> [Type] -> [Int] -> [Either Term (Term, Term)] -> [([Name], Term, Term)] -> [([Name], Term, Term)] -> [([Name], Term, Term)] -> [([Name], Term, Term)] -> Type -> Context -> TC Context
- Idris.Core.Evaluate: simplifyCasedef :: Name -> ErasureInfo -> Context -> Context
+ Idris.Core.Evaluate: simplifyCasedef :: Name -> ErasureInfo -> Context -> TC Context
- Idris.Core.ProofState: PS :: Name -> [Name] -> [Name] -> Int -> ProofTerm -> Type -> [Name] -> (Name, [(Name, Term)]) -> [(Name, Term)] -> [(Name, [Name])] -> Maybe (Name, Term) -> Fails -> [Name] -> [Name] -> [Name] -> [(Name, [Name])] -> Maybe ProofState -> Context -> Ctxt TypeInfo -> String -> Bool -> Bool -> [Name] -> [FailContext] -> ProofState
+ Idris.Core.ProofState: PS :: Name -> [Name] -> [Name] -> Int -> ProofTerm -> Type -> [Name] -> (Name, [(Name, Term)]) -> [(Name, Term)] -> [(Name, [Name])] -> Maybe (Name, Term) -> Fails -> [Name] -> [Name] -> [Name] -> [(Name, [Name])] -> [Name] -> Maybe ProofState -> Context -> Ctxt TypeInfo -> String -> Bool -> Bool -> [Name] -> [FailContext] -> ProofState
- Idris.Core.TT: ElabScriptDebug :: (Maybe String) -> t -> [(Name, t, [(Name, Binder t)])] -> Err' t
+ Idris.Core.TT: ElabScriptDebug :: [ErrorReportPart] -> t -> [(Name, t, [(Name, Binder t)])] -> Err' t
- Idris.Core.TT: GHole :: Int -> !b -> Binder b
+ Idris.Core.TT: GHole :: Int -> [Name] -> !b -> Binder b
- Idris.Elab.Provider: elabProvider :: Docstring (Either Err PTerm) -> ElabInfo -> SyntaxInfo -> FC -> ProvideWhat -> Name -> Idris ()
+ Idris.Elab.Provider: elabProvider :: Docstring (Either Err PTerm) -> ElabInfo -> SyntaxInfo -> FC -> FC -> ProvideWhat -> Name -> Idris ()
- Idris.Elab.Record: elabRecord :: ElabInfo -> (Docstring (Either Err PTerm)) -> SyntaxInfo -> FC -> DataOpts -> Name -> FC -> [(Name, FC, Plicity, PTerm)] -> [(Name, Docstring (Either Err PTerm))] -> [(Maybe (Name, FC), Plicity, PTerm, Maybe (Docstring (Either Err PTerm)))] -> Maybe (Name, FC) -> (Docstring (Either Err PTerm)) -> SyntaxInfo -> Idris ()
+ Idris.Elab.Record: elabRecord :: ElabInfo -> ElabWhat -> (Docstring (Either Err PTerm)) -> SyntaxInfo -> FC -> DataOpts -> Name -> FC -> [(Name, FC, Plicity, PTerm)] -> [(Name, Docstring (Either Err PTerm))] -> [(Maybe (Name, FC), Plicity, PTerm, Maybe (Docstring (Either Err PTerm)))] -> Maybe (Name, FC) -> (Docstring (Either Err PTerm)) -> SyntaxInfo -> Idris ()
- Idris.Elab.Term: ElabResult :: Term -> [(Name, (Int, Maybe Name, Type))] -> [PDecl] -> Context -> [RDeclInstructions] -> [(FC, OutputAnnotation)] -> ElabResult
+ Idris.Elab.Term: ElabResult :: Term -> [(Name, (Int, Maybe Name, Type, [Name]))] -> [PDecl] -> Context -> [RDeclInstructions] -> [(FC, OutputAnnotation)] -> ElabResult
- Idris.Elab.Term: collectDeferred :: Maybe Name -> [Name] -> Context -> Term -> State [(Name, (Int, Maybe Name, Type))] Term
+ Idris.Elab.Term: collectDeferred :: Maybe Name -> [Name] -> Context -> Term -> State [(Name, (Int, Maybe Name, Type, [Name]))] Term
- Idris.Elab.Term: proofSearch' :: IState -> Bool -> Bool -> Int -> Bool -> Maybe Name -> Name -> [Name] -> StateT (ElabState EState) TC ()
+ Idris.Elab.Term: proofSearch' :: IState -> Bool -> Bool -> Int -> Bool -> Maybe Name -> Name -> [Name] -> [Name] -> StateT (ElabState EState) TC ()
- Idris.Elab.Term: pruneByType :: [Name] -> Term -> Context -> [PTerm] -> [PTerm]
+ Idris.Elab.Term: pruneByType :: Env -> Term -> IState -> [PTerm] -> [PTerm]
- Idris.Elab.Term: resultMetavars :: ElabResult -> [(Name, (Int, Maybe Name, Type))]
+ Idris.Elab.Term: resultMetavars :: ElabResult -> [(Name, (Int, Maybe Name, Type, [Name]))]
- Idris.Elab.Term: trivialHoles' :: [(Name, Int)] -> IState -> ElabD ()
+ Idris.Elab.Term: trivialHoles' :: [Name] -> [(Name, Int)] -> IState -> ElabD ()
- Idris.Elab.Type: elabExtern :: ElabInfo -> SyntaxInfo -> Docstring (Either Err PTerm) -> FC -> FnOpts -> Name -> PTerm -> Idris ()
+ Idris.Elab.Type: elabExtern :: ElabInfo -> SyntaxInfo -> Docstring (Either Err PTerm) -> FC -> FC -> FnOpts -> Name -> PTerm -> Idris ()
- Idris.Elab.Type: elabPostulate :: ElabInfo -> SyntaxInfo -> Docstring (Either Err PTerm) -> FC -> FnOpts -> Name -> PTerm -> Idris ()
+ Idris.Elab.Type: elabPostulate :: ElabInfo -> SyntaxInfo -> Docstring (Either Err PTerm) -> FC -> FC -> FnOpts -> Name -> PTerm -> Idris ()
- Idris.Elab.Utils: checkAddDef :: Bool -> Bool -> FC -> (Name -> Err -> Err) -> [(Name, (Int, Maybe Name, Type))] -> Idris [(Name, (Int, Maybe Name, Type))]
+ Idris.Elab.Utils: checkAddDef :: Bool -> Bool -> FC -> (Name -> Err -> Err) -> [(Name, (Int, Maybe Name, Type, [Name]))] -> Idris [(Name, (Int, Maybe Name, Type, [Name]))]
- Idris.Elab.Utils: checkDef :: FC -> (Name -> Err -> Err) -> [(Name, (Int, Maybe Name, Type))] -> Idris [(Name, (Int, Maybe Name, Type))]
+ Idris.Elab.Utils: checkDef :: FC -> (Name -> Err -> Err) -> [(Name, (Int, Maybe Name, Type, [Name]))] -> Idris [(Name, (Int, Maybe Name, Type, [Name]))]
- Idris.ParseExpr: SynBind :: Name -> SynMatch
+ Idris.ParseExpr: SynBind :: FC -> Name -> SynMatch
- Idris.ParseExpr: bracketedExpr :: SyntaxInfo -> PTerm -> IdrisParser PTerm
+ Idris.ParseExpr: bracketedExpr :: SyntaxInfo -> FC -> PTerm -> IdrisParser PTerm
- Idris.ProofSearch: proofSearch :: Bool -> Bool -> Bool -> Bool -> Int -> (PTerm -> ElabD ()) -> Maybe Name -> Name -> [Name] -> IState -> ElabD ()
+ Idris.ProofSearch: proofSearch :: Bool -> Bool -> Bool -> Bool -> Int -> (PTerm -> ElabD ()) -> Maybe Name -> Name -> [Name] -> [Name] -> IState -> ElabD ()
- Idris.ProofSearch: trivialHoles :: [(Name, Int)] -> (PTerm -> ElabD ()) -> IState -> ElabD ()
+ Idris.ProofSearch: trivialHoles :: [Name] -> [(Name, Int)] -> (PTerm -> ElabD ()) -> IState -> ElabD ()
- Idris.Prover: prover :: Bool -> Name -> Idris ()
+ Idris.Prover: prover :: Bool -> Bool -> Name -> Idris ()
- Idris.Reflection: RConstraint :: Name -> Raw -> RArg
+ Idris.Reflection: RConstraint :: RPlicity
- Idris.Reflection: RDatatype :: Name -> [RTyConArg] -> Raw -> [(Name, Raw)] -> RDatatype
+ Idris.Reflection: RDatatype :: Name -> [RTyConArg] -> Raw -> [(Name, [RCtorArg], Raw)] -> RDatatype
- Idris.Reflection: RDeclare :: Name -> [RArg] -> Raw -> RTyDecl
+ Idris.Reflection: RDeclare :: Name -> [RFunArg] -> Raw -> RTyDecl
- Idris.Reflection: RExplicit :: Name -> Raw -> RArg
+ Idris.Reflection: RExplicit :: RPlicity
- Idris.Reflection: RImplicit :: Name -> Raw -> RArg
+ Idris.Reflection: RImplicit :: RPlicity
- Idris.Reflection: RIndex :: Name -> Raw -> RTyConArg
+ Idris.Reflection: RIndex :: RFunArg -> RTyConArg
- Idris.Reflection: RParameter :: Name -> Raw -> RTyConArg
+ Idris.Reflection: RParameter :: RFunArg -> RTyConArg
- Idris.Reflection: argName :: RArg -> Name
+ Idris.Reflection: argName :: RFunArg -> Name
- Idris.Reflection: argTy :: RArg -> Raw
+ Idris.Reflection: argTy :: RFunArg -> Raw
- Idris.Reflection: buildDatatypes :: Context -> Ctxt TypeInfo -> Name -> [RDatatype]
+ Idris.Reflection: buildDatatypes :: IState -> Name -> [RDatatype]
- Idris.Reflection: reflectBinderQuotePattern :: ([Name] -> a -> ElabD ()) -> [Name] -> Binder a -> ElabD ()
+ Idris.Reflection: reflectBinderQuotePattern :: ([Name] -> a -> ElabD ()) -> Raw -> [Name] -> Binder a -> ElabD ()
Files
- Makefile +4/−1
- idris.cabal +39/−15
- jsrts/Runtime-browser.js +0/−1
- jsrts/Runtime-common.js +27/−13
- jsrts/Runtime-node.js +19/−0
- libs/base/Control/Monad/State.idr +1/−1
- libs/base/Data/Complex.idr +9/−2
- libs/base/Data/Fin.idr +2/−0
- libs/base/Data/HVect.idr +22/−5
- libs/base/Data/List.idr +8/−0
- libs/base/Data/Vect.idr +27/−0
- libs/base/Data/VectType.idr +8/−3
- libs/base/Language/Reflection/Utils.idr +138/−103
- libs/base/System.idr +4/−19
- libs/base/System/Concurrency/Raw.idr +12/−2
- libs/base/base.ipkg +1/−1
- libs/contrib/Control/Algebra.idr +10/−10
- libs/contrib/Control/Algebra/NumericInstances.idr +9/−0
- libs/contrib/Data/Fun.idr +1/−1
- libs/contrib/Data/Heap.idr +2/−2
- libs/contrib/Data/Matrix.idr +32/−124
- libs/contrib/Data/Matrix/Algebraic.idr +149/−0
- libs/contrib/Data/Matrix/Numeric.idr +129/−0
- libs/contrib/Data/Nat.idr +0/−166
- libs/contrib/Data/Nat/DivMod.idr +60/−0
- libs/contrib/Data/Nat/DivMod/IteratedSubtraction.idr +167/−0
- libs/contrib/System/Concurrency/Process.idr +4/−2
- libs/contrib/contrib.ipkg +3/−2
- libs/effects/Effect/Logging/Default.idr +57/−0
- libs/effects/Effect/Logging/Level.idr +49/−0
- libs/effects/Effect/Logging/Simple.idr +48/−0
- libs/effects/Effect/Monad.idr +19/−12
- libs/effects/Effect/Random.idr +0/−1
- libs/effects/Effect/System.idr +2/−2
- libs/effects/Effect/Trans.idr +20/−0
- libs/effects/Effects.idr +2/−4
- libs/effects/effects.ipkg +15/−4
- libs/prelude/Builtins.idr +4/−1
- libs/prelude/Decidable/Equality.idr +22/−1
- libs/prelude/IO.idr +34/−7
- libs/prelude/Language/Reflection.idr +63/−32
- libs/prelude/Language/Reflection/Elab.idr +184/−40
- libs/prelude/Language/Reflection/Errors.idr +1/−0
- libs/prelude/Prelude.idr +27/−310
- libs/prelude/Prelude/Applicative.idr +24/−0
- libs/prelude/Prelude/Basics.idr +3/−3
- libs/prelude/Prelude/Cast.idr +11/−5
- libs/prelude/Prelude/Classes.idr +6/−0
- libs/prelude/Prelude/File.idr +156/−0
- libs/prelude/Prelude/Interactive.idr +142/−0
- libs/prelude/Prelude/List.idr +129/−138
- libs/prelude/Prelude/Maybe.idr +6/−2
- libs/prelude/Prelude/Monad.idr +19/−1
- libs/prelude/Prelude/Nat.idr +80/−299
- libs/prelude/Prelude/Show.idr +190/−0
- libs/prelude/Prelude/Strings.idr +55/−14
- libs/prelude/prelude.ipkg +2/−1
- rts/idris_rts.c +35/−3
- rts/idris_rts.h +7/−1
- rts/idris_stdfgn.c +3/−2
- rts/idris_stdfgn.h +3/−1
- rts/windows/idris_stdfgn.c +2/−2
- src/IRTS/CodegenC.hs +5/−1
- src/IRTS/CodegenJavaScript.hs +90/−199
- src/IRTS/Compiler.hs +7/−7
- src/IRTS/JavaScript/AST.hs +5/−1
- src/Idris/ASTUtils.hs +4/−1
- src/Idris/AbsSyntax.hs +254/−203
- src/Idris/AbsSyntaxTree.hs +497/−255
- src/Idris/CaseSplit.hs +44/−38
- src/Idris/Chaser.hs +20/−20
- src/Idris/CmdOptions.hs +10/−5
- src/Idris/Colours.hs +22/−8
- src/Idris/Completion.hs +1/−1
- src/Idris/Core/Binary.hs +14/−4
- src/Idris/Core/CaseTree.hs +2/−0
- src/Idris/Core/DeepSeq.hs +12/−2
- src/Idris/Core/Elaborate.hs +78/−41
- src/Idris/Core/Evaluate.hs +46/−33
- src/Idris/Core/Execute.hs +1/−1
- src/Idris/Core/ProofState.hs +17/−8
- src/Idris/Core/TT.hs +122/−24
- src/Idris/Core/Typecheck.hs +4/−4
- src/Idris/Core/Unify.hs +12/−0
- src/Idris/Core/WHNF.hs +208/−0
- src/Idris/Coverage.hs +23/−21
- src/Idris/DSL.hs +31/−29
- src/Idris/DataOpts.hs +1/−1
- src/Idris/DeepSeq.hs +27/−20
- src/Idris/Delaborate.hs +172/−84
- src/Idris/Directives.hs +19/−9
- src/Idris/Docs.hs +37/−17
- src/Idris/Docstrings.hs +1/−2
- src/Idris/Elab/AsPat.hs +1/−1
- src/Idris/Elab/Class.hs +18/−18
- src/Idris/Elab/Clause.hs +58/−40
- src/Idris/Elab/Data.hs +25/−25
- src/Idris/Elab/Instance.hs +16/−16
- src/Idris/Elab/Provider.hs +4/−4
- src/Idris/Elab/Record.hs +31/−27
- src/Idris/Elab/RunElab.hs +49/−0
- src/Idris/Elab/Term.hs +458/−373
- src/Idris/Elab/Transform.hs +7/−3
- src/Idris/Elab/Type.hs +8/−7
- src/Idris/Elab/Utils.hs +26/−28
- src/Idris/Elab/Value.hs +17/−9
- src/Idris/ElabDecls.hs +27/−22
- src/Idris/ElabQuasiquote.hs +11/−9
- src/Idris/ErrReverse.hs +1/−1
- src/Idris/Error.hs +8/−7
- src/Idris/Help.hs +2/−2
- src/Idris/IBC.hs +132/−78
- src/Idris/IdeMode.hs +9/−2
- src/Idris/IdrisDoc.hs +9/−8
- src/Idris/Imports.hs +2/−1
- src/Idris/Inliner.hs +1/−1
- src/Idris/Interactive.hs +125/−31
- src/Idris/Output.hs +59/−12
- src/Idris/ParseData.hs +31/−29
- src/Idris/ParseExpr.hs +257/−149
- src/Idris/ParseHelpers.hs +27/−2
- src/Idris/ParseOps.hs +5/−5
- src/Idris/Parser.hs +306/−95
- src/Idris/PartialEval.hs +33/−5
- src/Idris/ProofSearch.hs +288/−27
- src/Idris/Prover.hs +299/−116
- src/Idris/Providers.hs +1/−1
- src/Idris/REPL.hs +94/−63
- src/Idris/REPLParser.hs +38/−21
- src/Idris/Reflection.hs +255/−97
- src/Pkg/PParser.hs +1/−4
- src/Pkg/Package.hs +58/−51
- src/Util/ScreenSize.hs +1/−1
- src/Util/System.hs +21/−3
- src/Util/Zlib.hs +0/−15
- test/Makefile +1/−1
- test/basic006/expected +4/−4
- test/basic009/expected +1/−1
- test/classes001/expected +2/−0
- test/disambig001/disambig001.idr +0/−12
- test/disambig001/expected +0/−1
- test/disambig001/run +0/−4
- test/docs001/expected +1/−0
- test/docs002/expected +3/−0
- test/docs003/expected +4/−3
- test/dsl002/Resimp.idr +1/−1
- test/dsl004/Door0.idr +33/−0
- test/dsl004/Door1.idr +37/−0
- test/dsl004/Door2.idr +37/−0
- test/dsl004/Door3.idr +30/−0
- test/dsl004/IOu.idr +19/−0
- test/dsl004/expected +0/−0
- test/dsl004/run +5/−0
- test/effects005/defaultlog.idr +18/−0
- test/effects005/expected +5/−0
- test/effects005/run +6/−0
- test/effects005/simplelog.idr +14/−0
- test/error003/expected +1/−2
- test/error004/FunErrTest.idr +8/−7
- test/error004/expected +5/−8
- test/error004/idx.idr +4/−0
- test/error005/expected +10/−10
- test/idrisdoc009/expected +1/−1
- test/interactive003/expected +1/−0
- test/interactive003/input +1/−0
- test/interactive003/interactive003.idr +5/−0
- test/interactive005/expected +9/−6
- test/interactive008/expected +204/−0
- test/interactive008/input +9/−0
- test/interactive008/run +2/−0
- test/interactive009/expected +1/−0
- test/interactive009/input +1/−0
- test/interactive009/interactive009.idr +27/−0
- test/interactive009/run +3/−0
- test/io003/test018.idr +3/−1
- test/io003/test018a.idr +2/−0
- test/meta001/Finite.idr +26/−24
- test/meta002/Tacs.idr +8/−4
- test/meta002/expected +2/−2
- test/primitives002/expected +13/−13
- test/primitives002/run +33/−29
- test/proof001/test029.idr +1/−1
- test/proof002/expected +7/−7
- test/proof003/test015.idr +1/−3
- test/proof007/expected +2/−2
- test/quasiquote001/expected +3/−3
- test/quasiquote003/expected +1/−1
- test/quasiquote004/expected +1/−1
- test/quasiquote006/expected +3/−3
- test/reg001/reg001.idr +1/−0
- test/reg003/expected +3/−3
- test/reg007/expected +5/−5
- test/reg010/expected +1/−1
- test/reg023/expected +3/−3
- test/reg034/expected +2/−2
- test/reg044/expected +5/−5
- test/reg049/expected +2/−2
- test/reg054/expected +10/−9
- test/reg054/reg054.idr +3/−0
- test/reg055/expected +5/−5
- test/reg066/expected +0/−0
- test/reg066/reg066.idr +7/−0
- test/reg066/run +3/−0
- test/syntax001/Syntax.idr +8/−0
- test/syntax001/SyntaxOk.idr +6/−0
- test/syntax001/SyntaxTest.idr +5/−0
- test/syntax001/expected +12/−0
- test/syntax001/run +4/−0
- test/syntax002/expected +2/−0
- test/syntax002/run +4/−0
- test/syntax002/syntax002.idr +22/−0
- test/tactics001/Tactics.idr +1/−1
- test/totality007/expected +2/−0
- test/tutorial006/expected +15/−16
- test/unique001/expected +6/−6
- test/unique002/expected +2/−2
- test/unique003/expected +2/−2
Makefile view
@@ -1,4 +1,4 @@-.PHONY: build configure doc install linecount nodefault pinstall lib_clean relib test_c test lib_doc lib_doc_clean user_doc_html user_doc_pdf user_docs+.PHONY: build configure doc install linecount nodefault pinstall lib_clean relib fast test_c test lib_doc lib_doc_clean user_doc_html user_doc_pdf user_docs include config.mk -include custom.mk@@ -65,6 +65,9 @@ user_doc_pdf: $(MAKE) -C docs latexpdf++fast:+ $(CABAL) install $(CABALFLAGS) --ghc-option=-O0 dist/setup-config: $(CABAL) configure $(CABALFLAGS)
idris.cabal view
@@ -1,5 +1,5 @@ Name: idris-Version: 0.9.18.1+Version: 0.9.19 License: BSD3 License-file: LICENSE Author: Edwin Brady@@ -114,8 +114,11 @@ libs/contrib/Classes/*.idr libs/contrib/Control/*.idr libs/contrib/Control/Isomorphism/*.idr- libs/contrib/Control/Algebra/*.idr+ libs/contrib/Control/Algebra/*.idr libs/contrib/Data/*.idr+ libs/contrib/Data/Nat/*.idr+ libs/contrib/Data/Nat/DivMod/*.idr+ libs/contrib/Data/Matrix/*.idr libs/contrib/Decidable/*.idr libs/contrib/Network/*.idr libs/contrib/System/Concurrency/*.idr@@ -123,6 +126,7 @@ libs/effects/Makefile libs/effects/effects.ipkg libs/effects/Effect/*.idr+ libs/effects/Effect/Logging/*.idr libs/effects/*.idr test/Makefile@@ -317,6 +321,9 @@ test/reg065/run test/reg065/*.idr test/reg065/expected+ test/reg066/run+ test/reg066/*.idr+ test/reg066/expected test/basic001/run test/basic001/*.idr@@ -383,9 +390,6 @@ test/delab001/expected test/delab001/input - test/disambig001/run- test/disambig001/*.idr- test/disambig001/expected test/disambig002/run test/disambig002/*.idr test/disambig002/expected@@ -400,6 +404,9 @@ test/dsl003/run test/dsl003/*.idr test/dsl003/expected+ test/dsl004/run+ test/dsl004/*.idr+ test/dsl004/expected test/effects001/run test/effects001/*.idr@@ -416,7 +423,11 @@ test/effects004/*.idr test/effects004/expected test/effects004/input+ test/effects005/run+ test/effects005/*.idr+ test/effects005/expected + test/error001/run test/error001/*.idr test/error001/expected@@ -526,6 +537,13 @@ test/interactive007/run test/interactive007/input test/interactive007/expected+ test/interactive008/run+ test/interactive008/input+ test/interactive008/expected+ test/interactive009/run+ test/interactive009/input+ test/interactive009/*.idr+ test/interactive009/expected test/io001/run test/io001/*.idr@@ -638,6 +656,13 @@ test/sugar005/*.idr test/sugar005/expected + test/syntax001/run+ test/syntax001/*.idr+ test/syntax001/expected+ test/syntax002/run+ test/syntax002/*.idr+ test/syntax002/expected+ test/tactics001/run test/tactics001/*.idr test/tactics001/expected@@ -770,6 +795,7 @@ , Idris.Core.TT , Idris.Core.Typecheck , Idris.Core.Unify+ , Idris.Core.WHNF , Idris.Elab.Utils , Idris.Elab.Type@@ -780,6 +806,7 @@ , Idris.Elab.Class , Idris.Elab.Instance , Idris.Elab.Provider+ , Idris.Elab.RunElab , Idris.Elab.Transform , Idris.Elab.Value , Idris.Elab.Term@@ -858,7 +885,6 @@ Other-modules: Util.Pretty , Util.Net- , Util.Zlib , Pkg.PParser @@ -868,22 +894,21 @@ , Tools_idris Build-depends: base >=4 && <5- , annotated-wl-pprint >= 0.5.3 && < 0.7+ , annotated-wl-pprint >= 0.7 && < 0.8 , ansi-terminal < 0.7 , ansi-wl-pprint < 0.7 , base64-bytestring < 1.1 , binary >= 0.7 && < 0.8- , blaze-html >= 0.6.1.3 && < 0.8- , blaze-markup >= 0.5.2.1 && < 0.6.3.0+ , blaze-html >= 0.6.1.3 && < 0.9+ , blaze-markup >= 0.5.2.1 && < 0.8 , bytestring < 0.11 , cheapskate < 0.2 , containers >= 0.5 && < 0.6 , deepseq < 1.5- , directory >= 1.2.2.0 && < 1.3+ , directory >= 1.2.2.0 && < 1.2.3.0 || > 1.2.3.0 , filepath < 1.5 , fingertree >= 0.1 && < 0.2 , haskeline >= 0.7 && < 0.8- , lens >= 4.1.1 && < 4.10 , mtl >= 2.1 && < 2.3 , network < 2.7 , optparse-applicative >= 0.11 && < 0.12@@ -898,10 +923,9 @@ , trifecta >= 1.1 && < 1.6 , uniplate >=1.6 && < 1.7 , unordered-containers < 0.3- , utf8-string < 0.4+ , utf8-string <= 1 , vector < 0.11 , vector-binary-instances < 0.3- , xml < 1.4 , zip-archive > 0.2.3.5 && < 0.2.4 , zlib < 0.6 , safe@@ -984,7 +1008,7 @@ , transformers ghc-prof-options: -auto-all -caf-all- ghc-options: -threaded -rtsopts -funbox-strict-fields -O2+ ghc-options: -threaded -rtsopts -funbox-strict-fields Executable idris-node Main-is: Main.hs@@ -997,4 +1021,4 @@ , transformers ghc-prof-options: -auto-all -caf-all- ghc-options: -threaded -rtsopts -funbox-strict-fields -O2+ ghc-options: -threaded -rtsopts -funbox-strict-fields
jsrts/Runtime-browser.js view
@@ -2,7 +2,6 @@ console.log(s); }; - var i$systemInfo = function(index) { switch(index) { case 0:
jsrts/Runtime-common.js view
@@ -1,6 +1,6 @@ /** @constructor */ var i$VM = function() {- this.valstack = [];+ this.valstack = {}; this.valstack_top = 0; this.valstack_base = 0; @@ -63,26 +63,29 @@ var i$ffiWrap = function(fid,oldbase,myoldbase) { return function() {+ var oldstack = i$callstack; i$callstack = []; var res = fid; for(var i = 0; i < (arguments.length ? arguments.length : 1); ++i) {- i$valstack_top += 1;- i$valstack[i$valstack_top] = res;- i$valstack[i$valstack_top + 1] = arguments[i];- i$SLIDE(2);- i$valstack_top = i$valstack_base + 2;- i$CALL(_idris__123_APPLY0_125_,[oldbase])- while (i$callstack.length) {- var func = i$callstack.pop();- var args = i$callstack.pop();- func.apply(this,args);+ while (res instanceof i$CON) {+ i$valstack_top += 1;+ i$valstack[i$valstack_top] = res;+ i$valstack[i$valstack_top + 1] = arguments[i];+ i$SLIDE(2);+ i$valstack_top = i$valstack_base + 2;+ i$CALL(_idris__123_APPLY0_125_,[oldbase])+ while (i$callstack.length) {+ var func = i$callstack.pop();+ var args = i$callstack.pop();+ func.apply(this,args);+ }+ res = i$ret; }- res = i$ret; } - i$callstack = i$vm.callstack;+ i$callstack = oldstack; return i$ret; }@@ -100,4 +103,15 @@ return chr; else return String.fromCharCode(chr);+}++var i$RUN = function () {+ for (var i = 0; i < 10000 && i$callstack.length; i++) {+ var func = i$callstack.pop();+ var args = i$callstack.pop();+ func.apply(this,args);+ };++ if (i$callstack.length)+ setTimeout(i$RUN, 0); }
jsrts/Runtime-node.js view
@@ -5,6 +5,25 @@ }; })(); +var i$getLine = (function() {+ var fs = require( "fs" )++ return function() {+ var ret = "";++ while(true) {+ var b = new Buffer(1);+ fs.readSync(0, b, 0, 1 )+ if (b[0] == 10)+ break;+ else+ ret += String.fromCharCode(b[0]);+ }++ return ret;+ };+})();+ var i$systemInfo = function(index) { var os = require('os') switch(index) {
libs/base/Control/Monad/State.idr view
@@ -1,7 +1,7 @@ module Control.Monad.State import public Control.Monad.Identity-import Control.Monad.Trans+import public Control.Monad.Trans %access public
libs/base/Data/Complex.idr view
@@ -22,8 +22,9 @@ (==) a b = realPart a == realPart b && imagPart a == imagPart b instance Show a => Show (Complex a) where- show (r:+i) = "("++show r++":+"++show i++")"-+ showPrec d (r :+ i) = showParens (d >= plus_i) $ showPrec plus_i r ++ " :+ " ++ showPrec plus_i i+ where plus_i : Prec+ plus_i = User 6 -- when we have a type class 'Fractional' (which contains Float and Double),@@ -58,6 +59,12 @@ conjugate : Num a => Complex a -> Complex a conjugate (r:+i) = (r :+ (0-i))++instance Functor Complex where+ map f (r :+ i) = f r :+ f i++instance Neg a => Neg (Complex a) where+ negate = map negate -- We can't do "instance Num a => Num (Complex a)" because -- we need "abs" which needs "magnitude" which needs "sqrt" which needs Float
libs/base/Data/Fin.idr view
@@ -129,6 +129,8 @@ | Nothing = Nothing natToFin _ _ = Nothing +||| Convert an `Integer` to a `Fin`, provided the integer is within bounds.+||| @n The upper bound of the Fin integerToFin : Integer -> (n : Nat) -> Maybe (Fin n) integerToFin x Z = Nothing -- make sure 'n' is concrete, to save reduction! integerToFin x n = if x >= 0 then natToFin (cast x) n else Nothing
libs/base/Data/HVect.idr view
@@ -1,7 +1,6 @@ module Data.HVect -import Data.Fin-import Data.Vect+import public Data.Vect %access public %default total@@ -42,6 +41,24 @@ instance (Eq t, Eq (HVect ts)) => Eq (HVect (t::ts)) where (x::xs) == (y::ys) = x == y && xs == ys +total+hvectInjective1 : {xs, ys: HVect ts} -> {x, y:a} -> x :: xs = y :: ys -> x = y+hvectInjective1 Refl = Refl++total+hvectInjective2 : {xs, ys: HVect ts} -> {x, y:a} -> x :: xs = y :: ys -> xs = ys+hvectInjective2 Refl = Refl++instance DecEq (HVect []) where+ decEq [] [] = Yes Refl++instance (DecEq t, DecEq (HVect ts)) => DecEq (HVect (t::ts)) where+ decEq (x::xs) (y::ys) with (decEq x y)+ decEq (z::xs) (z::ys) | Yes Refl with (decEq xs ys)+ decEq (z::zs) (z::zs) | Yes Refl | Yes Refl = Yes Refl+ decEq (z::xs) (z::ys) | Yes Refl | No ctr = No (ctr . hvectInjective2)+ decEq (x::xs) (y::ys) | No ctr = No (ctr . hvectInjective1)+ class Shows (k : Nat) (ts : Vect k Type) where shows : HVect ts -> Vect k String @@ -56,17 +73,17 @@ ||| Extract an arbitrary element of the correct type. ||| @ t the goal type-get : {default tactics { search 100; } p : Elem t ts} -> HVect ts -> t+get : {auto p : Elem t ts} -> HVect ts -> t get {p = Here} (x::xs) = x get {p = There p'} (x::xs) = get {p = p'} xs ||| Replace an element with the correct type.-put : {default tactics { search 100; } p : Elem t ts} -> t -> HVect ts -> HVect ts+put : {auto p : Elem t ts} -> t -> HVect ts -> HVect ts put {p = Here} y (x::xs) = y :: xs put {p = There p'} y (x::xs) = x :: put {p = p'} y xs ||| Update an element with the correct type.-update : {default tactics { search 100; } p : Elem t ts} -> (t -> u) -> HVect ts -> HVect (replaceByElem ts p u)+update : {auto p : Elem t ts} -> (t -> u) -> HVect ts -> HVect (replaceByElem ts p u) update {p = Here} f (x::xs) = f x :: xs update {p = There p'} f (x::xs) = x :: update {p = p'} f xs
libs/base/Data/List.idr view
@@ -37,6 +37,14 @@ mkNo f g Here = f Refl mkNo f g (There x) = g x +||| Remove the element at the given position.+|||+||| @xs The list to be removed from+||| @p A proof that the element to be removed is in the list+dropElem : (xs : List a) -> (p : Elem x xs) -> List a+dropElem (x :: ys) Here = ys +dropElem (x :: ys) (There p) = x :: dropElem ys p+ ||| The intersectBy function returns the intersect of two lists by user-supplied equality predicate. intersectBy : (a -> a -> Bool) -> List a -> List a -> List a intersectBy eq xs ys = [x | x <- xs, any (eq x) ys]
libs/base/Data/Vect.idr view
@@ -52,3 +52,30 @@ mapElem Here = Here mapElem (There e) = There (mapElem e) +-- Some convenience functions for testing lengths++||| If the given Vect is the required length, return a Vect with that+||| length in its type, otherwise return Nothing+||| @len the required length+||| @xs the vector with the desired length+-- Needs to be Maybe rather than Dec, because if 'n' is unequal to m, we +-- only know we don't know how to make a Vect n a, not that one can't exist.+isLength : {m : Nat} -> -- expected at run-time+ (len : Nat) -> (xs : Vect m a) -> Maybe (Vect len a)+isLength {m} len xs with (decEq m len)+ isLength {m = m} m xs | (Yes Refl) = Just xs+ isLength {m = m} len xs | (No contra) = Nothing++||| If the given Vect is at least the required length, return a Vect with+||| at least that length in its type, otherwise return Nothing+||| @len the required length+||| @xs the vector with the desired length+overLength : {m : Nat} -> -- expected at run-time+ (len : Nat) -> (xs : Vect m a) -> Maybe (p ** Vect (plus p len) a)+overLength {m} n xs with (cmp m n)+ overLength {m = m} (plus m (S y)) xs | (CmpLT y) = Nothing+ overLength {m = m} m xs | CmpEQ+ = Just (0 ** xs)+ overLength {m = plus n (S x)} n xs | (CmpGT x)+ = Just (S x ** rewrite plusCommutative (S x) n in xs)+
libs/base/Data/VectType.idr view
@@ -1,6 +1,6 @@ module Data.VectType -import Data.Fin+import public Data.Fin %access public %default total@@ -9,9 +9,14 @@ infixr 7 :: -%elim data Vect : Nat -> Type -> Type where+||| Vectors: Generic lists with explicit length in the type+%elim +data Vect : Nat -> Type -> Type where+ ||| Empty vector Nil : Vect Z a- (::) : (x : a) -> (xs : Vect n a) -> Vect (S n) a+ ||| A non-empty vector of length `S k`, consisting of a head element and + ||| the rest of the list, of length `k`.+ (::) : (x : a) -> (xs : Vect k a) -> Vect (S k) a -- Hints for interactive editing %name Vect xs,ys,zs,ws
libs/base/Language/Reflection/Utils.idr view
@@ -64,23 +64,23 @@ mutual instance Show SpecialName where- show (WhereN i n1 n2) = "(WhereN " ++ show i ++ " " ++- show n1 ++ " " ++ show n2 ++ ")"- show (WithN i n) = "(WithN " ++ show i ++ " " ++ show n ++ ")"- show (InstanceN i ss) = "(InstanceN " ++ show i ++ " " ++ show ss ++ ")"- show (ParentN n s) = "(ParentN " ++ show n ++ " " ++ show s ++ ")"- show (MethodN n) = "(MethodN " ++ show n ++ ")"- show (CaseN n) = "(CaseN " ++ show n ++ ")"- show (ElimN n) = "(ElimN " ++ show n ++ ")"- show (InstanceCtorN n) = "(InstanceCtorN " ++ show n ++ ")"- show (MetaN parent meta) = "(MetaN " ++ show parent ++ " " ++ show meta ++ ")"+ showPrec d (WhereN i n1 n2) = showCon d "WhereN" $ showArg i +++ showArg n1 ++ showArg n2+ showPrec d (WithN i n) = showCon d "WithN" $ showArg i ++ showArg n+ showPrec d (InstanceN i ss) = showCon d "InstanceN" $ showArg i ++ showArg ss+ showPrec d (ParentN n s) = showCon d "ParentN" $ showArg n ++ showArg s+ showPrec d (MethodN n) = showCon d "MethodN" $ showArg n+ showPrec d (CaseN n) = showCon d "CaseN" $ showArg n+ showPrec d (ElimN n) = showCon d "ElimN" $ showArg n+ showPrec d (InstanceCtorN n) = showCon d "InstanceCtorN" $ showArg n+ showPrec d (MetaN parent meta) = showCon d "MetaN" $ showArg parent ++ showArg meta instance Show TTName where- show (UN str) = "(UN " ++ show str ++ ")"- show (NS n ns) = "(NS " ++ show n ++ " " ++ show ns ++ ")"- show (MN i str) = "(MN " ++ show i ++ " " ++ show str ++ ")"- show (SN sn) = "(SN " ++ assert_total (show sn) ++ ")"- show NErased = "NErased"+ showPrec d (UN str) = showCon d "UN" $ showArg str+ showPrec d (NS n ns) = showCon d "NS" $ showArg n ++ showArg ns+ showPrec d (MN i str) = showCon d "MN" $ showArg i ++ showArg str+ showPrec d (SN sn) = showCon d "SN" $ assert_total (showArg sn)+ showPrec d NErased = "NErased" mutual instance Eq TTName where@@ -104,28 +104,44 @@ _ == _ = False instance Show TTUExp where- show (UVar i) = "(UVar " ++ show i ++ ")"- show (UVal i) = "(UVal " ++ show i ++ ")"+ showPrec d (UVar i) = showCon d "UVar" $ showArg i+ showPrec d (UVal i) = showCon d "UVal" $ showArg i instance Eq TTUExp where (UVar i) == (UVar j) = i == j (UVal i) == (UVal j) = i == j x == y = False +instance Show NativeTy where+ show IT8 = "IT8"+ show IT16 = "IT16"+ show IT32 = "IT32"+ show IT64 = "IT64"++instance Show IntTy where+ showPrec d (ITFixed t) = showCon d "ITFixed" $ showArg t+ showPrec d ITNative = "ITNative"+ showPrec d ITBig = "ITBig"+ showPrec d ITChar = "ITChar"++instance Show ArithTy where+ showPrec d (ATInt t) = showCon d "ATInt" $ showArg t+ showPrec d ATFloat = "ATFloat"+ instance Show Const where- show (I i) = "(I " ++ show i ++ ")"- show (BI n) = "(BI " ++ show n ++ ")"- show (Fl f) = "(Fl " ++ show f ++ ")"- show (Ch c) = "(Ch " ++ show c ++ ")"- show (Str str) = "(Str " ++ show str ++ ")"- show (B8 b) = "(B8 ...)"- show (B16 b) = "(B16 ...)"- show (B32 b) = "(B32 ...)"- show (B64 b) = "(B64 ...)"- show (AType x) = "(AType ...)"- show StrType = "StrType"- show VoidType = "VoidType"- show Forgot = "Forgot"+ showPrec d (I i) = showCon d "I" $ showArg i+ showPrec d (BI n) = showCon d "BI" $ showArg n+ showPrec d (Fl f) = showCon d "Fl" $ showArg f+ showPrec d (Ch c) = showCon d "Ch" $ showArg c+ showPrec d (Str str) = showCon d "Str" $ showArg str+ showPrec d (B8 b) = showCon d "B8" $ showArg b+ showPrec d (B16 b) = showCon d "B16" $ showArg b+ showPrec d (B32 b) = showCon d "B32" $ showArg b+ showPrec d (B64 b) = showCon d "B64" $ showArg b+ showPrec d (AType x) = showCon d "AType" $ showArg x+ showPrec d StrType = "StrType"+ showPrec d VoidType = "VoidType"+ showPrec d Forgot = "Forgot" instance Eq NativeTy where IT8 == IT8 = True@@ -164,10 +180,10 @@ instance Show NameType where- show Bound = "Bound"- show Ref = "Ref"- show (DCon t ar) = "(DCon " ++ show t ++ " " ++ show ar ++ ")"- show (TCon t ar) = "(TCon " ++ show t ++ " " ++ show ar ++ ")"+ showPrec d Bound = "Bound"+ showPrec d Ref = "Ref"+ showPrec d (DCon t ar) = showCon d "DCon" $ showArg t ++ showArg ar+ showPrec d (TCon t ar) = showCon d "TCon" $ showArg t ++ showArg ar instance Eq NameType where Bound == Bound = True@@ -177,15 +193,15 @@ x == y = False instance (Show a) => Show (Binder a) where- show (Lam t) = "(Lam " ++ show t ++ ")"- show (Pi t _) = "(Pi " ++ show t ++ ")"- show (Let t1 t2) = "(Let " ++ show t1 ++ " " ++ show t2 ++ ")"- show (NLet t1 t2) = "(NLet " ++ show t1 ++ " " ++ show t2 ++ ")"- show (Hole t) = "(Hole " ++ show t ++ ")"- show (GHole t) = "(GHole " ++ show t ++ ")"- show (Guess t1 t2) = "(Guess " ++ show t1 ++ " " ++ show t2 ++ ")"- show (PVar t) = "(PVar " ++ show t ++ ")"- show (PVTy t) = "(PVTy " ++ show t ++ ")"+ showPrec d (Lam t) = showCon d "Lam" $ showArg t+ showPrec d (Pi t1 t2) = showCon d "Pi" $ showArg t1 ++ showArg t2+ showPrec d (Let t1 t2) = showCon d "Let" $ showArg t1 ++ showArg t2+ showPrec d (NLet t1 t2) = showCon d "NLet" $ showArg t1 ++ showArg t2+ showPrec d (Hole t) = showCon d "Hole" $ showArg t+ showPrec d (GHole t) = showCon d "GHole" $ showArg t+ showPrec d (Guess t1 t2) = showCon d "Guess" $ showArg t1 ++ showArg t2+ showPrec d (PVar t) = showCon d "PVar" $ showArg t+ showPrec d (PVTy t) = showCon d "PVTy" $ showArg t instance (Eq a) => Eq (Binder a) where (Lam t) == (Lam t') = t == t'@@ -200,17 +216,17 @@ x == y = False instance Show TT where- show = my_show- where %assert_total my_show : TT -> String- my_show (P nt n t) = "(P " ++ show nt ++ " " ++ show n ++ " " ++ show t ++ ")"- my_show (V i) = "(V " ++ show i ++ ")"- my_show (Bind n b t) = "(Bind " ++ show n ++ " " ++ show b ++ " " ++ show t ++ ")"- my_show (App t1 t2) = "(App " ++ show t1 ++ " " ++ show t2 ++ ")"- my_show (TConst c) = "(TConst " ++ show c ++ ")"- my_show (Proj tm i) = "(Proj " ++ show tm ++ " " ++ show i ++ ")"- my_show Erased = "Erased"- my_show Impossible = "Impossible"- my_show (TType u) = "(TType " ++ show u ++ ")"+ showPrec = my_show+ where %assert_total my_show : Prec -> TT -> String+ my_show d (P nt n t) = showCon d "P" $ showArg nt ++ showArg n ++ showArg t+ my_show d (V i) = showCon d "V" $ showArg i+ my_show d (Bind n b t) = showCon d "Bind" $ showArg n ++ showArg b ++ showArg t+ my_show d (App t1 t2) = showCon d "App" $ showArg t1 ++ showArg t2+ my_show d (TConst c) = showCon d "TConst" $ showArg c+ my_show d (Proj tm i) = showCon d "Proj" $ showArg tm ++ showArg i+ my_show d Erased = "Erased"+ my_show d Impossible = "Impossible"+ my_show d (TType u) = showCon d "TType" $ showArg u instance Eq TT where a == b = equalp a b@@ -226,6 +242,12 @@ equalp (TType u) (TType u') = u == u' equalp x y = False +instance Eq Universe where+ Reflection.NullType == Reflection.NullType = True+ Reflection.UniqueType == Reflection.UniqueType = True+ Reflection.AllTypes == Reflection.AllTypes = True+ _ == _ = False+ total forget : TT -> Maybe Raw forget tm = fe [] tm@@ -251,53 +273,54 @@ fe env Impossible = Nothing instance Show Raw where- show r = my_show r- where %assert_total my_show : Raw -> String- my_show (Var n) = "(Var " ++ show n ++ ")"- my_show (RBind n b tm) = "(RBind " ++ show n ++ " " ++ show b ++ " " ++ my_show tm ++ ")"- my_show (RApp tm tm') = "(RApp " ++ my_show tm ++ " " ++ my_show tm' ++ ")"- my_show RType = "RType"- my_show (RForce tm) = "(RForce " ++ my_show tm ++ ")"- my_show (RConstant c) = "(RConstant " ++ show c ++ ")"+ showPrec = my_show+ where %assert_total my_show : Prec -> Raw -> String+ my_show d (Var n) = showCon d "Var" $ showArg n+ my_show d (RBind n b tm) = showCon d "RBind" $ showArg n ++ showArg b ++ " " ++ my_show App tm+ my_show d (RApp tm tm') = showCon d "RApp" $ " " ++ my_show App tm ++ " " ++ my_show App tm'+ my_show d RType = "RType"+ my_show d (RForce tm) = showCon d "RForce" $ " " ++ my_show App tm+ my_show d (RConstant c) = showCon d "RConstant" $ showArg c instance Show SourceLocation where- show (FileLoc filename line col) = "FileLoc \"" ++ filename ++ "\" " ++ show line ++ " " ++ show col+ showPrec d (FileLoc filename line col) = showCon d "FileLoc" $ showArg filename ++ showArg line ++ showArg col instance Show Err where- show (Msg x) = "Msg \"" ++ x ++ "\""- show (InternalMsg x) = "InternalMsg \"" ++ x ++ "\""- show (CantUnify x tm tm' err xs y) = "CantUnify " ++ show x ++- " ( " ++ show tm ++ ") (" ++ show tm' ++ ") (" ++ show err ++ ") " ++- show xs ++ " " ++ show y- show (InfiniteUnify n tm xs) = "InfiniteUnify " ++ show n ++ show tm ++ show xs- show (CantConvert tm tm' xs) = "CantConvert " ++ show tm ++ show tm' ++ show xs- show (CantSolveGoal tm ctxt) = "CantSolveGoal " ++ show tm ++ " " ++ show ctxt- show (UnifyScope n n' tm xs) = "UnifyScope " ++ show n ++ " " ++ show n' ++ " " ++ show tm ++ " " ++ show xs- show (CantInferType x) = "CantInferType " ++ show x- show (NonFunctionType tm tm') = "NonFunctionType " ++ show tm ++ show tm'- show (NotEquality tm tm') = "NotEquality " ++ show tm ++ " " ++ show tm'- show (TooManyArguments n) = "TooManyArguments " ++ show n- show (CantIntroduce tm) = "CantIntroduce " ++ show tm- show (NoSuchVariable n) = "NoSuchVariable " ++ show n- show (WithFnType tm) = "WithFnType " ++ show tm- show (CantMatch tm) = "CantMatch " ++ show tm- show (NoTypeDecl n) = "NoTypeDecl " ++ show n- show (NotInjective tm tm' x) = "NotInjective " ++ show tm ++ " " ++ show tm'- show (CantResolve tm) = "CantResolve " ++ show tm- show (InvalidTCArg n tm) = "InvalidTCName " ++ show n ++ " (" ++ show tm ++ ")"- show (CantResolveAlts xs) = "CantResolveAlts " ++ show xs- show (IncompleteTerm tm) = "IncompleteTerm " ++ show tm- show (NoEliminator s tm) = "NoEliminator " ++ show s ++ " " ++ show tm- show UniverseError = "UniverseError"- show ProgramLineComment = "ProgramLineComment"- show (Inaccessible n) = "Inaccessible " ++ show n- show (UnknownImplicit n f) = "UnknownImplicit " ++ show n ++ " " ++ show f- show (NonCollapsiblePostulate n) = "NonCollapsiblePostulate " ++ show n- show (AlreadyDefined n) = "AlreadyDefined " ++ show n- show (ProofSearchFail err) = "ProofSearchFail " ++ show err- show (NoRewriting tm) = "NoRewriting " ++ show tm- show (ProviderError x) = "ProviderError \"" ++ show x ++ "\""- show (LoadingFailed x err) = "LoadingFailed " ++ show x ++ " (" ++ show err ++ ")"+ showPrec d (Msg x) = showCon d "Msg" $ showArg x+ showPrec d (InternalMsg x) = showCon d "InternalMsg" $ showArg x+ showPrec d (CantUnify x tm tm' err xs y) = showCon d "CantUnify" $ showArg x +++ showArg tm ++ showArg tm' ++ showArg err +++ showArg xs ++ showArg y+ showPrec d (InfiniteUnify n tm xs) = showCon d "InfiniteUnify" $ showArg n ++ showArg tm ++ showArg xs+ showPrec d (CantConvert tm tm' xs) = showCon d "CantConvert" $ showArg tm ++ showArg tm' ++ showArg xs+ showPrec d (CantSolveGoal tm ctxt) = showCon d "CantSolveGoal" $ showArg tm ++ showArg ctxt+ showPrec d (UnifyScope n n' tm xs) = showCon d "UnifyScope" $ showArg n ++ showArg n' ++ showArg tm ++ showArg xs+ showPrec d (CantInferType x) = showCon d "CantInferType" $ showArg x+ showPrec d (NonFunctionType tm tm') = showCon d "NonFunctionType" $ showArg tm ++ showArg tm'+ showPrec d (NotEquality tm tm') = showCon d "NotEquality" $ showArg tm ++ showArg tm'+ showPrec d (TooManyArguments n) = showCon d "TooManyArguments" $ showArg n+ showPrec d (CantIntroduce tm) = showCon d "CantIntroduce" $ showArg tm+ showPrec d (NoSuchVariable n) = showCon d "NoSuchVariable" $ showArg n+ showPrec d (WithFnType tm) = showCon d "WithFnType" $ showArg tm+ showPrec d (CantMatch tm) = showCon d "CantMatch" $ showArg tm+ showPrec d (NoTypeDecl n) = showCon d "NoTypeDecl" $ showArg n+ showPrec d (NotInjective tm tm' x) = showCon d "NotInjective" $ showArg tm ++ showArg tm'+ showPrec d (CantResolve tm) = showCon d "CantResolve" $ showArg tm+ showPrec d (InvalidTCArg n tm) = showCon d "InvalidTCName" $ showArg n ++ showArg tm+ showPrec d (CantResolveAlts xs) = showCon d "CantResolveAlts" $ showArg xs+ showPrec d (NoValidAlts xs) = showCon d "NoValidAlts" $ showArg xs+ showPrec d (IncompleteTerm tm) = showCon d "IncompleteTerm" $ showArg tm+ showPrec d (NoEliminator s tm) = showCon d "NoEliminator" $ showArg s ++ showArg tm+ showPrec d UniverseError = "UniverseError"+ showPrec d ProgramLineComment = "ProgramLineComment"+ showPrec d (Inaccessible n) = showCon d "Inaccessible" $ showArg n+ showPrec d (UnknownImplicit n f) = showCon d "UnknownImplicit" $ showArg n ++ showArg f+ showPrec d (NonCollapsiblePostulate n) = showCon d "NonCollapsiblePostulate" $ showArg n+ showPrec d (AlreadyDefined n) = showCon d "AlreadyDefined" $ showArg n+ showPrec d (ProofSearchFail err) = showCon d "ProofSearchFail" $ showArg err+ showPrec d (NoRewriting tm) = showCon d "NoRewriting" $ showArg tm+ showPrec d (ProviderError x) = showCon d "ProviderError" $ showArg x+ showPrec d (LoadingFailed x err) = showCon d "LoadingFailed" $ showArg x ++ showArg err ------------------------- -- Idiom brackets for Raw@@ -312,11 +335,23 @@ -------------------------------------- -- Instances for definition reflection ---------------------------------------instance Show Arg where- show (Explicit n t) = "(Explicit " ++ show n ++ " " ++ show t ++ ")"- show (Implicit n t) = "(Implicit " ++ show n ++ " " ++ show t ++ ")"- show (Constraint n t) = "(Constraint " ++ show n ++ " " ++ show t ++ ")"+instance Show Erasure where+ show Erased = "Erased"+ show NotErased = "NotErased" +instance Show Plicity where+ show Explicit = "Explicit"+ show Implicit = "Implicit"+ show Constraint = "Constraint"++instance Show FunArg where+ showPrec d (MkFunArg n ty plic era) = showCon d "MkFunArg" $ showArg n +++ showArg ty ++ showArg plic ++ showArg era++instance Show CtorArg where+ showPrec d (CtorParameter fa) = showCon d "CtorParameter" $ showArg fa+ showPrec d (CtorField fa) = showCon d "CtorField" $ showArg fa+ instance Show TyDecl where- show (Declare fn args ret) = "(Declare " ++ show fn ++ " " ++- show args ++ " " ++ show ret ++ ")"+ showPrec d (Declare fn args ret) = showCon d "Declare" $ showArg fn +++ showArg args ++ showArg ret
libs/base/System.idr view
@@ -4,23 +4,7 @@ %default partial %access public -||| Get the command-line arguments that the program was called with.-getArgs : IO (List String)-getArgs = do n <- numArgs- ga' [] 0 n- where- numArgs : IO Int- numArgs = foreign FFI_C "idris_numArgs" (IO Int)-- getArg : Int -> IO String- getArg x = foreign FFI_C "idris_getArg" (Int -> IO String) x-- ga' : List String -> Int -> Int -> IO (List String)- ga' acc i n = if (i == n) then (return $ reverse acc) else- do arg <- getArg i- ga' (arg :: acc) (i+1) n--||| Retrieves an value from the environment, if the given key is present,+||| Retrieves a value from the environment if the given key is present, ||| otherwise it returns Nothing. getEnv : String -> IO (Maybe String) getEnv key = do@@ -73,8 +57,9 @@ exit code = foreign FFI_C "exit" (Int -> IO ()) code ||| Get the Unix time-time : IO Int-time = foreign FFI_C "idris_time" (IO Int)+time : IO Integer+time = do MkRaw t <- foreign FFI_C "idris_time" (IO (Raw Integer))+ return t usleep : Int -> IO () usleep i = foreign FFI_C "usleep" (Int -> IO ()) i
libs/base/System/Concurrency/Raw.idr view
@@ -7,15 +7,25 @@ import System ||| Send a message of any type to the thread with the given thread id-sendToThread : (thread_id : Ptr) -> a -> IO ()+||| Returns 1 if the message was sent successfully, 0 otherwise+sendToThread : (thread_id : Ptr) -> a -> IO Int sendToThread {a} dest val- = foreign FFI_C "idris_sendMessage" (Ptr -> Ptr -> Raw a -> IO ())+ = foreign FFI_C "idris_sendMessage" (Ptr -> Ptr -> Raw a -> IO Int) prim__vm dest (MkRaw val) ||| Check for messages in the process inbox checkMsgs : IO Bool checkMsgs = do msgs <- foreign FFI_C "idris_checkMessages" (Ptr -> IO Ptr) prim__vm+ null <- nullPtr msgs+ return (not null)++||| Check for messages in the process inbox+||| If no messages, waits for the given number of seconds+checkMsgsTimeout : Int -> IO Bool+checkMsgsTimeout timeout+ = do msgs <- foreign FFI_C "idris_checkMessagesTimeout" + (Ptr -> Int -> IO Ptr) prim__vm timeout null <- nullPtr msgs return (not null)
libs/base/base.ipkg view
@@ -5,7 +5,7 @@ Debug.Error, Debug.Trace, - System.Info,+ System.Info, Language.Reflection.Utils,
libs/contrib/Control/Algebra.idr view
@@ -54,7 +54,7 @@ ||| forall a, inverse a <+> a == neutral ||| + Associativity of `<.>`: ||| forall a b c, a <.> (b <.> c) == (a <.> b) <.> c-||| + Distributivity of `<.>` and `<->`:+||| + Distributivity of `<.>` and `<+>`: ||| forall a b c, a <.> (b <+> c) == (a <.> b) <+> (a <.> c) ||| forall a b c, (a <+> b) <.> c == (a <.> c) <+> (b <.> c) class AbelianGroup a => Ring a where@@ -80,7 +80,7 @@ ||| + Neutral for `<.>`: ||| forall a, a <.> unity == a ||| forall a, unity <.> a == a-||| + Distributivity of `<.>` and `<->`:+||| + Distributivity of `<.>` and `<+>`: ||| forall a b c, a <.> (b <+> c) == (a <.> b) <+> (a <.> c) ||| forall a b c, (a <+> b) <.> c == (a <.> c) <+> (b <.> c) class Ring a => RingWithUnity a where@@ -109,21 +109,21 @@ ||| + InverseM of `<.>`, except for neutral ||| forall a /= neutral, a <.> inverseM a == unity ||| forall a /= neutral, inverseM a <.> a == unity-||| + Distributivity of `<.>` and `<->`:+||| + Distributivity of `<.>` and `<+>`: ||| forall a b c, a <.> (b <+> c) == (a <.> b) <+> (a <.> c) ||| forall a b c, (a <+> b) <.> c == (a <.> c) <+> (b <.> c) class RingWithUnity a => Field a where inverseM : (x : a) -> Not (x = neutral) -> a -sum : (Foldable t, Monoid a) => t a -> a-sum = foldr (<+>) neutral+sum' : (Foldable t, Monoid a) => t a -> a+sum' = concat -product : (Foldable t, RingWithUnity a) => t a -> a-product = foldr (<.>) unity+product' : (Foldable t, RingWithUnity a) => t a -> a+product' = foldr (<.>) unity -power : RingWithUnity a => a -> Nat -> a-power _ Z = unity-power x (S n) = x <.> (Algebra.power x n)+pow' : RingWithUnity a => a -> Nat -> a+pow' _ Z = unity+pow' x (S n) = x <.> pow' x n -- XXX todo:
libs/contrib/Control/Algebra/NumericInstances.idr view
@@ -1,6 +1,9 @@+||| Instances of algebraic classes (group, ring, etc) for numeric data types,+||| and Complex number types. module Control.Algebra.NumericInstances import Control.Algebra+import Control.Algebra.VectorSpace import Data.Complex import Data.ZZ @@ -102,3 +105,9 @@ instance RingWithUnity a => RingWithUnity (Complex a) where unity = (unity :+ neutral)++instance RingWithUnity a => Module a (Complex a) where+ (<#>) x = map (x <.>)++instance RingWithUnity a => InnerProductSpace a (Complex a) where+ (x :+ y) <||> z = realPart $ (x :+ inverse y) <.> z
libs/contrib/Data/Fun.idr view
@@ -1,6 +1,6 @@ module Data.Fun -import Data.Vect+import public Data.Vect %default total
libs/contrib/Data/Heap.idr view
@@ -114,8 +114,8 @@ -------------------------------------------------------------------------------- instance Show a => Show (MaxiphobicHeap a) where- show Empty = "Empty"- show (Node s l e r) = "Node (" ++ show l ++ " " ++ show e ++ " " ++ show r ++ ")"+ showPrec d Empty = "Empty"+ showPrec d (Node s l e r) = showCon d "Node" $ " _" ++ showArg l ++ showArg e ++ showArg r instance Eq a => Eq (MaxiphobicHeap a) where Empty == Empty = True
libs/contrib/Data/Matrix.idr view
@@ -1,150 +1,58 @@+||| Basic matrix operations with dimensionalities enforced+||| at the type level module Data.Matrix -import Control.Algebra-import Control.Algebra.VectorSpace-import public Control.Algebra.NumericInstances--import Data.Complex-import Data.ZZ-import Data.Fin-import Data.Vect+import public Data.Vect %default total -infixr 2 <:> -- vector inner product-infixr 2 >< -- vector outer product-infixr 2 <<>> -- matrix commutator-infixr 2 >><< -- matrix anticommutator-infixl 3 <\> -- row times a matrix-infixr 4 </> -- matrix times a column-infixr 5 <> -- matrix multiplication-infixr 7 \&\ -- vector tensor product-infixr 7 <&> -- matrix tensor product---------------------------------------------------------------------------- Vectors as members of algebraic classes--------------------------------------------------------------------------instance Semigroup a => Semigroup (Vect n a) where- (<+>) v w = zipWith (<+>) v w--instance Monoid a => Monoid (Vect n a) where- neutral {n} = replicate n neutral--instance Group a => Group (Vect n a) where- inverse = map inverse--instance AbelianGroup a => AbelianGroup (Vect n a) where {}--instance Ring a => Ring (Vect n a) where- (<.>) v w = zipWith (<.>) v w--instance RingWithUnity a => RingWithUnity (Vect n a) where- unity {n} = replicate n unity----instance Field a => Field (Vect n a) where--instance RingWithUnity a => Module a (Vect n a) where- (<#>) r v = map (r <.>) v--instance RingWithUnity a => Module a (Vect n (Vect l a)) where- (<#>) r m = map (r <#>) m--- should be Module a b => Module a (Vect n b), but results in 'overlapping instance'---------------------------------------------------------------------------- (Ring) Vector functions--------------------------------------------------------------------------||| Inner product of ring vectors-(<:>) : Ring a => Vect n a -> Vect n a -> a-(<:>) w v = foldr (<+>) neutral (zipWith (<.>) w v)--||| Tensor multiply (⊗) ring vectors-(\&\) : Ring a => Vect n a -> Vect m a -> Vect (n * m) a-(\&\) {n} {m} v w = zipWith (<.>) (oextend m v) (orep n w) where- orep : (n : Nat) -> Vect m a -> Vect (n * m) a- orep n v = concat $ replicate n v- oextend : (n : Nat) -> Vect k a -> Vect (k * n) a- oextend n w = concat $ map (replicate n) w--||| Standard basis vector with one nonzero entry, ring data type and vector-length unfixed-basis : RingWithUnity a => {d : Nat} -> (Fin d) -> Vect d a-basis i = replaceAt i unity $ neutral---------------------------------------------------------------------------- Matrix functions------------------------------------------------------------------------- ||| Matrix with n rows and m columns Matrix : Nat -> Nat -> Type -> Type Matrix n m a = Vect n (Vect m a) -||| Gets the specified column of a matrix. For rows use the vector function 'index'+||| Get the specified column of a matrix getCol : Fin m -> Matrix n m a -> Vect n a-getCol fm q = map (index fm) q+getCol f = map (index f) -||| Deletes the specified column of a matrix. For rows use the vector function 'deleteAt'-deleteCol : Fin (S m) -> Matrix n (S m) a -> Matrix n m a-deleteCol f m = map (deleteAt f) m+||| Get the specified row of a matrix+getRow : Fin n -> Matrix n m a -> Vect m a+getRow = index -||| Matrix element at specified row and column indices-indices : Fin n -> Fin m -> Matrix n m a -> a-indices f1 f2 m = index f2 (index f1 m)+||| Delete the specified column of a matrix+deleteCol : Fin (S m) -> Matrix n (S m) a -> Matrix n m a+deleteCol f = map (deleteAt f) -||| Matrix times a column vector-(</>) : Ring a => Matrix n m a -> Vect m a -> Vect n a-(</>) m v = map (v <:>) m+||| Delete the specified row of a matrix+deleteRow : Fin (S n) -> Matrix (S n) m a -> Matrix n m a+deleteRow = deleteAt -||| Matrix times a row vector-(<\>) : Ring a => Vect n a -> Matrix n m a -> Vect m a-(<\>) r m = map (r <:>) $ transpose m+insertRow : Fin (S n) -> Vect m a -> Matrix n m a -> Matrix (S n) m a+insertRow = insertAt -||| Matrix multiplication-(<>) : Ring a => Matrix n k a ->- Matrix k m a ->- Matrix n m a-(<>) m1 m2 = map (<\> m2) m1+insertCol : Fin (S m) -> Vect n a -> Matrix n m a -> Matrix n (S m) a+insertCol f = zipWith (insertAt f) -||| Tensor multiply (⊗) for ring matrices-(<&>) : Ring a => Matrix h1 w1 a -> Matrix h2 w2 a -> Matrix (h1 * h2) (w1 * w2) a-(<&>) m1 m2 = zipWith (\&\) (stepOne m1 m2) (stepTwo m1 m2) where- stepOne : Matrix h1 w1 a -> Matrix h2 w2 a -> Matrix (h1 * h2) w1 a- stepOne {h2} m1 m2 = concat $ map (replicate h2) m1- stepTwo : Matrix h1 w1 a -> Matrix h2 w2 a -> Matrix (h1 * h2) w2 a- stepTwo {h1} m1 m2 = concat $ (Vect.replicate h1) m2+||| Matrix element at specified row and column indices+indices : Fin n -> Fin m -> Matrix n m a -> a+indices f1 f2 = index f2 . index f1 ||| Cast a vector from a standard Vect to a proper n x 1 matrix col : Vect n a -> Matrix n 1 a-col v = map (\x => [x]) v+col = map (\x => [x]) ||| Cast a row from a standard Vect to a proper 1 x n matrix row : Vect n a -> Matrix 1 n a row r = [r] -||| Outer product between ring vectors-(><) : Ring a => Vect n a -> Vect m a -> Matrix n m a-(><) x y = (col x) <> (row y)--||| All finite numbers up to the given bound-allN : (n : Nat) -> Vect n (Fin n)-allN Z = Nil-allN (S n) = FZ :: (map FS $ allN n)--||| Identity matrix-Id : RingWithUnity a => {d : Nat} -> Matrix d d a-Id {d} = map (\n => basis n) $ allN d--||| Matrix commutator-(<<>>) : Ring a => Matrix n n a -> Matrix n n a -> Matrix n n a-(<<>>) m1 m2 = (m1 <> m2) <-> (m2 <> m1)--||| Matrix anti-commutator-(>><<) : Ring a => Matrix n n a -> Matrix n n a -> Matrix n n a-(>><<) m1 m2 = (m1 <> m2) <+> (m2 <> m1)---------------------------------------------------------------------------- Matrix Algebra Properties------------------------------------------------------------------------+||| Matrix formed by deleting specified row and col+subMatrix : Fin (S n) -> Fin (S m) -> Matrix (S n) (S m) a -> Matrix n m a+subMatrix r c = deleteRow r . deleteCol c --- TODO: Prove properties of matrix algebra for 'Verified' algebraic classes+||| Flatten a matrix of matrices+concatMatrix : Matrix n m (Matrix x y a) -> Matrix (n * x) (m * y) a+concatMatrix = Vect.concat . map (map Vect.concat) . map transpose +||| All finite numbers of the specified level+fins : (n : Nat) -> Vect n (Fin n)+fins Z = Nil+fins (S n) = FZ :: (map FS $ fins n)
+ libs/contrib/Data/Matrix/Algebraic.idr view
@@ -0,0 +1,149 @@+||| Matrix operations with vector space dimensionalities enforced+||| at the type level. Uses operations from classes in `Control.Algebra`+||| and `Control.Algebra.VectorSpace`.+module Data.Matrix.Algebraic++import public Control.Algebra+import public Control.Algebra.VectorSpace+import public Control.Algebra.NumericInstances++import public Data.Matrix+++%default total++infixr 2 <:> -- vector inner product+infixr 2 >< -- vector outer product+infixr 2 <<>> -- matrix commutator+infixr 2 >><< -- matrix anticommutator+infixl 3 <\> -- row times a matrix+infixr 4 </> -- matrix times a column+infixr 5 <> -- matrix multiplication+infixr 7 \&\ -- vector tensor product+infixr 7 <&> -- matrix tensor product++-----------------------------------------------------------------------+-- Vectors as members of algebraic classes+-----------------------------------------------------------------------++instance Semigroup a => Semigroup (Vect n a) where+ (<+>)= zipWith (<+>)++instance Monoid a => Monoid (Vect n a) where+ neutral {n} = replicate n neutral++instance Group a => Group (Vect n a) where+ inverse = map inverse++instance AbelianGroup a => AbelianGroup (Vect n a) where {}++instance Ring a => Ring (Vect n a) where+ (<.>) = zipWith (<.>)++instance RingWithUnity a => RingWithUnity (Vect n a) where+ unity {n} = replicate n unity++instance RingWithUnity a => Module a (Vect n a) where+ (<#>) r = map (r <.>)++instance RingWithUnity a => Module a (Vect n (Vect l a)) where+ (<#>) r = map (r <#>)+-- should be Module a b => Module a (Vect n b), but results in 'overlapping instance'++-----------------------------------------------------------------------+-- (Ring) Vector functions+-----------------------------------------------------------------------++||| Inner product of ring vectors+(<:>) : Ring a => Vect n a -> Vect n a -> a+(<:>) w v = foldr (<+>) neutral (zipWith (<.>) w v)++||| Tensor multiply (⊗) ring vectors+(\&\) : Ring a => Vect n a -> Vect m a -> Vect (n * m) a+(\&\) {n} {m} v w = zipWith (<.>) (oextend m v) (orep n w) where+ orep : (n : Nat) -> Vect m a -> Vect (n * m) a+ orep n v = concat $ replicate n v+ oextend : (n : Nat) -> Vect k a -> Vect (k * n) a+ oextend n w = concat $ map (replicate n) w++||| Standard basis vector with one nonzero entry, ring data type and vector-length unfixed+basis : RingWithUnity a => (Fin d) -> Vect d a+basis i = replaceAt i unity neutral++-----------------------------------------------------------------------+-- Ring Matrix functions+-----------------------------------------------------------------------++||| Matrix times a column vector+(</>) : Ring a => Matrix n m a -> Vect m a -> Vect n a+(</>) m v = map (v <:>) m++||| Matrix times a row vector+(<\>) : Ring a => Vect n a -> Matrix n m a -> Vect m a+(<\>) r m = map (r <:>) $ transpose m++||| Matrix multiplication+(<>) : Ring a => Matrix n k a ->+ Matrix k m a ->+ Matrix n m a+(<>) m1 m2 = map (<\> m2) m1++||| Tensor multiply (⊗) for ring matrices+(<&>) : Ring a => Matrix h1 w1 a -> Matrix h2 w2 a -> Matrix (h1 * h2) (w1 * w2) a+(<&>) m1 m2 = zipWith (\&\) (stepOne m1 m2) (stepTwo m1 m2) where+ stepOne : Matrix h1 w1 a -> Matrix h2 w2 a -> Matrix (h1 * h2) w1 a+ stepOne {h2} m1 m2 = concat $ map (replicate h2) m1+ stepTwo : Matrix h1 w1 a -> Matrix h2 w2 a -> Matrix (h1 * h2) w2 a+ stepTwo {h1} m1 m2 = concat $ replicate h1 m2++||| Outer product between ring vectors+(><) : Ring a => Vect n a -> Vect m a -> Matrix n m a+(><) x y = col x <> row y++||| Matrix commutator+(<<>>) : Ring a => Matrix n n a -> Matrix n n a -> Matrix n n a+(<<>>) m1 m2 = (m1 <> m2) <-> (m2 <> m1)++||| Matrix anti-commutator+(>><<) : Ring a => Matrix n n a -> Matrix n n a -> Matrix n n a+(>><<) m1 m2 = (m1 <> m2) <+> (m2 <> m1)++||| Identity matrix+Id : RingWithUnity a => Matrix d d a+Id = map (\n => basis n) (fins _)++||| Square matrix from diagonal elements+diag_ : Monoid a => Vect n a -> Matrix n n a+diag_ = zipWith (\f => \x => replaceAt f x neutral) (fins _)++||| Combine two matrices to make a new matrix in block diagonal form+blockDiag : Monoid a => Matrix n n a -> Matrix m m a -> Matrix (n+m) (n+m) a+blockDiag g h = map (++ replicate _ neutral) g ++ map ((replicate _ neutral) ++) h+++-----------------------------------------------------------------------+-- Determinants+-----------------------------------------------------------------------++||| Alternating sum+altSum : Group a => Vect n a -> a+altSum (x::y::zs) = (x <-> y) <+> altSum zs+altSum [x] = x+altSum [] = neutral++||| Determinant of a 2-by-2 matrix+det2 : Ring a => Matrix 2 2 a -> a+det2 [[x1,x2],[y1,y2]] = x1 <.> y2 <-> x2 <.> y1++||| Determinant of a square matrix+det : Ring a => Matrix (S (S n)) (S (S n)) a -> a+det {n} m = case n of+ Z => det2 m+ (S k) => altSum . map (\c => indices FZ c m <.> det (subMatrix FZ c m))+ $ fins (S (S (S k)))++-----------------------------------------------------------------------+-- Matrix Algebra Properties+-----------------------------------------------------------------------++-- TODO: Prove properties of matrix algebra for 'Verified' algebraic classes
+ libs/contrib/Data/Matrix/Numeric.idr view
@@ -0,0 +1,129 @@+||| Matrix operations with vector space dimensionalities enforced+||| at the type level. Uses operations from the Num type class.+module Data.Matrix.Numeric++import public Data.Matrix++%default total++infixr 2 <:> -- vector inner product+infixr 2 >< -- vector outer product+infixr 2 <<>> -- matrix commutator+infixr 2 >><< -- matrix anticommutator+infixl 3 <\> -- row times a matrix+infixr 4 </> -- matrix times a column+infixr 5 <> -- matrix multiplication+infixl 5 <#> -- matrix rescale+infixl 5 <# -- vector rescale+infixr 7 \&\ -- vector tensor product+infixr 7 <&> -- matrix tensor product++-----------------------------------------------------------------------+-- Vectors as members of Num+-----------------------------------------------------------------------++instance Num a => Num (Vect n a) where+ (+) = zipWith (+)+ (-) = zipWith (+)+ (*) = zipWith (*)+ abs = id+ fromInteger n = replicate _ (fromInteger n)++-----------------------------------------------------------------------+-- Vector functions+-----------------------------------------------------------------------++||| Inner product of ring vectors+(<:>) : Num a => Vect n a -> Vect n a -> a+(<:>) w v = sum $ zipWith (*) w v++||| Scale a numeric vector by a scalar+(<#) : Num a => a -> Vect n a -> Vect n a+(<#) r = map (r *)++||| Tensor multiply (⊗) numeric vectors+(\&\) : Num a => Vect n a -> Vect m a -> Vect (n * m) a+(\&\) {n} {m} v w = zipWith (*) (oextend m v) (orep n w) where+ orep : (n : Nat) -> Vect m a -> Vect (n * m) a+ orep n v = concat $ replicate n v+ oextend : (n : Nat) -> Vect k a -> Vect (k * n) a+ oextend n w = concat $ map (replicate n) w++||| Standard basis vector with one nonzero entry, numeric data type and vector-length unfixed+basis : Num a => (Fin d) -> Vect d a+basis i = replaceAt i 1 0++-----------------------------------------------------------------------+-- Matrix functions+-----------------------------------------------------------------------++||| Matrix times a column vector+(</>) : Num a => Matrix n m a -> Vect m a -> Vect n a+(</>) m v = map (v <:>) m++||| Matrix times a row vector+(<\>) : Num a => Vect n a -> Matrix n m a -> Vect m a+(<\>) r m = map (r <:>) $ transpose m++||| Matrix multiplication+(<>) : Num a => Matrix n k a ->+ Matrix k m a ->+ Matrix n m a+(<>) m1 m2 = map (<\> m2) m1++||| Scale matrix by a scalar+(<#>) : Num a => a -> Matrix n m a -> Matrix n m a+(<#>) r = map (r <#)++||| Tensor multiply (⊗) for numeric matrices+(<&>) : Num a => Matrix h1 w1 a -> Matrix h2 w2 a -> Matrix (h1 * h2) (w1 * w2) a+(<&>) m1 m2 = zipWith (\&\) (stepOne m1 m2) (stepTwo m1 m2) where+ stepOne : Matrix h1 w1 a -> Matrix h2 w2 a -> Matrix (h1 * h2) w1 a+ stepOne {h2} m1 m2 = concat $ map (replicate h2) m1+ stepTwo : Matrix h1 w1 a -> Matrix h2 w2 a -> Matrix (h1 * h2) w2 a+ stepTwo {h1} m1 m2 = concat $ replicate h1 m2++||| Outer product between numeric vectors+(><) : Num a => Vect n a -> Vect m a -> Matrix n m a+(><) x y = col x <> row y++||| Matrix commutator+(<<>>) : Num a => Matrix n n a -> Matrix n n a -> Matrix n n a+(<<>>) m1 m2 = (m1 <> m2) - (m2 <> m1)++||| Matrix anti-commutator+(>><<) : Num a => Matrix n n a -> Matrix n n a -> Matrix n n a+(>><<) m1 m2 = (m1 <> m2) + (m2 <> m1)++||| Identity matrix+Id : Num a => Matrix d d a+Id = map (\n => basis n) (fins _)++||| Square matrix from diagonal elements+diag_ : Num a => Vect n a -> Matrix n n a+diag_ = zipWith (\f => \x => replaceAt f x 0) (fins _)++||| Combine two matrices to make a new matrix in block diagonal form+blockDiag : Num a => Matrix n n a -> Matrix m m a -> Matrix (n+m) (n+m) a+blockDiag {n} {m} g h = map (++ replicate m 0) g ++ map ((replicate n 0) ++) h++-----------------------------------------------------------------------+-- Determinants+-----------------------------------------------------------------------++||| Alternating sum+altSum : Num a => Vect n a -> a+altSum (x::y::zs) = (x - y) + altSum zs+altSum [x] = x+altSum [] = 0++||| Determinant of a 2-by-2 matrix+det2 : Num a => Matrix 2 2 a -> a+det2 [[x1,x2],[y1,y2]] = x1*y2 - x2*y1++||| Determinant of a square matrix+det : Num a => Matrix (S (S n)) (S (S n)) a -> a+det {n} m = case n of+ Z => det2 m+ (S k) => altSum . map (\c => indices FZ c m * det (subMatrix FZ c m))+ $ fins (S (S (S k)))
− libs/contrib/Data/Nat.idr
@@ -1,166 +0,0 @@-||| Extra utilities for working with Nats-module Data.Nat--import Data.Fin-import Data.So--import Control.WellFounded--%default total-%access public--||| A strict less-than relation on `Nat`.-|||-||| @ n the smaller number-||| @ m the larger number-data LT' : (n,m : Nat) -> Type where- ||| n < 1 + n- LTSucc : LT' n (S n)- ||| n < m implies that n < m + 1- LTStep : LT' n m -> LT' n (S m)--%name LT' lt, lt'--||| Nothing is strictly less than zero-instance Uninhabited (LT' n 0) where- uninhabited LTSucc impossible--||| Zero is less than any non-zero number.-LTZeroLeast : LT' Z (S n)-LTZeroLeast {n = Z} = LTSucc-LTZeroLeast {n = S n} = LTStep LTZeroLeast--||| If n < m, then 1 + n < 1 + m-ltSuccSucc : LT' n m -> LT' (S n) (S m)-ltSuccSucc LTSucc = LTSucc-ltSuccSucc (LTStep lt) = LTStep $ ltSuccSucc lt--||| If n + 1 < m, then n < m-lteToLt' : LTE (S n) m -> LT' n m-lteToLt' {n = Z} (LTESucc x) = LTZeroLeast-lteToLt' {n = S k} (LTESucc x) = ltSuccSucc $ lteToLt' x--||| Convert from LT' to LTE-ltToLTE : LT' n m -> LTE (S n) m-ltToLTE LTSucc = lteRefl-ltToLTE (LTStep lt) = lteSuccRight $ ltToLTE lt--||| Subtraction gives a result that is actually smaller.-minusLT' : (x,y : Nat) -> x - y `LT'` S x-minusLT' Z y = LTSucc-minusLT' (S k) Z = LTSucc-minusLT' (S k) (S j) = LTStep (minusLT' k j)--||| Strict less-than is well-founded, with the cascade stopping at-||| zero (because there's nothing less than zero). This can't be done-||| for LTE, because that one doesn't stop at zero (because `LTE 0 0`-||| is inhabited).-instance WellFounded LT' where- wellFounded x = Access (acc x)- where- ||| Show accessibility by induction on the structure of the LT' witness- acc : (x, y : Nat) -> LT' y x -> Accessible LT' y- -- Zero is vacuously accessible: there's nothing smaller to check- acc Z y lt = absurd lt- -- If the element being accessed is one smaller, we're done- acc (S y) y LTSucc = Access (acc y)- -- If the element is more than one smaller, we need to go further- acc (S k) y (LTStep smaller) = acc k y smaller--||| The result of division on natural numbers.-|||-||| @ dividend the dividend-||| @ divisor the divisor-data DivMod : (dividend, divisor : Nat) -> Type where- ||| The result of division, with a quotient and a remainder.- |||- ||| @ dividend the dividend- ||| @ divisor the divisor- ||| @ quotient the quotient- ||| @ remainder the remainder (bounded by the divisor)- ||| @ ok the fact that this is, in fact, a result of division- DivModRes : {dividend, divisor : Nat} ->- (quotient : Nat) -> (remainder : Fin divisor) ->- (ok : dividend = finToNat remainder + quotient * divisor) ->- DivMod dividend divisor---||| Any natural number can be a `Fin` where the bound is itself plus some difference.-private-toFin : (x : Nat) -> (diff : Nat) -> Fin (plus x (S diff))-toFin Z diff = FZ-toFin (S k) diff = FS $ toFin k diff--||| Converting to a `Fin` and back to `Nat` preserves the input. This is a correctness proof for `toFin`.-private-toFinAndBack : (x : Nat) -> (diff : Nat) -> finToNat (toFin x diff) = x-toFinAndBack Z diff = Refl-toFinAndBack (S k) diff = cong (toFinAndBack k diff)---||| The accessibilty predicate used for division.-private-accPlusLT' : LT' (S j) (S (plus k (S j)))-accPlusLT' {j = Z} {k = Z} = LTSucc-accPlusLT' {j = Z} {k = S k} = LTStep (accPlusLT' {j = Z} {k = k})-accPlusLT' {j = S j} {k = k} = rewrite sym $ plusSuccRightSucc k (S j) in- ltSuccSucc accPlusLT'---||| Division and modulus on `Nat`, inspired by the definition in the-||| Agda standard library.-|||-||| This uses well-founded recursion on `LT'`.-|||-||| @ dividend the dividend-||| @ divisor the divisor-||| @ nonzero division by zero is nonsense-total -- yay!-divMod : (dividend, divisor : Nat) ->- {auto nonzero : So (not (decAsBool (decEq divisor Z)))} ->- DivMod dividend divisor-divMod _ Z {nonzero} = absurd nonzero-divMod Z (S k) = DivModRes 0 FZ Refl-divMod (S j) (S k) {nonzero} = wfInd {P=P} stepDiv (S j) (S k) nonzero- where- ||| The goal passed to the accessibility eliminator.- |||- ||| This is responsible for generating the goal in the- ||| well-founded fixed point.- |||- ||| @ dividend the dividend to recurse over- P : (dividend : Nat) -> Type- P dividend = (divisor : Nat) -> (nonzero : So (not (decAsBool (decEq divisor Z)))) -> DivMod dividend divisor--- ||| Well-founded recursion needs a recursion operator.- |||- ||| @ dividend the dividend we are recursing over- ||| @ rec the recursive call provided by the well-founded induction operator- stepDiv : (dividend : Nat) -> (rec : (d' : Nat) -> LT' d' dividend -> P d') -> P dividend- -- We need not consider division by zero- stepDiv dividend rec Z nonzero = absurd nonzero- -- Dividing zero by anyting else gives 0, with 0 remainder- stepDiv Z rec (S k) nonzero = DivModRes 0 0 Refl- -- To divide two non-zero values, we must know which is larger- stepDiv (S j) rec (S k) nonzero with (cmp j k)- -- n / n = 1 remainder 0- stepDiv (S j) rec (S j) nonzero | CmpEQ =- DivModRes 1 0 (sym $ cong (plusZeroRightNeutral j))- -- if n < m, then m = n + r, and the quotient is 0 with remainder r- stepDiv (S j) rec (S (plus j (S diff))) nonzero | CmpLT diff =- DivModRes 0 (toFin (S j) diff) $- rewrite toFinAndBack j diff- in sym $ cong (plusZeroRightNeutral j)- -- if n > m, then n = m + d, and the quotient is 1 + ((n - m) / m) with the same remainder- stepDiv (S (plus k (S diff))) rec (S k) nonzero | CmpGT diff =- let res = rec (S diff) accPlusLT' (S k) Oh- in case res of- DivModRes quotient remainder ok =>- DivModRes (S quotient) remainder $- rewrite plusAssociative (finToNat remainder) (S k) (mult quotient (S k)) in- rewrite plusCommutative (finToNat remainder) (S k) in- rewrite sym $ plusAssociative (S k) (finToNat remainder) (mult quotient (S k)) in- rewrite ok in Refl--
+ libs/contrib/Data/Nat/DivMod.idr view
@@ -0,0 +1,60 @@+||| Euclidean division using primitive recursion/induction.+module Data.Nat.DivMod++%default total++||| The result of euclidean division of natural numbers+|||+||| @ dividend the dividend+||| @ divisor the divisor+data DivMod : (dividend, divisor : Nat) -> Type where+ ||| The result of division. The order of operations and operands in the+ ||| result type was picked to not require any explicit proofs.+ |||+ ||| @ quotient the quotient+ ||| @ remainder the remainder+ ||| @ divisor the divisor+ ||| @ remainderSmall proof that the remainder is in the range+ ||| `[0 .. divisor - 1]`+ MkDivMod : (quotient, remainder : Nat) ->+ (remainderSmall : remainder `LT` divisor) ->+ DivMod (remainder + quotient * divisor) divisor++||| The base case, dividing zero by a successor.+|||+||| @ n the predecessor of the divisor+ZDivModSn : Z `DivMod` S n+ZDivModSn = MkDivMod 0 0 (LTESucc LTEZero)++||| Given a number less than or equal to a bound, is it equal, or less?+|||+||| @ m the lesser or equal number+||| @ n the greater or equal number+||| @ mLten proof that `m` is less than or equal to `n`+stepLT : (mLten : m `LTE` n) -> Either (m = n) (m `LT` n)+stepLT {m = Z} {n = Z} LTEZero = Left Refl+stepLT {m = Z} {n = (S n)} LTEZero = Right (LTESucc LTEZero)+stepLT {m = (S m)} {n = (S n)} (LTESucc mLten) with (stepLT mLten)+ stepLT {m = (S m)} {n = (S n)} (LTESucc mLten) | (Left mEqn) = Left $ cong mEqn+ stepLT {m = (S m)} {n = (S n)} (LTESucc mLten) | (Right mLtn) = Right $ LTESucc mLtn++||| The inductive step, taking a division of `m` to a division of `S m`+|||+||| @ m the dividend in the inductive hypothesis+||| @ n the divisor+||| @ hyp the inductive hypothesis+SmDivModn : (hyp : m `DivMod` n) -> (S m) `DivMod` n+SmDivModn (MkDivMod q r rLtn) with (stepLT rLtn)+ SmDivModn (MkDivMod q r rLtn) | (Left Refl) = MkDivMod (S q) 0 (LTESucc LTEZero)+ SmDivModn (MkDivMod q r rLtn) | (Right srLtn) = MkDivMod q (S r) srLtn++||| Euclidean division. Note that this takes the predecessor of the divisor to+||| avoid division by zero.+|||+||| @ dividend the dividend+||| @ predDivisor the predecessor of the desired divisor+divMod : (dividend, predDivisor : Nat) -> dividend `DivMod` S predDivisor+divMod Z n = ZDivModSn+divMod (S m) n = SmDivModn (m `divMod` n)++
+ libs/contrib/Data/Nat/DivMod/IteratedSubtraction.idr view
@@ -0,0 +1,167 @@+||| Division of natural numbers, by iterated subtraction using well-founded+||| recursion+module Data.Nat.DivMod.IteratedSubtraction++import Data.Fin+import Data.So++import Control.WellFounded++%default total+%access public++||| A strict less-than relation on `Nat`.+|||+||| @ n the smaller number+||| @ m the larger number+data LT' : (n,m : Nat) -> Type where+ ||| n < 1 + n+ LTSucc : LT' n (S n)+ ||| n < m implies that n < m + 1+ LTStep : LT' n m -> LT' n (S m)++%name LT' lt, lt'++||| Nothing is strictly less than zero+instance Uninhabited (LT' n 0) where+ uninhabited LTSucc impossible++||| Zero is less than any non-zero number.+LTZeroLeast : LT' Z (S n)+LTZeroLeast {n = Z} = LTSucc+LTZeroLeast {n = S n} = LTStep LTZeroLeast++||| If n < m, then 1 + n < 1 + m+ltSuccSucc : LT' n m -> LT' (S n) (S m)+ltSuccSucc LTSucc = LTSucc+ltSuccSucc (LTStep lt) = LTStep $ ltSuccSucc lt++||| If n + 1 < m, then n < m+lteToLt' : LTE (S n) m -> LT' n m+lteToLt' {n = Z} (LTESucc x) = LTZeroLeast+lteToLt' {n = S k} (LTESucc x) = ltSuccSucc $ lteToLt' x++||| Convert from LT' to LTE+ltToLTE : LT' n m -> LTE (S n) m+ltToLTE LTSucc = lteRefl+ltToLTE (LTStep lt) = lteSuccRight $ ltToLTE lt++||| Subtraction gives a result that is actually smaller.+minusLT' : (x,y : Nat) -> x - y `LT'` S x+minusLT' Z y = LTSucc+minusLT' (S k) Z = LTSucc+minusLT' (S k) (S j) = LTStep (minusLT' k j)++||| Strict less-than is well-founded, with the cascade stopping at+||| zero (because there's nothing less than zero). This can't be done+||| for LTE, because that one doesn't stop at zero (because `LTE 0 0`+||| is inhabited).+instance WellFounded LT' where+ wellFounded x = Access (acc x)+ where+ ||| Show accessibility by induction on the structure of the LT' witness+ acc : (x, y : Nat) -> LT' y x -> Accessible LT' y+ -- Zero is vacuously accessible: there's nothing smaller to check+ acc Z y lt = absurd lt+ -- If the element being accessed is one smaller, we're done+ acc (S y) y LTSucc = Access (acc y)+ -- If the element is more than one smaller, we need to go further+ acc (S k) y (LTStep smaller) = acc k y smaller++||| The result of division on natural numbers.+|||+||| @ dividend the dividend+||| @ divisor the divisor+data DivMod : (dividend, divisor : Nat) -> Type where+ ||| The result of division, with a quotient and a remainder.+ |||+ ||| @ dividend the dividend+ ||| @ divisor the divisor+ ||| @ quotient the quotient+ ||| @ remainder the remainder (bounded by the divisor)+ ||| @ ok the fact that this is, in fact, a result of division+ DivModRes : {dividend, divisor : Nat} ->+ (quotient : Nat) -> (remainder : Fin divisor) ->+ (ok : dividend = finToNat remainder + quotient * divisor) ->+ DivMod dividend divisor+++||| Any natural number can be a `Fin` where the bound is itself plus some difference.+private+toFin : (x : Nat) -> (diff : Nat) -> Fin (plus x (S diff))+toFin Z diff = FZ+toFin (S k) diff = FS $ toFin k diff++||| Converting to a `Fin` and back to `Nat` preserves the input. This is a correctness proof for `toFin`.+private+toFinAndBack : (x : Nat) -> (diff : Nat) -> finToNat (toFin x diff) = x+toFinAndBack Z diff = Refl+toFinAndBack (S k) diff = cong (toFinAndBack k diff)+++||| The accessibilty predicate used for division.+private+accPlusLT' : LT' (S j) (S (plus k (S j)))+accPlusLT' {j = Z} {k = Z} = LTSucc+accPlusLT' {j = Z} {k = S k} = LTStep (accPlusLT' {j = Z} {k = k})+accPlusLT' {j = S j} {k = k} = rewrite sym $ plusSuccRightSucc k (S j) in+ ltSuccSucc accPlusLT'+++||| Division and modulus on `Nat`, inspired by the definition in the+||| Agda standard library.+|||+||| This uses well-founded recursion on `LT'`.+|||+||| @ dividend the dividend+||| @ divisor the divisor+||| @ nonzero division by zero is nonsense+total -- yay!+divMod : (dividend, divisor : Nat) ->+ {auto nonzero : So (not (decAsBool (decEq divisor Z)))} ->+ DivMod dividend divisor+divMod _ Z {nonzero} = absurd nonzero+divMod Z (S k) = DivModRes 0 FZ Refl+divMod (S j) (S k) {nonzero} = wfInd {P=P} stepDiv (S j) (S k) nonzero+ where+ ||| The goal passed to the accessibility eliminator.+ |||+ ||| This is responsible for generating the goal in the+ ||| well-founded fixed point.+ |||+ ||| @ dividend the dividend to recurse over+ P : (dividend : Nat) -> Type+ P dividend = (divisor : Nat) -> (nonzero : So (not (decAsBool (decEq divisor Z)))) -> DivMod dividend divisor+++ ||| Well-founded recursion needs a recursion operator.+ |||+ ||| @ dividend the dividend we are recursing over+ ||| @ rec the recursive call provided by the well-founded induction operator+ stepDiv : (dividend : Nat) -> (rec : (d' : Nat) -> LT' d' dividend -> P d') -> P dividend+ -- We need not consider division by zero+ stepDiv dividend rec Z nonzero = absurd nonzero+ -- Dividing zero by anyting else gives 0, with 0 remainder+ stepDiv Z rec (S k) nonzero = DivModRes 0 0 Refl+ -- To divide two non-zero values, we must know which is larger+ stepDiv (S j) rec (S k) nonzero with (cmp j k)+ -- n / n = 1 remainder 0+ stepDiv (S j) rec (S j) nonzero | CmpEQ =+ DivModRes 1 0 (sym $ cong (plusZeroRightNeutral j))+ -- if n < m, then m = n + r, and the quotient is 0 with remainder r+ stepDiv (S j) rec (S (plus j (S diff))) nonzero | CmpLT diff =+ DivModRes 0 (toFin (S j) diff) $+ rewrite toFinAndBack j diff+ in sym $ cong (plusZeroRightNeutral j)+ -- if n > m, then n = m + d, and the quotient is 1 + ((n - m) / m) with the same remainder+ stepDiv (S (plus k (S diff))) rec (S k) nonzero | CmpGT diff =+ let res = rec (S diff) accPlusLT' (S k) Oh+ in case res of+ DivModRes quotient remainder ok =>+ DivModRes (S quotient) remainder $+ rewrite plusAssociative (finToNat remainder) (S k) (mult quotient (S k)) in+ rewrite plusCommutative (finToNat remainder) (S k) in+ rewrite sym $ plusAssociative (S k) (finToNat remainder) (mult quotient (S k)) in+ rewrite ok in Refl++
libs/contrib/System/Concurrency/Process.idr view
@@ -34,8 +34,10 @@ myID = Lift (return (MkPID prim__vm)) ||| Send a message to another process-send : ProcID msg -> msg -> Process msg ()-send (MkPID p) m = Lift (sendToThread p (prim__vm, m))+||| Returns whether the send was unsuccessful.+send : ProcID msg -> msg -> Process msg Bool+send (MkPID p) m = Lift (do x <- sendToThread p (prim__vm, m)+ return (x == 1)) ||| Return whether a message is waiting in the queue msgWaiting : Process msg Bool
libs/contrib/contrib.ipkg view
@@ -9,8 +9,9 @@ Control.WellFounded, Classes.Verified, Data.Fun, Data.Rel,- Data.Hash, Data.Matrix,- Data.Nat,+ Data.Hash,+ Data.Matrix, Data.Matrix.Algebraic, Data.Matrix.Numeric,+ Data.Nat.DivMod, Data.Nat.DivMod.IteratedSubtraction, Data.ZZ, Data.Sign, Data.BoundedList, Data.Heap,
+ libs/effects/Effect/Logging/Default.idr view
@@ -0,0 +1,57 @@+-- ------------------------------------------------------------- [ Default.idr ]+-- Module : Default.idr+-- Copyright : (c) The Idris Community+-- License : see LICENSE+-- --------------------------------------------------------------------- [ EOH ]++||| A logging effect that allows messages to be logged using both+||| numerical levels and user specified categories. The higher the+||| logging level the grater in verbosity the logging.+|||+||| In this effect the resource we are computing over is the logging+||| level itself and the list of categories to show.+|||+module Effect.Logging.Default++import Effects+import public Effect.Logging.Level++import Control.IOExcept -- TODO Add IOExcept Logger.++||| A Logging effect to log levels and categories.+data Logging : Effect where+ Log : (Eq a, Show a) =>+ (lvl : Nat)+ -> (cats : List a)+ -> (msg : String)+ -> Logging () (Nat,List a) (\v => (Nat,List a))++||| The Logging effect.+|||+||| @cTy The type used to differentiate categories.+LOG : (cTy : Type) -> EFFECT+LOG a = MkEff (Nat, List a) Logging++instance Handler Logging IO where+ handle (l,cs) (Log lvl cs' msg) k = do+ case lvl <= l of+ False => k () (l,cs)+ True => do+ let res = and $ map (\x => elem x cs') cs+ let prompt = if isNil cs then "" else show cs+ if res || isNil cs+ then do+ printLn $ unwords [show lvl, ":", prompt, ":", msg]+ k () (l,cs)+ else k () (l,cs)++||| Log the given message at the given level and assign it the list of categories.+|||+||| @l The logging level.+||| @cs The logging categories.+||| @m THe message to be logged.+log : (Show a, Eq a) => (l : Nat)+ -> (cs : List a) -> (m : String) -> Eff () [LOG a]+log lvl cs msg = call $ Log lvl cs msg++-- --------------------------------------------------------------------- [ EOF ]
+ libs/effects/Effect/Logging/Level.idr view
@@ -0,0 +1,49 @@+-- -------------------------------------------------------------- [ Levels.idr ]+-- Module : Levels.idr+-- Copyright : (c) Jan de Muijnck-Hughes+-- License : see LICENSE+-- --------------------------------------------------------------------- [ EOH ]+||| Common aliases and definitions of Logging Levels.+module Effect.Logging.Level++%access public+-- ---------------------------------------------- [ Nat Derived Logging Levels ]+--+-- Several aliases have been defined to aide in semantic use of the+-- logging levels. These aliases have come from the Log4j family of+-- loggers.++||| No events will be logged.+OFF : Nat+OFF = 0++||| A severe error that will prevent the application from continuing.+FATAL : Nat+FATAL = 1++||| An error in the application, possibly recoverable.+ERROR : Nat+ERROR = 2++||| An event that might possible lead to an error.+WARN : Nat+WARN = 3++||| An event for informational purposes.+INFO : Nat+INFO = 4++||| A general debugging event.+DEBUG : Nat+DEBUG = 5++||| A fine-grained debug message, typically capturing the flow through+||| the application.+TRACE : Nat+TRACE = 6++||| All events should be logged.+ALL : Nat+ALL = 7++-- --------------------------------------------------------------------- [ EOF ]
+ libs/effects/Effect/Logging/Simple.idr view
@@ -0,0 +1,48 @@+-- -------------------------------------------------------------- [ Simple.idr ]+-- Module : Logging.idr+-- Copyright : (c) The Idris Community+-- License : see LICENSE+--------------------------------------------------------------------- [ EOH ]++||| A simple logging effect that allows messages to be logged at+||| different numerical level. The higher the number the grater in+||| verbosity the logging.+|||+||| In this effect the resource we are computing over is the logging+||| level itself.+|||+module Effect.Logging.Simple++import Effects+import public Effect.Logging.Level++import Control.IOExcept -- TODO Add IO Logging Handler++||| A Logging effect that displays a logging message to be logged at a+||| certain level.+data Logging : Effect where+ Log : (lvl : Nat)+ -> (msg : String)+ -> Logging () Nat (\v => Nat)++||| A Logging Effect.+LOG : EFFECT+LOG = MkEff Nat Logging++-- For logging in the IO context+instance Handler Logging IO where+ handle l (Log lvl msg) k = do+ case lvl <= l of+ False => k () l+ True => do+ printLn $ unwords [show lvl, ":", msg]+ k () l++||| Log `msg` at the given level.+|||+||| @l The level to log.+||| @m The message to log.+log : (l : Nat) -> (m : String) -> Eff () [LOG]+log lvl msg = call $ Log lvl msg++-- --------------------------------------------------------------------- [ EOF ]
libs/effects/Effect/Monad.idr view
@@ -2,20 +2,27 @@ import Effects --- Eff is a monad too, so we can happily use it in a monad transformer.+data MonadEffT : List EFFECT -> (Type -> Type) -> Type -> Type where+ MkMonadEffT : EffM m a xs (\v => xs) -> MonadEffT xs m a -using (xs : List EFFECT, m : Type -> Type)- instance Functor (\a => EffM m a xs (\v => xs)) where- map f prog = do t <- prog- value (f t)+instance Functor (MonadEffT xs f) where+ map f (MkMonadEffT x) = MkMonadEffT (do x' <- x+ pure (f x')) - instance Applicative (\a => EffM m a xs (\v => xs)) where- pure = value- (<*>) f a = do f' <- f- a' <- a- value (f' a')+instance Applicative (MonadEffT xs f) where+ pure x = MkMonadEffT (pure x)+ (<*>) (MkMonadEffT f) (MkMonadEffT x) + = MkMonadEffT (do f' <- f+ x' <- x+ pure (f' x')) - instance Monad (\a => Eff m a xs (\v => xs)) where- (>>=) = Effects.(>>=)+instance Monad (MonadEffT xs f) where+ (>>=) (MkMonadEffT x) f = MkMonadEffT (do x' <- x+ let MkMonadEffT fx = f x'+ fx) +implicit monadEffT : EffM m a xs (\v => xs) -> MonadEffT xs m a+monadEffT = MkMonadEffT +MonadEff : List EFFECT -> Type -> Type+MonadEff xs = MonadEffT xs id
libs/effects/Effect/Random.idr view
@@ -2,7 +2,6 @@ import Effects import Data.Vect-import Data.Fin data Random : Effect where getRandom : sig Random Integer Integer
libs/effects/Effect/System.idr view
@@ -9,7 +9,7 @@ data System : Effect where Args : sig System (List String)- Time : sig System Int+ Time : sig System Integer GetEnv : String -> sig System (Maybe String) CSystem : String -> sig System Int @@ -33,7 +33,7 @@ getArgs : Eff (List String) [SYSTEM] getArgs = call Args -time : Eff Int [SYSTEM]+time : Eff Integer [SYSTEM] time = call Time getEnv : String -> Eff (Maybe String) [SYSTEM]
+ libs/effects/Effect/Trans.idr view
@@ -0,0 +1,20 @@+module Effect.Trans++import Effects++%access public++data Trans : (Type -> Type) -> Effect where+ Lift : m a -> sig (Trans m) a++-- using (m : Type -> Type)+instance Monad m => Handler (Trans m) m where+ handle st (Lift op) k = do x <- op+ k x ()++TRANS : (Type -> Type) -> EFFECT+TRANS m = MkEff () (Trans m)++lift : m a -> Eff a [TRANS m]+lift op = call $ Lift op+
libs/effects/Effects.idr view
@@ -293,15 +293,13 @@ call : {a, b: _} -> {e : Effect} -> (eff : e t a b) ->- {default tactics { search 100; }- prf : EffElem e a xs} ->+ {auto prf : EffElem e a xs} -> EffM m t xs (\v => updateResTy v xs prf eff) call e {prf} = callP prf e implicit lift : EffM m t ys ys' ->- {default tactics { search 100; }- prf : SubList ys xs} ->+ {auto prf : SubList ys xs} -> EffM m t xs (\v => updateWith (ys' v) xs prf) lift e {prf} = liftP prf e
libs/effects/effects.ipkg view
@@ -1,9 +1,20 @@ package effects opts = "--nobasepkgs -i ../prelude -i ../base"-modules = Effects, Effect.Default, - Effect.Exception, Effect.File, Effect.State,- Effect.Random, Effect.StdIO, Effect.Select,- Effect.Memory, Effect.System+modules = Effects+ , Effect.Default+ , Effect.Monad + , Effect.Exception+ , Effect.File+ , Effect.State+ , Effect.Random+ , Effect.StdIO+ , Effect.Select+ , Effect.Memory+ , Effect.System+ , Effect.Trans+ , Effect.Logging.Level+ , Effect.Logging.Simple+ , Effect.Logging.Default
libs/prelude/Builtins.idr view
@@ -119,7 +119,8 @@ ||| Make a read-only version of a unique value, which can be passed to another ||| function without the unique value being consumed.- implicit+ implicit -- needs a special case in the coercion code, since implicits need+ -- a concrete type to coerce! lend : {a : UniqueType} -> a -> Borrowed a lend x = Read x @@ -170,6 +171,8 @@ %extern prim__stderr : Ptr %extern prim__null : Ptr+%extern prim__eqPtr : Ptr -> Ptr -> Int+%extern prim__eqManagedPtr : ManagedPtr -> ManagedPtr -> Int %extern prim__registerPtr : Ptr -> Int -> ManagedPtr
libs/prelude/Decidable/Equality.idr view
@@ -123,7 +123,7 @@ -- List -------------------------------------------------------------------------------- -lemma_val_not_nil : {x : t, xs : List t} -> ((x :: xs) = Prelude.List.Nil {a = t} -> Void)+lemma_val_not_nil : {x : t, xs : List t} -> ((x :: xs) = Prelude.List.Nil {elem = t} -> Void) lemma_val_not_nil Refl impossible lemma_x_eq_xs_neq : {x : t, xs : List t, y : t, ys : List t} -> (x = y) -> (xs = ys -> Void) -> ((x :: xs) = (y :: ys) -> Void)@@ -191,5 +191,26 @@ where primitiveEq : x = y primitiveEq = believe_me (Refl {x}) postulate primitiveNotEq : x = y -> Void++--------------------------------------------------------------------------------+-- Ptr+--------------------------------------------------------------------------------++instance DecEq Ptr where+ decEq x y = if x == y then Yes primitiveEq else No primitiveNotEq+ where primitiveEq : x = y+ primitiveEq = believe_me (Refl {x})+ postulate primitiveNotEq : x = y -> Void++--------------------------------------------------------------------------------+-- ManagedPtr+--------------------------------------------------------------------------------++instance DecEq ManagedPtr where+ decEq x y = if x == y then Yes primitiveEq else No primitiveNotEq+ where primitiveEq : x = y+ primitiveEq = believe_me (Refl {x})+ postulate primitiveNotEq : x = y -> Void+
libs/prelude/IO.idr view
@@ -6,7 +6,7 @@ %access public ||| Idris's primitive IO, for building abstractions on top of-abstract +abstract data PrimIO : Type -> Type where prim__IO : a -> PrimIO a @@ -20,13 +20,22 @@ abstract WorldRes : Type -> Type WorldRes x = x +||| An FFI specifier, which describes how a particular compiler+||| backend handles foreign function calls. record FFI where constructor MkFFI+ ||| A family describing which types are available in the FFI ffi_types : Type -> Type++ ||| The type used to specify the names of foreign functions in this FFI ffi_fn : Type++ ||| How this FFI describes exported datatypes ffi_data : Type -abstract +||| The IO type, parameterised over the FFI that is available within+||| it.+abstract data IO' : (lang : FFI) -> Type -> Type where MkIO : (World -> PrimIO (WorldRes a)) -> IO' lang a @@ -64,6 +73,19 @@ foreign_prim f fname (FFun arg sc) env = \x => foreign_prim f fname sc ((arg, x) :: env) +||| Call a foreign function.+|||+||| The particular semantics of foreign function calls depend on the+||| Idris compiler backend in use. For the default C backend, see the+||| documentation for `FFI_C`.+|||+||| For more details, please consult [the Idris documentation](http://docs.idris-lang.org/en/latest/reference/ffi.html).+|||+||| @ f an FFI descriptor, which is specific to the compiler backend.+||| @ fname the name of the foreign function+||| @ ty the Idris type for the foreign function+||| @ fty an automatically-found proof that the Idris type works with+||| the FFI in question %inline foreign : (f : FFI) -> (fname : ffi_fn f) -> (ty : Type) -> {auto fty : FTy f [] ty} -> ty@@ -128,7 +150,7 @@ -- Tell erasure analysis not to erase the argument %used MkRaw x - -- Supported C integer types+ ||| Supported C integer types data C_IntTypes : Type -> Type where C_IntChar : C_IntTypes Char C_IntNative : C_IntTypes Int@@ -137,7 +159,7 @@ C_IntBits32 : C_IntTypes Bits32 C_IntBits64 : C_IntTypes Bits64 - -- Supported C foreign types+ ||| Supported C foreign types data C_Types : Type -> Type where C_Str : C_Types String C_Float : C_Types Float@@ -147,6 +169,8 @@ C_Any : C_Types (Raw a) C_IntT : C_IntTypes i -> C_Types i + ||| A descriptor for the C FFI. See the constructors of `C_Types`+ ||| and `C_IntTypes` for the concrete types that are available. FFI_C : FFI FFI_C = MkFFI C_Types String String @@ -201,14 +225,17 @@ -- pass we only have 'JsFn' and not the constructor. %used MkJsFn x -FFI_JS : FFI +||| The JavaScript FFI. The strings naming functions in this API are+||| JavaScript code snippets, into which the arguments are substituted+||| for the placeholders `%0`, `%1`, etc.+FFI_JS : FFI FFI_JS = MkFFI JS_Types String String JS_IO : Type -> Type JS_IO = IO' FFI_JS ---------- Foreign Exports +--------- Foreign Exports namespace FFI_Export -- It's just like Data.List.Elem, but we don't need all the other stuff@@ -226,7 +253,7 @@ %used FFI_Prim prim data FFI_Exportable : (f : FFI) -> List (Type, ffi_data f) -> Type -> Type where- FFI_IO : (b : FFI_Base f xs t) -> FFI_Exportable f xs (IO t)+ FFI_IO : (b : FFI_Base f xs t) -> FFI_Exportable f xs (IO' f t) FFI_Fun : (b : FFI_Base f xs s) -> (a : FFI_Exportable f xs t) -> FFI_Exportable f xs (s -> t) FFI_Ret : (b : FFI_Base f xs t) -> FFI_Exportable f xs t
libs/prelude/Language/Reflection.idr view
@@ -215,6 +215,8 @@ NamePart TTName | ||| An Idris term, to be pretty printed TermPart TT |+ ||| A Raw term to be displayed by the compiler+ RawPart Raw | ||| An indented sub-report, to provide more details SubReport (List ErrorReportPart) %name ErrorReportPart part, p@@ -399,13 +401,13 @@ instance Quotable a TT => Quotable (List a) TT where quotedTy = `(List ~(quotedTy {a}))- quote [] = `(List.Nil {a=~(quotedTy {a})})- quote (x :: xs) = `(List.(::) {a=~(quotedTy {a})} ~(quote x) ~(quote xs))+ quote [] = `(List.Nil {elem=~(quotedTy {a})})+ quote (x :: xs) = `(List.(::) {elem=~(quotedTy {a})} ~(quote x) ~(quote xs)) instance Quotable a Raw => Quotable (List a) Raw where quotedTy = `(List ~(quotedTy {a}))- quote [] = `(List.Nil {a=~(quotedTy {a})})- quote (x :: xs) = `(List.(::) {a=~(quotedTy {a})} ~(quote x) ~(quote xs))+ quote [] = `(List.Nil {elem=~(quotedTy {a})})+ quote (x :: xs) = `(List.(::) {elem=~(quotedTy {a})} ~(quote x) ~(quote xs)) mutual instance Quotable TTName TT where@@ -576,42 +578,71 @@ quote (PVar x) = `(PVar {a=TT} ~(assert_total (quote x))) quote (PVTy x) = `(PVTy {a=TT} ~(assert_total (quote x))) --instance Quotable ErrorReportPart TT where- quotedTy = `(ErrorReportPart)- quote (TextPart x) = `(TextPart ~(quote x))- quote (NamePart n) = `(NamePart ~(quote n))- quote (TermPart tm) = `(TermPart ~(quote tm))- quote (SubReport xs) = `(SubReport ~(assert_total $ quote xs))- mutual- quoteRaw : Raw -> TT- quoteRaw (Var n) = `(Var ~(quote n))- quoteRaw (RBind n b tm) = `(RBind ~(quote n) ~(assert_total $ quoteRawBinder b) ~(quoteRaw tm))- quoteRaw (RApp tm tm') = `(RApp ~(quoteRaw tm) ~(quoteRaw tm'))- quoteRaw RType = `(RType)- quoteRaw (RUType u) = `(RUType ~(quote u))- quoteRaw (RForce tm) = `(RForce ~(quoteRaw tm))- quoteRaw (RConstant c) = `(RConstant ~(quote c))+ quoteRawTT : Raw -> TT+ quoteRawTT (Var n) = `(Var ~(quote n))+ quoteRawTT (RBind n b tm) = `(RBind ~(quote n) ~(assert_total $ quoteRawBinderTT b) ~(quoteRawTT tm))+ quoteRawTT (RApp tm tm') = `(RApp ~(quoteRawTT tm) ~(quoteRawTT tm'))+ quoteRawTT RType = `(RType)+ quoteRawTT (RUType u) = `(RUType ~(quote u))+ quoteRawTT (RForce tm) = `(RForce ~(quoteRawTT tm))+ quoteRawTT (RConstant c) = `(RConstant ~(quote c)) - quoteRawBinder : Binder Raw -> TT- quoteRawBinder (Lam x) = `(Lam {a=Raw} ~(quoteRaw x))- quoteRawBinder (Pi x k) = `(Pi {a=Raw} ~(quoteRaw x) ~(quoteRaw k))- quoteRawBinder (Let x y) = `(Let {a=Raw} ~(quoteRaw x) ~(quoteRaw y))- quoteRawBinder (NLet x y) = `(NLet {a=Raw} ~(quoteRaw x) ~(quoteRaw y))- quoteRawBinder (Hole x) = `(Hole {a=Raw} ~(quoteRaw x))- quoteRawBinder (GHole x) = `(GHole {a=Raw} ~(quoteRaw x))- quoteRawBinder (Guess x y) = `(Guess {a=Raw} ~(quoteRaw x) ~(quoteRaw y))- quoteRawBinder (PVar x) = `(PVar {a=Raw} ~(quoteRaw x))- quoteRawBinder (PVTy x) = `(PVTy {a=Raw} ~(quoteRaw x))+ quoteRawBinderTT : Binder Raw -> TT+ quoteRawBinderTT (Lam x) = `(Lam {a=Raw} ~(quoteRawTT x))+ quoteRawBinderTT (Pi x k) = `(Pi {a=Raw} ~(quoteRawTT x) ~(quoteRawTT k))+ quoteRawBinderTT (Let x y) = `(Let {a=Raw} ~(quoteRawTT x) ~(quoteRawTT y))+ quoteRawBinderTT (NLet x y) = `(NLet {a=Raw} ~(quoteRawTT x) ~(quoteRawTT y))+ quoteRawBinderTT (Hole x) = `(Hole {a=Raw} ~(quoteRawTT x))+ quoteRawBinderTT (GHole x) = `(GHole {a=Raw} ~(quoteRawTT x))+ quoteRawBinderTT (Guess x y) = `(Guess {a=Raw} ~(quoteRawTT x) ~(quoteRawTT y))+ quoteRawBinderTT (PVar x) = `(PVar {a=Raw} ~(quoteRawTT x))+ quoteRawBinderTT (PVTy x) = `(PVTy {a=Raw} ~(quoteRawTT x)) instance Quotable Raw TT where quotedTy = `(Raw)- quote = quoteRaw+ quote = quoteRawTT instance Quotable (Binder Raw) TT where quotedTy = `(Binder Raw)- quote = quoteRawBinder+ quote = quoteRawBinderTT++mutual+ quoteRawRaw : Raw -> Raw+ quoteRawRaw (Var n) = `(Var ~(quote n))+ quoteRawRaw (RBind n b tm) = `(RBind ~(quote n) ~(assert_total $ quoteRawBinderRaw b) ~(quoteRawRaw tm))+ quoteRawRaw (RApp tm tm') = `(RApp ~(quoteRawRaw tm) ~(quoteRawRaw tm'))+ quoteRawRaw RType = `(RType)+ quoteRawRaw (RUType u) = `(RUType ~(quote u))+ quoteRawRaw (RForce tm) = `(RForce ~(quoteRawRaw tm))+ quoteRawRaw (RConstant c) = `(RConstant ~(quote c))++ quoteRawBinderRaw : Binder Raw -> Raw+ quoteRawBinderRaw (Lam x) = `(Lam {a=Raw} ~(quoteRawRaw x))+ quoteRawBinderRaw (Pi x k) = `(Pi {a=Raw} ~(quoteRawRaw x) ~(quoteRawRaw k))+ quoteRawBinderRaw (Let x y) = `(Let {a=Raw} ~(quoteRawRaw x) ~(quoteRawRaw y))+ quoteRawBinderRaw (NLet x y) = `(NLet {a=Raw} ~(quoteRawRaw x) ~(quoteRawRaw y))+ quoteRawBinderRaw (Hole x) = `(Hole {a=Raw} ~(quoteRawRaw x))+ quoteRawBinderRaw (GHole x) = `(GHole {a=Raw} ~(quoteRawRaw x))+ quoteRawBinderRaw (Guess x y) = `(Guess {a=Raw} ~(quoteRawRaw x) ~(quoteRawRaw y))+ quoteRawBinderRaw (PVar x) = `(PVar {a=Raw} ~(quoteRawRaw x))+ quoteRawBinderRaw (PVTy x) = `(PVTy {a=Raw} ~(quoteRawRaw x))++instance Quotable Raw Raw where+ quotedTy = `(Raw)+ quote = quoteRawRaw++instance Quotable (Binder Raw) Raw where+ quotedTy = `(Binder Raw)+ quote = quoteRawBinderRaw++instance Quotable ErrorReportPart TT where+ quotedTy = `(ErrorReportPart)+ quote (TextPart x) = `(TextPart ~(quote x))+ quote (NamePart n) = `(NamePart ~(quote n))+ quote (TermPart tm) = `(TermPart ~(quote tm))+ quote (RawPart tm) = `(RawPart ~(quote tm))+ quote (SubReport xs) = `(SubReport ~(assert_total $ quote xs)) instance Quotable Tactic TT where quotedTy = `(Tactic)
libs/prelude/Language/Reflection/Elab.idr view
@@ -7,24 +7,52 @@ import Builtins import Prelude.Applicative+import Prelude.Basics+import Prelude.Bool import Prelude.Functor import Prelude.List import Prelude.Maybe import Prelude.Monad+import Prelude.Nat import Language.Reflection -||| Arguments, with plicity.-data Arg : Type where- ||| An explicit argument- Explicit : TTName -> Raw -> Arg+data Fixity = Infixl Nat | Infixr Nat | Infix Nat | Prefix Nat - ||| An implicit argument, to be solved by unification- Implicit : TTName -> Raw -> Arg+||| Erasure annotations reflect Idris's idea of what is intended to be+||| erased.+data Erasure = Erased | NotErased - ||| A type-class constraint argument, to be solved by type class- ||| resolution- Constraint : TTName -> Raw -> Arg+||| How an argument is provided in high-level Idris+data Plicity =+ ||| The argument is directly provided at the application site+ Explicit |+ ||| The argument is found by Idris at the application site+ Implicit |+ ||| The argument is solved using type class resolution+ Constraint +||| Function arguments+|||+||| These are the simplest representation of argument lists, and are+||| used for functions.+record FunArg where+ constructor MkFunArg+ argName : TTName+ argTy : Raw+ plicity : Plicity+ erasure : Erasure++||| Type constructor arguments+|||+||| Each argument is identified as being either a parameter that is+||| consistent in all constructors, or an index that varies based on+||| which constructor is selected.+data TyConArg =+ ||| Parameters are uniform across the constructors+ TyConParameter FunArg |+ ||| Indices are not uniform+ TyConIndex FunArg+ ||| A type declaration data TyDecl : Type where ||| A type declaration.@@ -36,38 +64,35 @@ ||| @ fn the name to be declared, fully-qualified ||| @ args the arguments to the function ||| @ ret the final return type- Declare : (fn : TTName) -> (args : List Arg) -> (ret : Raw) -> TyDecl+ Declare : (fn : TTName) -> (args : List FunArg) -> (ret : Raw) -> TyDecl ||| A single pattern-matching clause data FunClause : Type where MkFunClause : (lhs, rhs : Raw) -> FunClause- MkImpossibleClause : (lhs : Raw) -> FunClause ||| A reflected function definition. data FunDefn : Type where DefineFun : TTName -> List FunClause -> FunDefn -||| An argument to a type constructor.-data TyConArg : Type where- ||| Parameters are consistent across all constructors of the type- Parameter : TTName -> Raw -> TyConArg - ||| Indices are allowed to vary across constructors- Index : TTName -> Raw -> TyConArg+data CtorArg = CtorParameter FunArg | CtorField FunArg ||| A reflected datatype definition-data Datatype : Type where- ||| A reflected datatype definition- |||- ||| @ familyName the name of the type constructor- ||| @ tyConArgs the arguments to the type constructor- ||| @ tyConRes the result of the type constructor- ||| @ constrs the constructors, with their types- MkDatatype : (familyName : TTName) ->- (tyConArgs : List TyConArg) -> (tyConRes : Raw) ->- (constrs : List (TTName, Raw)) ->- Datatype+record Datatype where+ constructor MkDatatype + ||| The name of the type constructor+ familyName : TTName++ ||| The arguments to the type constructor+ tyConArgs : List TyConArg++ ||| The result of the type constructor+ tyConRes : Raw++ ||| The constructors for the family+ constructors : List (TTName, List CtorArg, Raw)+ ||| A reflected elaboration script. abstract data Elab : Type -> Type where@@ -85,7 +110,10 @@ prim__LookupTy : TTName -> Elab (List (TTName, NameType, TT)) prim__LookupDatatype : TTName -> Elab (List Datatype) + prim__Check : Raw -> Elab (TT, TT)+ prim__SourceLocation : Elab SourceLocation+ prim__Namespace : Elab (List String) prim__Forget : TT -> Elab Raw @@ -93,7 +121,8 @@ prim__Solve : Elab () prim__Fill : Raw -> Elab ()- prim__Apply : Raw -> Elab ()+ prim__Apply : Raw -> List (Bool, Int) -> Elab (List (TTName, TTName))+ prim__MatchApply : Raw -> List (Bool, Int) -> Elab (List (TTName, TTName)) prim__Focus : TTName -> Elab () prim__Unfocus : TTName -> Elab () prim__Attack : Elab ()@@ -105,18 +134,24 @@ prim__Forall : TTName -> Raw -> Elab () prim__PatVar : TTName -> Elab () prim__PatBind : TTName -> Elab ()+ prim__LetBind : TTName -> Raw -> Raw -> Elab () prim__Compute : Elab ()+ prim__Normalise : (List (TTName, Binder TT)) -> TT -> Elab TT+ prim__Whnf : TT -> Elab TT prim__DeclareType : TyDecl -> Elab () prim__DefineFunction : FunDefn -> Elab () prim__AddInstance : TTName -> TTName -> Elab () prim__ResolveTC : TTName -> Elab ()+ prim__Search : Int -> List TTName -> Elab () prim__RecursiveElab : Raw -> Elab () -> Elab (TT, TT) - prim__Debug : {a : Type} -> Maybe String -> Elab a+ prim__Fixity : String -> Elab Fixity + prim__Debug : {a : Type} -> List ErrorReportPart -> Elab a+ prim__Metavar : TTName -> Elab () ------------- -- Public API@@ -186,11 +221,21 @@ [] => fail [TextPart "No datatype named", NamePart n] xs => fail [TextPart "More than one datatype named", NamePart n] + ||| Attempt to type-check a term, getting back itself and its type+ check : (tm : Raw) -> Elab (TT, TT)+ check tm = prim__Check tm+ ||| Convert a type-annotated reflected term to its untyped ||| equivalent forgetTypes : TT -> Elab Raw forgetTypes tt = prim__Forget tt + ||| Get the goal type as a Raw term+ goalType : Elab Raw+ goalType = do g <- getGoal+ forgetTypes (snd g)++ ||| Generate a unique name based on some hint. ||| ||| **NB**: the generated name is unique _for this run of the@@ -206,10 +251,50 @@ fill : Raw -> Elab () fill tm = prim__Fill tm - ||| Fill with unification- apply : Raw -> Elab ()- apply tm = prim__Apply tm+ ||| Attempt to apply an operator to fill the current hole,+ ||| potentially solving arguments by unification.+ |||+ ||| The return value is a list of pairs of names, one for each input+ ||| argument. The first projection of these pairs is the original+ ||| name of the argument, from the type declaration, and the second+ ||| projection is the hole into which it is placed.+ |||+ ||| Note that not all of the returned hole names still exist, as+ ||| they may have been solved.+ |||+ ||| @ op the term to apply+ |||+ ||| @ argSpec instructions for finding the arguments to the term,+ ||| where the Boolean states whether or not to attempt to solve+ ||| the argument and the Int gives the priority in which to do+ ||| so+ apply : (op : Raw) ->+ (argSpec : List (Bool, Int)) ->+ Elab (List (TTName, TTName))+ apply tm argSpec = prim__Apply tm argSpec + ||| Attempt to apply an operator to fill the current hole,+ ||| potentially solving arugments by matching.+ |||+ ||| The return value is a list of pairs of names, one for each input+ ||| argument. The first projection of these pairs is the original+ ||| name of the argument, from the type declaration, and the second+ ||| projection is the hole into which it is placed.+ |||+ ||| Note that not all of the returned hole names still exist, as+ ||| they may have been solved.+ |||+ ||| @ op the term to apply+ |||+ ||| @ argSpec instructions for finding the arguments to the term,+ ||| where the Boolean states whether or not to attempt to solve+ ||| the argument and the Int gives the priority in which to do+ ||| so+ matchApply : (op : Raw) ->+ (argSpec : List (Bool, Int)) ->+ Elab (List (TTName, TTName))+ matchApply tm argSpec = prim__Apply tm argSpec+ ||| Move the focus to the specified hole ||| ||| @ hole the hole to focus on@@ -241,11 +326,15 @@ ||| the body. Requires that the hole be in binding form (use ||| `attack`). |||- ||| @ n the name to use for the argument, or `Nothing` to use the name- ||| in the corresponding hole type (a dependent function)- intro : (n : Maybe TTName) -> Elab ()- intro n = prim__Intro n+ ||| @ n the name to use for the argument+ intro : (n : TTName) -> Elab ()+ intro n = prim__Intro (Just n) + ||| Introduce a lambda binding around the current hole and focus on+ ||| the body, using the name provided by the type of the hole.+ intro' : Elab ()+ intro' = prim__Intro Nothing+ ||| Introduce a dependent function type binding into the current hole, ||| and focus on the body. forall : TTName -> Raw -> Elab ()@@ -259,10 +348,31 @@ patbind : TTName -> Elab () patbind n = prim__PatBind n + ||| Introduce a new let binding+ |||+ ||| @ n the name to let bind+ ||| @ ty the type of the term to be let-bound+ ||| @ tm the term to be bound+ letbind : (n : TTName) -> (ty, tm : Raw) -> Elab ()+ letbind n ty tm = prim__LetBind n ty tm+ ||| Normalise the goal. compute : Elab () compute = prim__Compute + ||| Normalise a term in some lexical environment+ |||+ ||| @ env the environment in which to compute (get one of these from `getEnv`)+ ||| @ term the term to normalise+ normalise : (env : List (TTName, Binder TT)) -> (term : TT) -> Elab TT+ normalise env term = prim__Normalise env term++ ||| Reduce a closed term to weak-head normal form+ |||+ ||| @ term the term to reduce+ whnf : (term : TT) -> Elab TT+ whnf term = prim__Whnf term+ ||| Find the source context for the elaboration script getSourceLocation : Elab SourceLocation getSourceLocation = prim__SourceLocation@@ -273,6 +383,14 @@ fill (quote loc) solve + ||| Get the current namespace at the point of tactic execution. This+ ||| allows scripts to define top-level names conveniently.+ |||+ ||| The namespace is represented as a reverse-order list of strings,+ ||| just as in the representation of names.+ currentNamespace : Elab (List String)+ currentNamespace = prim__Namespace+ ||| Attempt to rewrite the goal using an equality. ||| ||| The tactic searches the goal for applicable subterms, and@@ -306,12 +424,32 @@ resolveTC : (fn : TTName) -> Elab () resolveTC fn = prim__ResolveTC fn + ||| Use Idris's internal proof search.+ search : Elab ()+ search = prim__Search 100 []++ ||| Use Idris's internal proof search, with more control.+ |||+ ||| @ depth the search depth+ ||| @ hints additional names to try+ search' : (depth : Int) -> (hints : List TTName) -> Elab ()+ search' depth hints = prim__Search depth hints++ ||| Look up the declared fixity for an operator.+ |||+ ||| The lookup fails if the operator does not yet have a fixity or+ ||| if the string is not a valid operator.+ |||+ ||| @ operator the operator string to look up+ operatorFixity : (operator : String) -> Elab Fixity+ operatorFixity operator = prim__Fixity operator+ ||| Halt elaboration, dumping the internal state for inspection. ||| ||| This is intended for elaboration script developers, not for ||| end-users. Use `fail` for final scripts. debug : Elab a- debug = prim__Debug Nothing+ debug = prim__Debug [] ||| Halt elaboration, dumping the internal state and displaying a ||| message.@@ -320,8 +458,14 @@ ||| end-users. Use `fail` for final scripts. ||| ||| @ msg the message to display- debugMessage : (msg : String) -> Elab a- debugMessage msg = prim__Debug (Just msg)+ debugMessage : (msg : List ErrorReportPart) -> Elab a+ debugMessage msg = prim__Debug msg++ ||| Create a new top-level metavariable to solve the current hole.+ |||+ ||| @ name the name for the top-level variable+ metavar : (name : TTName) -> Elab ()+ metavar name = prim__Metavar name ||| Recursively invoke the reflected elaborator with some goal. |||
libs/prelude/Language/Reflection/Errors.idr view
@@ -31,6 +31,7 @@ | CantResolve TT | InvalidTCArg TTName TT | CantResolveAlts (List TTName)+ | NoValidAlts (List TTName) | IncompleteTerm TT | NoEliminator String TT | UniverseError
libs/prelude/Prelude.idr view
@@ -24,6 +24,9 @@ import public Prelude.Pairs import public Prelude.Stream import public Prelude.Providers+import public Prelude.Show+import public Prelude.Interactive+import public Prelude.File import public Decidable.Equality import public Language.Reflection import public Language.Reflection.Errors@@ -37,114 +40,11 @@ decAsBool (No _) = False --- Show and instances--class Show a where- partial show : a -> String--instance Show Int where- show = prim__toStrInt--instance Show Integer where- show = prim__toStrBigInt--instance Show Float where- show = prim__floatToStr---firstCharIs : (Char -> Bool) -> String -> Bool-firstCharIs p s with (strM s)- firstCharIs p "" | StrNil = False- firstCharIs p (strCons c cs) | StrCons c cs = p c--protectEsc : (Char -> Bool) -> String -> String -> String-protectEsc p f s = f ++ (if firstCharIs p s then "\\&" else "") ++ s--showLitChar : Char -> String -> String-showLitChar '\a' = ("\\a" ++)-showLitChar '\b' = ("\\b" ++)-showLitChar '\f' = ("\\f" ++)-showLitChar '\n' = ("\\n" ++)-showLitChar '\r' = ("\\r" ++)-showLitChar '\t' = ("\\t" ++)-showLitChar '\v' = ("\\v" ++)-showLitChar '\SO' = protectEsc (== 'H') "\\SO"-showLitChar '\DEL' = ("\\DEL" ++)-showLitChar '\\' = ("\\\\" ++)-showLitChar c = case getAt (cast (cast {to=Int} c)) asciiTab of- Just k => strCons '\\' . (k ++)- Nothing => if (c > '\DEL')- then strCons '\\' . protectEsc isDigit (show (cast {to=Int} c))- else strCons c- where asciiTab : List String- asciiTab = ["NUL", "SOH", "STX", "ETX", "EOT", "ENQ", "ACK", "BEL",- "BS", "HT", "LF", "VT", "FF", "CR", "SO", "SI",- "DLE", "DC1", "DC2", "DC3", "DC4", "NAK", "SYN", "ETB",- "CAN", "EM", "SUB", "ESC", "FS", "GS", "RS", "US"]-- getAt : Nat -> List String -> Maybe String- getAt Z (x :: xs) = Just x- getAt (S k) (x :: xs) = getAt k xs- getAt _ [] = Nothing--showLitString : List Char -> String -> String-showLitString [] = id-showLitString ('"'::cs) = ("\\\"" ++) . showLitString cs-showLitString (c ::cs) = showLitChar c . showLitString cs--instance Show Char where- show '\'' = "'\\''"- show c = strCons '\'' (showLitChar c "'")--instance Show String where- show cs = strCons '"' (showLitString (cast cs) "\"")--instance Show Nat where- show n = show (the Integer (cast n))--instance Show Bool where- show True = "True"- show False = "False"--instance Show () where- show () = "()"--instance Show Bits8 where- show b = b8ToString b--instance Show Bits16 where- show b = b16ToString b--instance Show Bits32 where- show b = b32ToString b--instance Show Bits64 where- show b = b64ToString b--instance (Show a, Show b) => Show (a, b) where- show (x, y) = "(" ++ show x ++ ", " ++ show y ++ ")"--instance Show a => Show (List a) where- show xs = "[" ++ show' "" xs ++ "]" where- show' acc [] = acc- show' acc [x] = acc ++ show x- show' acc (x :: xs) = show' (acc ++ show x ++ ", ") xs--instance Show a => Show (Maybe a) where- show Nothing = "Nothing"- show (Just x) = "Just " ++ show x--instance (Show a, {y : a} -> Show (p y)) => Show (Sigma a p) where- show (y ** prf) = "(" ++ show y ++ " ** " ++ show prf ++ ")"- ---- Functor instances instance Functor PrimIO where map f io = prim_io_bind io (prim_io_return . f) -instance Functor (IO' ffi) where- map f io = io_bind io (\b => io_return (f b))- instance Functor Maybe where map f (Just x) = Just (f x) map f Nothing = Nothing@@ -160,12 +60,6 @@ am <*> bm = prim_io_bind am (\f => prim_io_bind bm (prim_io_return . f)) -instance Applicative (IO' ffi) where- pure x = io_return x- f <*> a = io_bind f (\f' =>- io_bind a (\a' =>- io_return (f' a')))- instance Applicative Maybe where pure = Just @@ -202,9 +96,6 @@ instance Monad PrimIO where b >>= k = prim_io_bind b k -instance Monad (IO' ffi) where- b >>= k = io_bind b k- instance Monad Maybe where Nothing >>= k = Nothing (Just x) >>= k = k x@@ -328,183 +219,6 @@ uncurry : (a -> b -> c) -> (a, b) -> c uncurry f (a, b) = f a b ----- some basic io--||| Output a string to stdout without a trailing newline-putStr : String -> IO' ffi ()-putStr x = do prim_write x- return ()--||| Output a string to stdout with a trailing newline-putStrLn : String -> IO' ffi ()-putStrLn x = putStr (x ++ "\n")--||| Output something showable to stdout, without a trailing newline-partial-print : Show a => a -> IO' ffi ()-print x = putStr (show x)--||| Output something showable to stdout, with a trailing newline-partial-printLn : Show a => a -> IO' ffi ()-printLn x = putStrLn (show x)--||| Read one line of input from stdin, without the trailing newline-partial-getLine : IO' ffi String-getLine = do x <- prim_read- return (reverse (trimNL (reverse x)))- where trimNL : String -> String- trimNL str with (strM str)- trimNL "" | StrNil = ""- trimNL (strCons '\n' xs) | StrCons _ _ = xs- trimNL (strCons x xs) | StrCons _ _ = strCons x xs--||| Write a single character to stdout-partial-putChar : Char -> IO ()-putChar c = foreign FFI_C "putchar" (Int -> IO ()) (cast c)--||| Write a singel character to stdout, with a trailing newline-partial-putCharLn : Char -> IO ()-putCharLn c = putStrLn (singleton c)--||| Read a single character from stdin-partial-getChar : IO Char-getChar = map cast $ foreign FFI_C "getchar" (IO Int)------ some basic file handling--||| A file handle-abstract-data File = FHandle Ptr--||| Standard input-stdin : File-stdin = FHandle prim__stdin--||| Standard output-stdout : File-stdout = FHandle prim__stdout--||| Standard output-stderr : File-stderr = FHandle prim__stderr--||| Call the RTS's file opening function-do_fopen : String -> String -> IO Ptr-do_fopen f m- = foreign FFI_C "fileOpen" (String -> String -> IO Ptr) f m--||| Open a file-||| @ f the filename-||| @ m the mode as a String (`"r"`, `"w"`, or `"r+"`)-fopen : (f : String) -> (m : String) -> IO File-fopen f m = do h <- do_fopen f m- return (FHandle h)--||| Modes for opening files-data Mode = Read | Write | ReadWrite--||| Open a file-||| @ f the filename-||| @ m the mode-partial-openFile : (f : String) -> (m : Mode) -> IO File-openFile f m = fopen f (modeStr m) where- modeStr Read = "r"- modeStr Write = "w"- modeStr ReadWrite = "r+"--partial-do_fclose : Ptr -> IO ()-do_fclose h = foreign FFI_C "fileClose" (Ptr -> IO ()) h--partial-closeFile : File -> IO ()-closeFile (FHandle h) = do_fclose h--partial-do_fread : Ptr -> IO' l String-do_fread h = prim_fread h--fgetc : File -> IO Char-fgetc (FHandle h) = return (cast !(foreign FFI_C "fgetc" (Ptr -> IO Int) h))--fgetc' : File -> IO (Maybe Char)-fgetc' (FHandle h)- = do x <- foreign FFI_C "fgetc" (Ptr -> IO Int) h- if (x < 0) then return Nothing- else return (Just (cast x))--fflush : File -> IO ()-fflush (FHandle h) = foreign FFI_C "fflush" (Ptr -> IO ()) h--do_popen : String -> String -> IO Ptr-do_popen f m = foreign FFI_C "do_popen" (String -> String -> IO Ptr) f m--popen : String -> Mode -> IO File-popen f m = do ptr <- do_popen f (modeStr m)- return (FHandle ptr)- where- modeStr Read = "r"- modeStr Write = "w"- modeStr ReadWrite = "r+"--pclose : File -> IO ()-pclose (FHandle h) = foreign FFI_C "pclose" (Ptr -> IO ()) h---- mkForeign (FFun "idris_readStr" [FPtr, FPtr] (FAny String))--- prim__vm h--partial-fread : File -> IO' l String-fread (FHandle h) = do_fread h--partial-do_fwrite : Ptr -> String -> IO ()-do_fwrite h s = do prim_fwrite h s- return ()--partial-fwrite : File -> String -> IO ()-fwrite (FHandle h) s = do_fwrite h s--partial-do_feof : Ptr -> IO Int-do_feof h = foreign FFI_C "fileEOF" (Ptr -> IO Int) h--||| Check if a file handle has reached the end-feof : File -> IO Bool-feof (FHandle h) = do eof <- do_feof h- return (not (eof == 0))--partial-do_ferror : Ptr -> IO Int-do_ferror h = foreign FFI_C "fileError" (Ptr -> IO Int) h--ferror : File -> IO Bool-ferror (FHandle h) = do err <- do_ferror h- return (not (err == 0))--fpoll : File -> IO Bool-fpoll (FHandle h) = do p <- foreign FFI_C "fpoll" (Ptr -> IO Int) h- return (p > 0)--||| Check if a foreign pointer is null-partial-nullPtr : Ptr -> IO Bool-nullPtr p = do ok <- foreign FFI_C "isNull" (Ptr -> IO Int) p- return (ok /= 0)--||| Check if a supposed string was actually a null pointer-partial-nullStr : String -> IO Bool-nullStr p = do ok <- foreign FFI_C "isNull" (String -> IO Int) p- return (ok /= 0)- namespace JSNull ||| Check if a foreign pointer is null partial@@ -524,12 +238,6 @@ eqPtr x y = do eq <- foreign FFI_C "idris_eqPtr" (Ptr -> Ptr -> IO Int) x y return (eq /= 0) -||| Check whether a file handle is actually a null pointer-partial-validFile : File -> IO Bool-validFile (FHandle h) = do x <- nullPtr h- return (not x)- ||| Loop while some test is true ||| ||| @ test the condition of the loop@@ -541,18 +249,27 @@ while t b else return () -||| Read the contents of a file into a string-partial -- no error checking!-readFile : String -> IO String-readFile fn = do h <- openFile fn Read- c <- readFile' h ""- closeFile h- return c- where- partial- readFile' : File -> String -> IO String- readFile' h contents =- do x <- feof h- if not x then do l <- fread h- readFile' h (contents ++ l)- else return contents+------- Some error rewriting++%language ErrorReflection+ +private+cast_part : TT -> ErrorReportPart+cast_part (P Bound n t) = TextPart "unknown type"+cast_part x = TermPart x+ +%error_handler+cast_error : Err -> Maybe (List ErrorReportPart)+cast_error (CantResolve `(Cast ~x ~y))+ = Just [TextPart "Can't cast from",+ cast_part x,+ TextPart "to",+ cast_part y]+cast_error _ = Nothing++%error_handler+num_error : Err -> Maybe (List ErrorReportPart)+num_error (CantResolve `(Num ~x))+ = Just [TermPart x, TextPart "is not a numeric type"]+num_error _ = Nothing+
libs/prelude/Prelude/Applicative.idr view
@@ -5,6 +5,7 @@ import Prelude.Basics import Prelude.Bool import Prelude.Classes+import Prelude.Foldable import Prelude.Functor ---- Applicative functors/Idioms@@ -48,3 +49,26 @@ when : Applicative f => Bool -> Lazy (f ()) -> f () when True f = Force f when False f = pure ()++||| Fold using Alternative+|||+||| If you have a left-biased alternative operator `<|>`, then `choice`+||| performs left-biased choice from a list of alternatives, which means that+||| it evaluates to the left-most non-`empty` alternative.+|||+||| If the list is empty, or all values in it are `empty`, then it+||| evaluates to `empty`.+|||+||| Example:+|||+||| ```+||| -- given a parser expression like:+||| expr = literal <|> keyword <|> funcall+|||+||| -- choice lets you write this as:+||| expr = choice [literal, keyword, funcall]+||| ```+|||+||| Note: In Haskell, `choice` is called `asum`.+choice : (Foldable t, Alternative f) => t (f a) -> f a+choice x = foldr (<|>) empty x
libs/prelude/Prelude/Basics.idr view
@@ -11,8 +11,8 @@ ||| Manually assign a type to an expression. ||| @ a the type to assign-||| @ x the element to get the type-the : (a : Type) -> (x : a) -> a+||| @ value the element to get the type+the : (a : Type) -> (value : a) -> a the _ = id ||| Constant function. Ignores its second argument.@@ -20,7 +20,7 @@ const x = \v => x ||| Return the first element of a pair.-fst : (s, t) -> s+fst : (a, b) -> a fst (x, y) = x ||| Return the second element of a pair.
libs/prelude/Prelude/Cast.idr view
@@ -15,7 +15,7 @@ instance Cast String Int where cast = prim__fromStrInt -instance Cast String Float where+instance Cast String Double where cast = prim__strToFloat instance Cast String Integer where@@ -26,24 +26,30 @@ instance Cast Int String where cast = prim__toStrInt -instance Cast Int Float where+instance Cast Int Double where cast = prim__toFloatInt instance Cast Int Integer where cast = prim__sextInt_BigInt --- Float casts+-- Double casts -instance Cast Float String where+instance Cast Double String where cast = prim__floatToStr -instance Cast Float Int where+instance Cast Double Int where cast = prim__fromFloatInt +instance Cast Double Integer where+ cast = prim__fromFloatBigInt+ -- Integer casts instance Cast Integer String where cast = prim__toStrBigInt++instance Cast Integer Double where+ cast = prim__toFloatBigInt -- Char casts
libs/prelude/Prelude/Classes.idr view
@@ -46,6 +46,12 @@ instance Eq String where (==) = boolOp prim__eqString +instance Eq Ptr where+ (==) = boolOp prim__eqPtr++instance Eq ManagedPtr where+ (==) = boolOp prim__eqManagedPtr+ instance Eq Bool where True == True = True True == False = False
+ libs/prelude/Prelude/File.idr view
@@ -0,0 +1,156 @@+module Prelude.File++import Builtins+import Prelude.List+import Prelude.Maybe+import Prelude.Monad+import Prelude.Chars+import Prelude.Strings+import Prelude.Cast+import Prelude.Bool+import Prelude.Basics+import Prelude.Classes+import Prelude.Monad+import IO++%access public++||| A file handle+abstract+data File = FHandle Ptr++||| Standard input+stdin : File+stdin = FHandle prim__stdin++||| Standard output+stdout : File+stdout = FHandle prim__stdout++||| Standard output+stderr : File+stderr = FHandle prim__stderr++||| Call the RTS's file opening function+do_fopen : String -> String -> IO Ptr+do_fopen f m+ = foreign FFI_C "fileOpen" (String -> String -> IO Ptr) f m++||| Open a file+||| @ f the filename+||| @ m the mode as a String (`"r"`, `"w"`, or `"r+"`)+fopen : (f : String) -> (m : String) -> IO File+fopen f m = do h <- do_fopen f m+ return (FHandle h)++||| Check whether a file handle is actually a null pointer+partial+validFile : File -> IO Bool+validFile (FHandle h) = do x <- nullPtr h+ return (not x)++||| Modes for opening files+data Mode = Read | Write | ReadWrite++||| Open a file+||| @ f the filename+||| @ m the mode+partial+openFile : (f : String) -> (m : Mode) -> IO File+openFile f m = fopen f (modeStr m) where+ modeStr Read = "r"+ modeStr Write = "w"+ modeStr ReadWrite = "r+"++partial+do_fclose : Ptr -> IO ()+do_fclose h = foreign FFI_C "fileClose" (Ptr -> IO ()) h++partial+closeFile : File -> IO ()+closeFile (FHandle h) = do_fclose h++partial+do_fread : Ptr -> IO' l String+do_fread h = prim_fread h++fgetc : File -> IO Char+fgetc (FHandle h) = return (cast !(foreign FFI_C "fgetc" (Ptr -> IO Int) h))++fgetc' : File -> IO (Maybe Char)+fgetc' (FHandle h)+ = do x <- foreign FFI_C "fgetc" (Ptr -> IO Int) h+ if (x < 0) then return Nothing+ else return (Just (cast x))++fflush : File -> IO ()+fflush (FHandle h) = foreign FFI_C "fflush" (Ptr -> IO ()) h++do_popen : String -> String -> IO Ptr+do_popen f m = foreign FFI_C "do_popen" (String -> String -> IO Ptr) f m++popen : String -> Mode -> IO File+popen f m = do ptr <- do_popen f (modeStr m)+ return (FHandle ptr)+ where+ modeStr Read = "r"+ modeStr Write = "w"+ modeStr ReadWrite = "r+"++pclose : File -> IO ()+pclose (FHandle h) = foreign FFI_C "pclose" (Ptr -> IO ()) h++-- mkForeign (FFun "idris_readStr" [FPtr, FPtr] (FAny String))+-- prim__vm h++partial+fread : File -> IO' l String+fread (FHandle h) = do_fread h++partial+do_fwrite : Ptr -> String -> IO ()+do_fwrite h s = do prim_fwrite h s+ return ()++partial+fwrite : File -> String -> IO ()+fwrite (FHandle h) s = do_fwrite h s++partial+do_feof : Ptr -> IO Int+do_feof h = foreign FFI_C "fileEOF" (Ptr -> IO Int) h++||| Check if a file handle has reached the end+feof : File -> IO Bool+feof (FHandle h) = do eof <- do_feof h+ return (not (eof == 0))++partial+do_ferror : Ptr -> IO Int+do_ferror h = foreign FFI_C "fileError" (Ptr -> IO Int) h++ferror : File -> IO Bool+ferror (FHandle h) = do err <- do_ferror h+ return (not (err == 0))++fpoll : File -> IO Bool+fpoll (FHandle h) = do p <- foreign FFI_C "fpoll" (Ptr -> IO Int) h+ return (p > 0)++||| Read the contents of a file into a string+partial -- no error checking!+readFile : String -> IO String+readFile fn = do h <- openFile fn Read+ c <- readFile' h ""+ closeFile h+ return c+ where+ partial+ readFile' : File -> String -> IO String+ readFile' h contents =+ do x <- feof h+ if not x then do l <- fread h+ readFile' h (contents ++ l)+ else return contents++
+ libs/prelude/Prelude/Interactive.idr view
@@ -0,0 +1,142 @@+||| Various helper functions for creating simple interactive systems.+||| +||| These are mostly intended for helping with teaching, in that they will allow+||| the easy creation of interactive programs without needing to teach IO+||| or Effects first, but they also capture some common patterns of interactive+||| programming.+module Prelude.Interactive++import Builtins+import Prelude.List+import Prelude.File+import Prelude.Bool+import Prelude.Classes+import Prelude.Strings+import Prelude.Chars+import Prelude.Show+import Prelude.Cast+import Prelude.Maybe+import Prelude.Functor+import Prelude.Monad+import IO++%access public++---- some basic io++||| Output a string to stdout without a trailing newline+putStr : String -> IO' ffi ()+putStr x = do prim_write x+ return ()++||| Output a string to stdout with a trailing newline+putStrLn : String -> IO' ffi ()+putStrLn x = putStr (x ++ "\n")++||| Output something showable to stdout, without a trailing newline+print : Show a => a -> IO' ffi ()+print x = putStr (show x)++||| Output something showable to stdout, with a trailing newline+printLn : Show a => a -> IO' ffi ()+printLn x = putStrLn (show x)++||| Read one line of input from stdin, without the trailing newline+getLine : IO' ffi String+getLine = do x <- prim_read+ return (reverse (trimNL (reverse x)))+ where trimNL : String -> String+ trimNL str with (strM str)+ trimNL "" | StrNil = ""+ trimNL (strCons '\n' xs) | StrCons _ _ = xs+ trimNL (strCons x xs) | StrCons _ _ = strCons x xs++||| Write a single character to stdout+putChar : Char -> IO ()+putChar c = foreign FFI_C "putchar" (Int -> IO ()) (cast c)++||| Write a singel character to stdout, with a trailing newline+putCharLn : Char -> IO ()+putCharLn c = putStrLn (singleton c)++||| Read a single character from stdin+getChar : IO Char+getChar = map cast $ foreign FFI_C "getchar" (IO Int)++||| Get the command-line arguments that the program was called with.+partial+getArgs : IO (List String)+getArgs = do n <- numArgs+ ga' [] 0 n+ where+ numArgs : IO Int+ numArgs = foreign FFI_C "idris_numArgs" (IO Int)++ getArg : Int -> IO String+ getArg x = foreign FFI_C "idris_getArg" (Int -> IO String) x++ partial+ ga' : List String -> Int -> Int -> IO (List String)+ ga' acc i n = if (i == n) then (return $ reverse acc) else+ do arg <- getArg i+ ga' (arg :: acc) (i+1) n+++||| Process input from an open file handle, while maintaining a state.+||| @ state the input state+||| @ onRead the function to run on reading a line, returning a String to+||| output and a new state+||| @ onEOF the function to run on reaching end of file, returning a String+||| to output+partial+processHandle : File -> + (state : a) ->+ (onRead : a -> String -> (String, a)) -> + (onEOF : a -> String) -> + IO ()+processHandle h acc onRead onEOF + = if !(feof h)+ then putStr (onEOF acc)+ else do x <- fread h+ let (out, acc') = onRead acc x+ putStr out+ processHandle h acc' onRead onEOF ++||| Process input from the standard input stream, while maintaining a state.+||| @ state the input state+||| @ onRead the function to run on reading a line, returning a String to+||| output and a new state+||| @ onEOI the function to run on reaching end of input, returning a String+||| to output+partial+processStdin : (state : a) -> + (onRead : a -> String -> (String, a)) -> + (onEOI : a -> String) -> IO ()+processStdin = processHandle stdin++||| A basic read-eval-print loop, maintaining a state+||| @ state the input state+||| @ prompt the prompt to show +||| @ onInput the function to run on reading input, returning a String to+||| output and a new state. Returns Nothing if the repl should exit+partial+replWith : (state : a) -> (prompt : String) -> + (onInput : a -> String -> Maybe (String, a)) -> IO ()+replWith acc prompt fn + = do putStr prompt+ x <- getLine+ case fn acc x of+ Just (out, acc') => do putStr out + replWith acc' prompt fn+ Nothing => return ()++||| A basic read-eval-print loop+||| @ prompt the prompt to show +||| @ onInput the function to run on reading input, returning a String to+||| output +partial+repl : (prompt : String) -> + (onInput : String -> String) -> IO ()+repl prompt fn + = replWith () prompt (\x, s => Just (fn s, ()))+
libs/prelude/Prelude/List.idr view
@@ -9,6 +9,7 @@ import Prelude.Foldable import Prelude.Functor import Prelude.Maybe+import Prelude.Uninhabited import Prelude.Nat %access public@@ -17,12 +18,13 @@ infix 5 \\ infixr 7 ::,++ -||| Linked lists-%elim data List a =- ||| The empty list+||| Generic lists+%elim data List elem =+ ||| Empty list Nil |- ||| Cons cell- (::) a (List a)+ ||| A non-empty list, consisting of a head element and the rest of+ ||| the list.+ (::) elem (List elem) -- Name hints for interactive editing %name List xs, ys, zs, ws@@ -42,6 +44,47 @@ isCons (x::xs) = True --------------------------------------------------------------------------------+-- Decidable Predicates+--------------------------------------------------------------------------------++||| Satisfiable if `xs` is non-empty (e.g., if `xs` is a cons).+data NonEmpty : (xs : List a) -> Type where+ ||| The proof that a cons cell is non-empty+ IsNonEmpty : NonEmpty (x :: xs)++private+nonEmptyNil : NonEmpty [] -> Void+nonEmptyNil IsNonEmpty impossible++||| Decide whether a list is non-empty+nonEmpty : (xs : List a) -> Dec (NonEmpty xs)+nonEmpty [] = No nonEmptyNil+nonEmpty (x :: xs) = Yes IsNonEmpty++||| Satisfiable if `k` is a valid index into `xs`+|||+||| @ k the potential index+||| @ xs the list into which k may be an index+data InBounds : (k : Nat) -> (xs : List a) -> Type where+ ||| Z is a valid index into any cons cell+ InFirst : InBounds Z (x :: xs)+ ||| Valid indices can be extended+ InLater : InBounds k xs -> InBounds (S k) (x :: xs)++instance Uninhabited (InBounds k []) where+ uninhabited InFirst impossible++||| Decide whether `k` is a valid index into `xs`+inBounds : (k : Nat) -> (xs : List a) -> Dec (InBounds k xs)+inBounds k [] = No uninhabited+inBounds Z (x :: xs) = Yes InFirst+inBounds (S k) (x :: xs) with (inBounds k xs)+ inBounds (S k) (x :: xs) | (Yes prf) = Yes (InLater prf)+ inBounds (S k) (x :: xs) | (No contra)+ = No (\p => case p of+ InLater y => contra y)++-------------------------------------------------------------------------------- -- Length -------------------------------------------------------------------------------- @@ -59,10 +102,9 @@ ||| Find a particular element of a list. ||| ||| @ ok a proof that the index is within bounds-index : (n : Nat) -> (l : List a) -> (ok : lt n (length l) = True) -> a-index Z (x::xs) p = x-index (S n) (x::xs) p = index n xs ?indexTailProof-index _ [] Refl impossible+index : (n : Nat) -> (xs : List a) -> {auto ok : InBounds n xs} -> a+index Z (x :: xs) {ok} = x+index (S k) (x :: xs) {ok = InLater p} = index k xs ||| Attempt to find a particular element of a list. |||@@ -74,8 +116,8 @@ ||| Get the first element of a non-empty list ||| @ ok proof that the list is non-empty-head : (l : List a) -> {auto ok : isCons l = True} -> a-head [] {ok=Refl} impossible+head : (l : List a) -> {auto ok : NonEmpty l} -> a+head [] {ok=IsNonEmpty} impossible head (x::xs) {ok=p} = x ||| Attempt to get the first element of a list. If the list is empty, return@@ -86,8 +128,8 @@ ||| Get the tail of a non-empty list. ||| @ ok proof that the list is non-empty-tail : (l : List a) -> {auto ok : isCons l = True} -> List a-tail [] {ok=Refl} impossible+tail : (l : List a) -> {auto ok : NonEmpty l} -> List a+tail [] {ok=IsNonEmpty} impossible tail (x::xs) {ok=p} = xs ||| Attempt to get the tail of a list.@@ -99,10 +141,10 @@ ||| Retrieve the last element of a non-empty list. ||| @ ok proof that the list is non-empty-last : (l : List a) -> {auto ok : isCons l = True} -> a-last [] {ok=Refl} impossible+last : (l : List a) -> {auto ok : NonEmpty l} -> a+last [] {ok=IsNonEmpty} impossible last [x] {ok=p} = x-last (x::y::ys) {ok=p} = last (y::ys) {ok=Refl}+last (x::y::ys) {ok=p} = last (y::ys) {ok=IsNonEmpty} ||| Attempt to retrieve the last element of a non-empty list. |||@@ -116,10 +158,10 @@ ||| Return all but the last element of a non-empty list. ||| @ ok proof that the list is non-empty-init : (l : List a) -> {auto ok : isCons l = True} -> List a-init [] {ok=Refl} impossible+init : (l : List a) -> {auto ok : NonEmpty l} -> List a+init [] {ok=IsNonEmpty} impossible init [x] {ok=p} = []-init (x::y::ys) {ok=p} = x :: init (y::ys) {ok=Refl}+init (x::y::ys) {ok=p} = x :: init (y::ys) {ok=IsNonEmpty} ||| Attempt to Return all but the last element of a list. |||@@ -129,8 +171,7 @@ init' (x::xs) = case xs of [] => Just []- y::ys =>- -- XXX: Problem with typechecking a "do" block here+ y::ys => case init' $ y::ys of Nothing => Nothing Just j => Just $ x :: j@@ -242,42 +283,38 @@ -- Zips and unzips -------------------------------------------------------------------------------- -||| Combine two lists of the same length elementwise using some function.+||| Combine two lists elementwise using some function. If they are different+||| lengths, the result is truncated to the length of the shorter list. ||| @ f the function to combine elements with ||| @ l the first list ||| @ r the second list-||| @ ok a proof that the lengths of the inputs are equal-zipWith : (f : a -> b -> c) -> (l : List a) -> (r : List b) ->- (ok : length l = length r) -> List c-zipWith f [] (y::ys) Refl impossible-zipWith f (x::xs) [] Refl impossible-zipWith f [] [] p = []-zipWith f (x::xs) (y::ys) p = f x y :: (zipWith f xs ys ?zipWithTailProof)+zipWith : (f : a -> b -> c) -> (l : List a) -> (r : List b) -> List c+zipWith f [] (y::ys) = []+zipWith f (x::xs) [] = []+zipWith f [] [] = []+zipWith f (x::xs) (y::ys) = f x y :: zipWith f xs ys -||| Combine three lists of the same length elementwise using some function.+||| Combine three lists elementwise using some function. If they are different+||| lengths, the result is truncated to the length of the shortest list. ||| @ f the function to combine elements with ||| @ x the first list ||| @ y the second list ||| @ z the third list-||| @ ok a proof that the lengths of the first two inputs are equal-||| @ ok' a proof that the lengths of the second and third inputs are equal zipWith3 : (f : a -> b -> c -> d) -> (x : List a) -> (y : List b) ->- (z : List c) -> (ok : length x = length y) -> (ok' : length y = length z) -> List d-zipWith3 f _ [] (z::zs) p Refl impossible-zipWith3 f _ (y::ys) [] p Refl impossible-zipWith3 f [] (y::ys) _ Refl q impossible-zipWith3 f (x::xs) [] _ Refl q impossible-zipWith3 f [] [] [] p q = []-zipWith3 f (x::xs) (y::ys) (z::zs) p q =- f x y z :: (zipWith3 f xs ys zs ?zipWith3TailProof ?zipWith3TailProof')+ (z : List c) -> List d+zipWith3 f _ [] (z::zs) = [] +zipWith3 f _ (y::ys) [] = []+zipWith3 f [] (y::ys) _ = []+zipWith3 f (x::xs) [] _ = []+zipWith3 f [] [] [] = []+zipWith3 f (x::xs) (y::ys) (z::zs) = f x y z :: zipWith3 f xs ys zs ||| Combine two lists elementwise into pairs-zip : (l : List a) -> (r : List b) -> (length l = length r) -> List (a, b)+zip : (l : List a) -> (r : List b) -> List (a, b) zip = zipWith (\x,y => (x, y)) ||| Combine three lists elementwise into tuples-zip3 : (x : List a) -> (y : List b) -> (z : List c) -> (length x = length y) ->- (length y = length z) -> List (a, b, c)+zip3 : (x : List a) -> (y : List b) -> (z : List c) -> List (a, b, c) zip3 = zipWith3 (\x,y,z => (x, y, z)) ||| Split a list of pairs into two lists@@ -312,7 +349,7 @@ instance Foldable List where foldr c n [] = n foldr c n (x::xs) = c x (foldr c n xs)- + foldl f q [] = q foldl f q (x::xs) = foldl f (f q x) xs @@ -350,8 +387,13 @@ intersperse' sep [] = [] intersperse' sep (y::ys) = sep :: y :: intersperse' sep ys -intercalate : List a -> List (List a) -> List a-intercalate sep l = concat $ intersperse sep l+||| Given a separator list and some more lists, produce a new list by+||| placing the separator between each of the lists.+|||+||| @ sep the separator+||| @ xss the lists between which the separator will be placed+intercalate : (sep : List a) -> (xss : List (List a)) -> List a+intercalate sep xss = concat $ intersperse sep xss ||| Transposes rows and columns of a list of lists. |||@@ -456,15 +498,20 @@ else findIndices' (S cnt) p xs +||| Find the index of the first occurrence of an element in a list, using a custom equality test. elemIndexBy : (a -> a -> Bool) -> a -> List a -> Maybe Nat elemIndexBy p e = findIndex $ p e +||| Find the index of the first occurrence of an element in a list,+||| using the default equality test for the type of list elements. elemIndex : Eq a => a -> List a -> Maybe Nat elemIndex = elemIndexBy (==) +||| Find all indices for an element in a list, using a custom equality test. elemIndicesBy : (a -> a -> Bool) -> a -> List a -> List Nat elemIndicesBy p e = findIndices $ p e +||| Find all indices for an element in a list, using the default equality test for the type of list elements. elemIndices : Eq a => a -> List a -> List Nat elemIndices = elemIndicesBy (==) @@ -655,7 +702,12 @@ -- Predicates -------------------------------------------------------------------------------- -isPrefixOfBy : (a -> a -> Bool) -> List a -> List a -> Bool+||| Check whether a list is a prefix of another according to a user-supplied equality test.+|||+||| @ eq the equality comparison+||| @ left the potential prefix+||| @ right the list that may have `left` as its prefix+isPrefixOfBy : (eq : a -> a -> Bool) -> (left, right : List a) -> Bool isPrefixOfBy p [] right = True isPrefixOfBy p left [] = False isPrefixOfBy p (x::xs) (y::ys) =@@ -691,6 +743,7 @@ -- Sorting -------------------------------------------------------------------------------- +||| Check whether a list is sorted with respect to the default ordering for the type of its elements. sorted : Ord a => List a -> Bool sorted [] = True sorted (x::xs) =@@ -698,6 +751,9 @@ Nil => True (y::ys) => x <= y && sorted (y::ys) +||| Merge two sorted lists using an arbitrary comparison+||| predicate. Note that the lists must have been sorted using this+||| predicate already. mergeBy : (a -> a -> Ordering) -> List a -> List a -> List a mergeBy order [] right = right mergeBy order left [] = left@@ -706,15 +762,21 @@ then x :: mergeBy order xs (y::ys) else y :: mergeBy order (x::xs) ys +||| Merge two sorted lists using the default ordering for the type of their elements. merge : Ord a => List a -> List a -> List a merge = mergeBy compare -sort : Ord a => List a -> List a-sort [] = []-sort [x] = [x]-sort xs = let (x, y) = split xs in- merge (sort (assert_smaller xs x)) - (sort (assert_smaller xs y)) -- not structurally smaller, hence assert+||| Sort a list using some arbitrary comparison predicate.+|||+||| @ cmp how to compare elements+||| @ xs the list to sort+sortBy : (cmp : a -> a -> Ordering) -> (xs : List a) -> List a+sortBy cmp [] = []+sortBy cmp [x] = [x]+sortBy cmp xs = let (x, y) = split xs in+ mergeBy cmp+ (sortBy cmp (assert_smaller xs x))+ (sortBy cmp (assert_smaller xs y)) -- not structurally smaller, hence assert where splitRec : List a -> List a -> (List a -> List a) -> (List a, List a) splitRec (_::_::xs) (y::ys) zs = splitRec xs ys (zs . ((::) y))@@ -723,6 +785,10 @@ split : List a -> (List a, List a) split xs = splitRec xs xs id +||| Sort a list using the default ordering for the type of its elements.+sort : Ord a => List a -> List a+sort = sortBy compare+ -------------------------------------------------------------------------------- -- Conversions --------------------------------------------------------------------------------@@ -736,6 +802,7 @@ -- Misc -------------------------------------------------------------------------------- +||| Keep the `Just` elements in a list, discarding the `Nothing` elements. catMaybes : List (Maybe a) -> List a catMaybes [] = [] catMaybes (x::xs) =@@ -753,7 +820,7 @@ appendNilRightNeutral [] = Refl appendNilRightNeutral (x::xs) = let inductiveHypothesis = appendNilRightNeutral xs in- ?appendNilRightNeutralStepCase+ rewrite inductiveHypothesis in Refl ||| Appending lists is associative. appendAssociative : (l : List a) -> (c : List a) -> (r : List a) ->@@ -761,7 +828,7 @@ appendAssociative [] c r = Refl appendAssociative (x::xs) c r = let inductiveHypothesis = appendAssociative xs c r in- ?appendAssociativeStepCase+ rewrite inductiveHypothesis in Refl ||| The length of two lists that are appended is the sum of the lengths ||| of the input lists.@@ -770,7 +837,7 @@ lengthAppend [] right = Refl lengthAppend (x::xs) right = let inductiveHypothesis = lengthAppend xs right in- ?lengthAppendStepCase+ rewrite inductiveHypothesis in Refl ||| Mapping a function over a list doesn't change its length. mapPreservesLength : (f : a -> b) -> (l : List a) ->@@ -778,7 +845,7 @@ mapPreservesLength f [] = Refl mapPreservesLength f (x::xs) = let inductiveHypothesis = mapPreservesLength f xs in- ?mapPreservesLengthStepCase+ rewrite inductiveHypothesis in Refl ||| Mapping a function over two lists and appending them is equivalent ||| to appending them and then mapping the function.@@ -787,7 +854,7 @@ mapDistributesOverAppend f [] r = Refl mapDistributesOverAppend f (x::xs) r = let inductiveHypothesis = mapDistributesOverAppend f xs r in- ?mapDistributesOverAppendStepCase+ rewrite inductiveHypothesis in Refl ||| Mapping two functions is the same as mapping their composition. mapFusion : (f : b -> c) -> (g : a -> b) -> (l : List a) ->@@ -795,7 +862,7 @@ mapFusion f g [] = Refl mapFusion f g (x::xs) = let inductiveHypothesis = mapFusion f g xs in- ?mapFusionStepCase+ rewrite inductiveHypothesis in Refl ||| No list contains an element of the empty list by any predicate. hasAnyByNilFalse : (p : a -> a -> Bool) -> (l : List a) ->@@ -803,12 +870,13 @@ hasAnyByNilFalse p [] = Refl hasAnyByNilFalse p (x::xs) = let inductiveHypothesis = hasAnyByNilFalse p xs in- ?hasAnyByNilFalseStepCase+ rewrite inductiveHypothesis in Refl ||| No list contains an element of the empty list. hasAnyNilFalse : Eq a => (l : List a) -> hasAny [] l = False-hasAnyNilFalse l = ?hasAnyNilFalseBody+hasAnyNilFalse l = rewrite (hasAnyByNilFalse (==) l) in Refl +||| Implement foldl using foldr, for a later equality proof. foldlAsFoldr : (b -> a -> b) -> b -> List a -> b foldlAsFoldr f z t = foldr (flip (.) . flip f) id t z @@ -817,81 +885,4 @@ foldlMatchesFoldr : (f : b -> a -> b) -> (q : b) -> (xs : List a) -> foldl f q xs = foldlAsFoldr f q xs foldlMatchesFoldr f q [] = Refl foldlMatchesFoldr f q (x :: xs) = foldlMatchesFoldr f (f q x) xs-------------------------------------------------------------------------------------- Proofs-----------------------------------------------------------------------------------indexTailProof = proof {- intros;- rewrite sym p;- trivial;-}--lengthAppendStepCase = proof {- intros;- rewrite inductiveHypothesis;- trivial;-}--hasAnyNilFalseBody = proof {- intros;- rewrite (hasAnyByNilFalse (==) l);- trivial;-}--hasAnyByNilFalseStepCase = proof {- intros;- rewrite inductiveHypothesis;- trivial;-}--appendNilRightNeutralStepCase = proof {- intros;- rewrite inductiveHypothesis;- trivial;-}--appendAssociativeStepCase = proof {- intros;- rewrite inductiveHypothesis;- trivial;-}--mapFusionStepCase = proof {- intros;- rewrite inductiveHypothesis;- trivial;-}--mapDistributesOverAppendStepCase = proof {- intros;- rewrite inductiveHypothesis;- trivial;-}--mapPreservesLengthStepCase = proof {- intros;- rewrite inductiveHypothesis;- trivial;-}--zipWithTailProof = proof {- intros;- rewrite (succInjective (length xs) (length ys) p);- trivial;-}--zipWith3TailProof = proof {- intros;- rewrite (succInjective (length xs) (length ys) p);- trivial;-}--zipWith3TailProof' = proof {- intros;- rewrite (succInjective (length ys) (length zs) q);- trivial;-}
libs/prelude/Prelude/Maybe.idr view
@@ -11,9 +11,13 @@ %access public %default total +||| An optional value. This can be used to represent the possibility of+||| failure, where a function may return a value, or not. data Maybe a- = Nothing- | Just a+ = ||| No value stored+ Nothing+ | ||| A value of type `a` is stored+ Just a -------------------------------------------------------------------------------- -- Syntactic tests
libs/prelude/Prelude/Monad.idr view
@@ -3,9 +3,10 @@ -- Monads and Functors import Builtins-import Prelude.List+import Prelude.Functor import Prelude.Applicative import Prelude.Basics+import IO %access public @@ -22,3 +23,20 @@ ||| define `return` and `pure` differently! return : Monad m => a -> m a return = pure++-- Annoyingly, these need to be here, so that we can use them in other+-- Prelude modules other than the top level.++instance Functor (IO' ffi) where+ map f io = io_bind io (\b => io_return (f b))++instance Applicative (IO' ffi) where+ pure x = io_return x+ f <*> a = io_bind f (\f' =>+ io_bind a (\a' =>+ io_return (f' a')))+++instance Monad (IO' ffi) where+ b >>= k = io_bind b k+
libs/prelude/Prelude/Nat.idr view
@@ -12,7 +12,8 @@ %access public %default total -||| Unary natural numbers+||| Natural numbers: unbounded, unsigned integers which can be pattern+||| matched. %elim data Nat = ||| Zero Z |@@ -213,12 +214,12 @@ instance Cast Integer Nat where cast = fromInteger -||| A wrapper for Nat that specifies the semigroup and monad instances that use (+)+||| A wrapper for Nat that specifies the semigroup and monad instances that use (*) record Multiplicative where constructor getMultiplicative _ : Nat -||| A wrapper for Nat that specifies the semigroup and monad instances that use (*)+||| A wrapper for Nat that specifies the semigroup and monad instances that use (+) record Additive where constructor getAdditive _ : Nat@@ -262,6 +263,9 @@ instance Cast Nat Int where cast = toIntNat +instance Cast Nat Double where+ cast = cast . toIntegerNat+ -------------------------------------------------------------------------------- -- Auxilliary notions --------------------------------------------------------------------------------@@ -403,28 +407,29 @@ plusZeroRightNeutral Z = Refl plusZeroRightNeutral (S n) = let inductiveHypothesis = plusZeroRightNeutral n in- ?plusZeroRightNeutralStepCase+ rewrite inductiveHypothesis in Refl total plusSuccRightSucc : (left : Nat) -> (right : Nat) -> S (left + right) = left + (S right) plusSuccRightSucc Z right = Refl plusSuccRightSucc (S left) right = let inductiveHypothesis = plusSuccRightSucc left right in- ?plusSuccRightSuccStepCase+ rewrite inductiveHypothesis in Refl total plusCommutative : (left : Nat) -> (right : Nat) -> left + right = right + left-plusCommutative Z right = ?plusCommutativeBaseCase+plusCommutative Z right = rewrite plusZeroRightNeutral right in Refl plusCommutative (S left) right = let inductiveHypothesis = plusCommutative left right in- ?plusCommutativeStepCase+ rewrite inductiveHypothesis in + rewrite plusSuccRightSucc right left in Refl total plusAssociative : (left : Nat) -> (centre : Nat) -> (right : Nat) -> left + (centre + right) = (left + centre) + right plusAssociative Z centre right = Refl plusAssociative (S left) centre right = let inductiveHypothesis = plusAssociative left centre right in- ?plusAssociativeStepCase+ rewrite inductiveHypothesis in Refl total plusConstantRight : (left : Nat) -> (right : Nat) -> (c : Nat) -> (p : left = right) -> left + c = right + c@@ -439,24 +444,26 @@ total plusLeftCancel : (left : Nat) -> (right : Nat) -> (right' : Nat) -> (p : left + right = left + right') -> right = right'-plusLeftCancel Z right right' p = ?plusLeftCancelBaseCase+plusLeftCancel Z right right' p = p plusLeftCancel (S left) right right' p = let inductiveHypothesis = plusLeftCancel left right right' in- ?plusLeftCancelStepCase+ inductiveHypothesis (succInjective _ _ p) total plusRightCancel : (left : Nat) -> (left' : Nat) -> (right : Nat) -> (p : left + right = left' + right) -> left = left'-plusRightCancel left left' Z p = ?plusRightCancelBaseCase+plusRightCancel left left' Z p = rewrite sym (plusZeroRightNeutral left) in+ rewrite sym (plusZeroRightNeutral left') in+ p plusRightCancel left left' (S right) p =- let inductiveHypothesis = plusRightCancel left left' right in- ?plusRightCancelStepCase+ plusRightCancel left left' right + (succInjective _ _ (rewrite plusSuccRightSucc left right in + rewrite plusSuccRightSucc left' right in p)) total plusLeftLeftRightZero : (left : Nat) -> (right : Nat) -> (p : left + right = left) -> right = Z-plusLeftLeftRightZero Z right p = ?plusLeftLeftRightZeroBaseCase+plusLeftLeftRightZero Z right p = p plusLeftLeftRightZero (S left) right p =- let inductiveHypothesis = plusLeftLeftRightZero left right in- ?plusLeftLeftRightZeroStepCase+ plusLeftLeftRightZero left right (succInjective _ _ p) -- Mult total multZeroLeftZero : (right : Nat) -> Z * right = Z@@ -464,16 +471,18 @@ total multZeroRightZero : (left : Nat) -> left * Z = Z multZeroRightZero Z = Refl-multZeroRightZero (S left) =- let inductiveHypothesis = multZeroRightZero left in- ?multZeroRightZeroStepCase+multZeroRightZero (S left) = multZeroRightZero left total multRightSuccPlus : (left : Nat) -> (right : Nat) -> left * (S right) = left + (left * right) multRightSuccPlus Z right = Refl multRightSuccPlus (S left) right = let inductiveHypothesis = multRightSuccPlus left right in- ?multRightSuccPlusStepCase+ rewrite inductiveHypothesis in + rewrite plusAssociative left right (mult left right) in+ rewrite plusAssociative right left (mult left right) in+ rewrite plusCommutative right left in+ Refl total multLeftSuccPlus : (left : Nat) -> (right : Nat) -> (S left) * right = right + (left * right)@@ -481,43 +490,57 @@ total multCommutative : (left : Nat) -> (right : Nat) -> left * right = right * left-multCommutative Z right = ?multCommutativeBaseCase+multCommutative Z right = rewrite multZeroRightZero right in Refl multCommutative (S left) right = let inductiveHypothesis = multCommutative left right in- ?multCommutativeStepCase+ rewrite inductiveHypothesis in+ rewrite multRightSuccPlus right left in + Refl total multDistributesOverPlusRight : (left : Nat) -> (centre : Nat) -> (right : Nat) -> left * (centre + right) = (left * centre) + (left * right) multDistributesOverPlusRight Z centre right = Refl multDistributesOverPlusRight (S left) centre right = let inductiveHypothesis = multDistributesOverPlusRight left centre right in- ?multDistributesOverPlusRightStepCase+ rewrite inductiveHypothesis in + rewrite plusAssociative (plus centre (mult left centre)) right (mult left right) in+ rewrite sym (plusAssociative centre (mult left centre) right) in+ rewrite plusCommutative (mult left centre) right in+ rewrite plusAssociative centre right (mult left centre) in+ rewrite plusAssociative (plus centre right) (mult left centre) (mult left right) in+ Refl total multDistributesOverPlusLeft : (left : Nat) -> (centre : Nat) -> (right : Nat) -> (left + centre) * right = (left * right) + (centre * right) multDistributesOverPlusLeft Z centre right = Refl multDistributesOverPlusLeft (S left) centre right = let inductiveHypothesis = multDistributesOverPlusLeft left centre right in- ?multDistributesOverPlusLeftStepCase+ rewrite inductiveHypothesis in+ rewrite plusAssociative right (mult left right) (mult centre right) in+ Refl total multAssociative : (left : Nat) -> (centre : Nat) -> (right : Nat) -> left * (centre * right) = (left * centre) * right multAssociative Z centre right = Refl multAssociative (S left) centre right = let inductiveHypothesis = multAssociative left centre right in- ?multAssociativeStepCase+ rewrite inductiveHypothesis in + rewrite multDistributesOverPlusLeft centre (mult left centre) right in+ Refl total multOneLeftNeutral : (right : Nat) -> 1 * right = right multOneLeftNeutral Z = Refl multOneLeftNeutral (S right) = let inductiveHypothesis = multOneLeftNeutral right in- ?multOneLeftNeutralStepCase+ rewrite inductiveHypothesis in+ Refl total multOneRightNeutral : (left : Nat) -> left * 1 = left multOneRightNeutral Z = Refl multOneRightNeutral (S left) = let inductiveHypothesis = multOneRightNeutral left in- ?multOneRightNeutralStepCase+ rewrite inductiveHypothesis in+ Refl -- Minus total minusSuccSucc : (left : Nat) -> (right : Nat) ->@@ -554,29 +577,37 @@ minusMinusMinusPlus Z (S centre) right = Refl minusMinusMinusPlus (S left) (S centre) right = let inductiveHypothesis = minusMinusMinusPlus left centre right in- ?minusMinusMinusPlusStepCase+ rewrite inductiveHypothesis in+ Refl total plusMinusLeftCancel : (left : Nat) -> (right : Nat) -> (right' : Nat) -> (left + right) - (left + right') = right - right' plusMinusLeftCancel Z right right' = Refl plusMinusLeftCancel (S left) right right' = let inductiveHypothesis = plusMinusLeftCancel left right right' in- ?plusMinusLeftCancelStepCase+ rewrite inductiveHypothesis in+ Refl total multDistributesOverMinusLeft : (left : Nat) -> (centre : Nat) -> (right : Nat) -> (left - centre) * right = (left * right) - (centre * right) multDistributesOverMinusLeft Z Z right = Refl multDistributesOverMinusLeft (S left) Z right =- ?multDistributesOverMinusLeftBaseCase+ rewrite (minusZeroRight (plus right (mult left right))) in Refl multDistributesOverMinusLeft Z (S centre) right = Refl multDistributesOverMinusLeft (S left) (S centre) right = let inductiveHypothesis = multDistributesOverMinusLeft left centre right in- ?multDistributesOverMinusLeftStepCase+ rewrite inductiveHypothesis in+ rewrite plusMinusLeftCancel right (mult left right) (mult centre right) in+ Refl total multDistributesOverMinusRight : (left : Nat) -> (centre : Nat) -> (right : Nat) -> left * (centre - right) = (left * centre) - (left * right) multDistributesOverMinusRight left centre right =- ?multDistributesOverMinusRightBody+ rewrite multCommutative left (minus centre right) in+ rewrite multDistributesOverMinusLeft centre right left in+ rewrite multCommutative centre left in+ rewrite multCommutative right left in+ Refl -- Power total powerSuccPowerLeft : (base : Nat) -> (exp : Nat) -> power base (S exp) =@@ -585,10 +616,13 @@ total multPowerPowerPlus : (base : Nat) -> (exp : Nat) -> (exp' : Nat) -> (power base exp) * (power base exp') = power base (exp + exp')-multPowerPowerPlus base Z exp' = ?multPowerPowerPlusBaseCase+multPowerPowerPlus base Z exp' = + rewrite sym (plusZeroRightNeutral (power base exp')) in Refl multPowerPowerPlus base (S exp) exp' = let inductiveHypothesis = multPowerPowerPlus base exp exp' in- ?multPowerPowerPlusStepCase+ rewrite sym inductiveHypothesis in+ rewrite sym (multAssociative base (power base exp) (power base exp')) in+ Refl total powerZeroOne : (base : Nat) -> power base 0 = S Z powerZeroOne base = Refl@@ -597,26 +631,27 @@ powerOneNeutral Z = Refl powerOneNeutral (S base) = let inductiveHypothesis = powerOneNeutral base in- ?powerOneNeutralStepCase+ rewrite inductiveHypothesis in Refl total powerOneSuccOne : (exp : Nat) -> power 1 exp = S Z powerOneSuccOne Z = Refl powerOneSuccOne (S exp) = let inductiveHypothesis = powerOneSuccOne exp in- ?powerOneSuccOneStepCase+ rewrite inductiveHypothesis in Refl total powerSuccSuccMult : (base : Nat) -> power base 2 = mult base base powerSuccSuccMult Z = Refl-powerSuccSuccMult (S base) =- let inductiveHypothesis = powerSuccSuccMult base in- ?powerSuccSuccMultStepCase+powerSuccSuccMult (S base) = rewrite multOneRightNeutral base in Refl total powerPowerMultPower : (base : Nat) -> (exp : Nat) -> (exp' : Nat) -> power (power base exp) exp' = power base (exp * exp')-powerPowerMultPower base exp Z = ?powerPowerMultPowerBaseCase+powerPowerMultPower base exp Z = rewrite multZeroRightZero exp in Refl powerPowerMultPower base exp (S exp') = let inductiveHypothesis = powerPowerMultPower base exp exp' in- ?powerPowerMultPowerStepCase+ rewrite inductiveHypothesis in + rewrite multRightSuccPlus exp exp' in+ rewrite sym (multPowerPowerPlus base exp (mult exp exp')) in+ Refl -- Pred total predSucc : (n : Nat) -> pred (S n) = n@@ -626,11 +661,10 @@ left - (S right) = pred (left - right) minusSuccPred Z right = Refl minusSuccPred (S left) Z =- let inductiveHypothesis = minusSuccPred left Z in- ?minusSuccPredStepCase+ rewrite minusZeroRight left in Refl minusSuccPred (S left) (S right) = let inductiveHypothesis = minusSuccPred left right in- ?minusSuccPredStepCase'+ rewrite inductiveHypothesis in Refl -- ifThenElse total ifThenElseSuccSucc : (cond : Bool) -> (t : Nat) -> (f : Nat) ->@@ -713,9 +747,7 @@ minimumSuccSucc Z Z = Refl minimumSuccSucc (S left) Z = Refl minimumSuccSucc Z (S right) = Refl-minimumSuccSucc (S left) (S right) =- let inductiveHypothesis = minimumSuccSucc left right in- ?minimumSuccSuccStepCase+minimumSuccSucc (S left) (S right) = Refl total maximumZeroNRight : (right : Nat) -> maximum Z right = right maximumZeroNRight Z = Refl@@ -730,9 +762,7 @@ maximumSuccSucc Z Z = Refl maximumSuccSucc (S left) Z = Refl maximumSuccSucc Z (S right) = Refl-maximumSuccSucc (S left) (S right) =- let inductiveHypothesis = maximumSuccSucc left right in- ?maximumSuccSuccStepCase+maximumSuccSucc (S left) (S right) = Refl total sucMaxL : (l : Nat) -> maximum (S l) l = (S l) sucMaxL Z = Refl@@ -750,252 +780,3 @@ sucMinR Z = Refl sucMinR (S l) = cong (sucMinR l) ------------------------------------------------------------------------------------ Proofs-----------------------------------------------------------------------------------powerPowerMultPowerStepCase = proof {- intros;- rewrite sym inductiveHypothesis;- rewrite sym (multRightSuccPlus exp exp');- rewrite (multPowerPowerPlus base exp (mult exp exp'));- trivial;-}--powerPowerMultPowerBaseCase = proof {- intros;- rewrite sym (multZeroRightZero exp);- trivial;-}--powerSuccSuccMultStepCase = proof {- intros;- rewrite (multOneRightNeutral base);- rewrite sym (multOneRightNeutral base);- trivial;-}--powerOneSuccOneStepCase = proof {- intros;- rewrite inductiveHypothesis;- rewrite sym (plusZeroRightNeutral (power (S Z) exp));- trivial;-}--powerOneNeutralStepCase = proof {- intros;- rewrite inductiveHypothesis;- trivial;-}--multAssociativeStepCase = proof {- intros;- rewrite sym (multDistributesOverPlusLeft centre (mult left centre) right);- rewrite inductiveHypothesis;- trivial;-}--minusSuccPredStepCase' = proof {- intros;- rewrite sym inductiveHypothesis;- trivial;-}--minusSuccPredStepCase = proof {- intros;- rewrite (minusZeroRight left);- trivial;-}--multPowerPowerPlusStepCase = proof {- intros;- rewrite inductiveHypothesis;- rewrite (multAssociative base (power base exp) (power base exp'));- trivial;-}--multPowerPowerPlusBaseCase = proof {- intros;- rewrite (plusZeroRightNeutral (power base exp'));- trivial;-}--multOneRightNeutralStepCase = proof {- intros;- rewrite inductiveHypothesis;- trivial;-}--multOneLeftNeutralStepCase = proof {- intros;- rewrite (plusZeroRightNeutral right);- trivial;-}--multDistributesOverPlusLeftStepCase = proof {- intros;- rewrite sym inductiveHypothesis;- rewrite sym (plusAssociative right (mult left right) (mult centre right));- trivial;-}--multDistributesOverPlusRightStepCase = proof {- intros;- rewrite sym inductiveHypothesis;- rewrite sym (plusAssociative (plus centre (mult left centre)) right (mult left right));- rewrite (plusAssociative centre (mult left centre) right);- rewrite sym (plusCommutative (mult left centre) right);- rewrite sym (plusAssociative centre right (mult left centre));- rewrite sym (plusAssociative (plus centre right) (mult left centre) (mult left right));- trivial;-}--multCommutativeStepCase = proof {- intros;- rewrite sym (multRightSuccPlus right left);- rewrite inductiveHypothesis;- trivial;-}--multCommutativeBaseCase = proof {- intros;- rewrite (multZeroRightZero right);- trivial;-}--multRightSuccPlusStepCase = proof {- intros;- rewrite inductiveHypothesis;- rewrite sym inductiveHypothesis;- rewrite sym (plusAssociative right left (mult left right));- rewrite sym (plusCommutative right left);- rewrite (plusAssociative left right (mult left right));- trivial;-}--multZeroRightZeroStepCase = proof {- intros;- rewrite inductiveHypothesis;- trivial;-}--plusAssociativeStepCase = proof {- intros;- rewrite inductiveHypothesis;- trivial;-}--plusCommutativeStepCase = proof {- intros;- rewrite (plusSuccRightSucc right left);- rewrite inductiveHypothesis;- trivial;-}--plusSuccRightSuccStepCase = proof {- intros;- rewrite inductiveHypothesis;- trivial;-}--plusCommutativeBaseCase = proof {- intros;- rewrite sym (plusZeroRightNeutral right);- trivial;-}--plusZeroRightNeutralStepCase = proof {- intros;- rewrite inductiveHypothesis;- trivial;-}--maximumSuccSuccStepCase = proof {- intros;- rewrite sym (ifThenElseSuccSucc (lte left right) (S right) (S left));- trivial;-}--minimumSuccSuccStepCase = proof {- intros;- rewrite (ifThenElseSuccSucc (lte left right) (S left) (S right));- trivial;-}--multDistributesOverMinusRightBody = proof {- intros;- rewrite sym (multCommutative left (minus centre right));- rewrite sym (multDistributesOverMinusLeft centre right left);- rewrite sym (multCommutative centre left);- rewrite sym (multCommutative right left);- trivial;-}--multDistributesOverMinusLeftStepCase = proof {- intros;- rewrite sym (plusMinusLeftCancel right (mult left right) (mult centre right));- trivial;-}--multDistributesOverMinusLeftBaseCase = proof {- intros;- rewrite (minusZeroRight (plus right (mult left right)));- trivial;-}--plusMinusLeftCancelStepCase = proof {- intros;- rewrite inductiveHypothesis;- trivial;-}--minusMinusMinusPlusStepCase = proof {- intros;- rewrite inductiveHypothesis;- trivial;-}--plusLeftLeftRightZeroBaseCase = proof {- intros;- rewrite p;- trivial;-}--plusLeftLeftRightZeroStepCase = proof {- intros;- refine inductiveHypothesis;- let p' = succInjective (plus left right) left p;- rewrite p';- trivial;-}--plusRightCancelStepCase = proof {- intros;- refine inductiveHypothesis;- refine succInjective _ _ ?;- rewrite sym (plusSuccRightSucc left right);- rewrite sym (plusSuccRightSucc left' right);- rewrite p;- trivial;-}--plusRightCancelBaseCase = proof {- intros;- rewrite (plusZeroRightNeutral left);- rewrite (plusZeroRightNeutral left');- rewrite p;- trivial;-}--plusLeftCancelStepCase = proof {- intros;- let injectiveProof = succInjective (plus left right) (plus left right') p;- rewrite (inductiveHypothesis injectiveProof);- trivial;-}--plusLeftCancelBaseCase = proof {- intros;- rewrite p;- trivial;-}
+ libs/prelude/Prelude/Show.idr view
@@ -0,0 +1,190 @@+module Prelude.Show++import Builtins++import Prelude.Basics+import Prelude.Bits+import Prelude.Bool+import Prelude.Cast+import Prelude.Chars+import Prelude.Classes+import Prelude.List+import Prelude.Maybe+import Prelude.Nat+import Prelude.Strings++%default total++||| The precedence of an Idris operator or syntactic context.+data Prec = Open | Eq | Dollar | Backtick | User Nat | PrefixMinus | App++||| Gives the constructor index of the Prec as a helper for writing instances.+precCon : Prec -> Integer+precCon Open = 0+precCon Eq = 1+precCon Dollar = 2+precCon Backtick = 3+precCon (User n) = 4+precCon PrefixMinus = 5+precCon App = 6++instance Eq Prec where+ (==) (User m) (User n) = m == n+ (==) x y = precCon x == precCon y++instance Ord Prec where+ compare (User m) (User n) = compare m n+ compare x y = compare (precCon x) (precCon y)++||| Things that have a canonical `String` representation.+class Show a where+ ||| Convert a value to its `String` representation.+ |||+ ||| @ a the value to convert+ partial+ show : (x : a) -> String+ show = showPrec Open++ ||| Convert a value to its `String` representation in a certain precedence+ ||| context.+ |||+ ||| A value should produce parentheses around itself if and only if the given+ ||| precedence context is greater than or equal to the precedence of the+ ||| outermost operation represented in the produced `String`. *This is+ ||| different from Haskell*, which requires it to be strictly greater. `Open`+ ||| should thus always produce *no* outermost parens, `App` should always+ ||| produce outermost parens except on atomic values and those that provide+ ||| their own bracketing, like `Pair` and `List`.+ |||+ ||| @ d the precedence context.+ ||| @ a the value to convert+ partial+ showPrec : (d : Prec) -> (x : a) -> String+ showPrec _ = show++||| Surround a `String` with parentheses depending on a condition.+|||+||| @ b whether to add parentheses+showParens : (b : Bool) -> String -> String+showParens False s = s+showParens True s = "(" ++ s ++ ")"++||| A helper for the common case of showing a non-infix constructor with at+||| least one argument, for use with `showArg`.+|||+||| Apply `showCon` to the precedence context, the constructor name, and the+||| args shown with `showArg` and concatenated. Example:+||| ```+||| data Ann a = MkAnn String a+|||+||| instance Show a => Show (Ann a) where+||| showPrec d (MkAnn s x) = showCon d "MkAnn" $ showArg s ++ showArg x+||| ```+showCon : (d : Prec) -> (conName : String) -> (shownArgs : String) -> String+showCon d conName shownArgs = showParens (d >= App) $ conName ++ shownArgs++||| A helper for the common case of showing a non-infix constructor with at+||| least one argument, for use with `showCon`.+|||+||| This adds a space to the front so the results can be directly+||| concatenated. See `showCon` for details and an example.+showArg : Show a => (x : a) -> String+showArg x = " " ++ showPrec App x++firstCharIs : (Char -> Bool) -> String -> Bool+firstCharIs p s with (strM s)+ firstCharIs p "" | StrNil = False+ firstCharIs p (strCons c cs) | StrCons c cs = p c++primNumShow : (a -> String) -> Prec -> a -> String+primNumShow f d x = let str = f x in showParens (d >= PrefixMinus && firstCharIs (== '-') str) str++instance Show Int where+ showPrec = primNumShow prim__toStrInt++instance Show Integer where+ showPrec = primNumShow prim__toStrBigInt++instance Show Double where+ showPrec = primNumShow prim__floatToStr++protectEsc : (Char -> Bool) -> String -> String -> String+protectEsc p f s = f ++ (if firstCharIs p s then "\\&" else "") ++ s++showLitChar : Char -> String -> String+showLitChar '\a' = ("\\a" ++)+showLitChar '\b' = ("\\b" ++)+showLitChar '\f' = ("\\f" ++)+showLitChar '\n' = ("\\n" ++)+showLitChar '\r' = ("\\r" ++)+showLitChar '\t' = ("\\t" ++)+showLitChar '\v' = ("\\v" ++)+showLitChar '\SO' = protectEsc (== 'H') "\\SO"+showLitChar '\DEL' = ("\\DEL" ++)+showLitChar '\\' = ("\\\\" ++)+showLitChar c = case getAt (cast (cast {to=Int} c)) asciiTab of+ Just k => strCons '\\' . (k ++)+ Nothing => if (c > '\DEL')+ then strCons '\\' . protectEsc isDigit (show (cast {to=Int} c))+ else strCons c+ where asciiTab : List String+ asciiTab = ["NUL", "SOH", "STX", "ETX", "EOT", "ENQ", "ACK", "BEL",+ "BS", "HT", "LF", "VT", "FF", "CR", "SO", "SI",+ "DLE", "DC1", "DC2", "DC3", "DC4", "NAK", "SYN", "ETB",+ "CAN", "EM", "SUB", "ESC", "FS", "GS", "RS", "US"]++ getAt : Nat -> List String -> Maybe String+ getAt Z (x :: xs) = Just x+ getAt (S k) (x :: xs) = getAt k xs+ getAt _ [] = Nothing++showLitString : List Char -> String -> String+showLitString [] = id+showLitString ('"'::cs) = ("\\\"" ++) . showLitString cs+showLitString (c ::cs) = showLitChar c . showLitString cs++instance Show Char where+ show '\'' = "'\\''"+ show c = strCons '\'' (showLitChar c "'")++instance Show String where+ show cs = strCons '"' (showLitString (cast cs) "\"")++instance Show Nat where+ show n = show (the Integer (cast n))++instance Show Bool where+ show True = "True"+ show False = "False"++instance Show () where+ show () = "()"++instance Show Bits8 where+ show b = b8ToString b++instance Show Bits16 where+ show b = b16ToString b++instance Show Bits32 where+ show b = b32ToString b++instance Show Bits64 where+ show b = b64ToString b++instance (Show a, Show b) => Show (a, b) where+ show (x, y) = "(" ++ show x ++ ", " ++ show y ++ ")"++instance Show a => Show (List a) where+ show xs = "[" ++ show' "" xs ++ "]" where+ show' acc [] = acc+ show' acc [x] = acc ++ show x+ show' acc (x :: xs) = show' (acc ++ show x ++ ", ") xs++instance Show a => Show (Maybe a) where+ showPrec d Nothing = "Nothing"+ showPrec d (Just x) = showCon d "Just" $ showArg x++instance (Show a, {y : a} -> Show (p y)) => Show (Sigma a p) where+ show (y ** prf) = "(" ++ show y ++ " ** " ++ show prf ++ ")"+
libs/prelude/Prelude/Strings.idr view
@@ -1,6 +1,7 @@ module Prelude.Strings import Builtins+import IO import Prelude.Algebra import Prelude.Basics@@ -13,8 +14,18 @@ import Prelude.Functor import Prelude.List import Prelude.Nat+import Prelude.Monad import Decidable.Equality +partial+foldr1 : (a -> a -> a) -> List a -> a+foldr1 _ [x] = x+foldr1 f (x::xs) = f x (foldr1 f xs)++partial+foldl1 : (a -> a -> a) -> List a -> a+foldl1 f (x::xs) = foldl f x xs+ ||| Appends two strings together. ||| ||| ```idris example@@ -247,15 +258,6 @@ lines : String -> List String lines s = map pack $ lines' $ unpack s -partial-foldr1 : (a -> a -> a) -> List a -> a-foldr1 _ [x] = x-foldr1 f (x::xs) = f x (foldr1 f xs)--partial-foldl1 : (a -> a -> a) -> List a -> a-foldl1 f (x::xs) = foldl f x xs- ||| Joins the character lists by spaces into a single character list. ||| ||| ```idris example@@ -263,12 +265,11 @@ ||| ``` unwords' : List (List Char) -> List Char unwords' [] = []-unwords' ws = assert_total (foldr1 addSpace ws)- where- addSpace : List Char -> List Char -> List Char- addSpace w s = w ++ (' ' :: s)+unwords' ws = assert_total (foldr1 addSpace ws) where+ addSpace : List Char -> List Char -> List Char+ addSpace w s = w ++ (' ' :: s) -||| Joins the strings by spaces into a single string. +||| Joins the strings by spaces into a single string. ||| ||| ```idris example ||| unwords ["A", "BC", "D", "E"]@@ -276,6 +277,25 @@ unwords : List String -> String unwords = pack . unwords' . map unpack +||| Joins the character lists by newlines into a single character list.+|||+||| ```idris example+||| unlines' [['l','i','n','e'], ['l','i','n','e','2'], ['l','n','3'], ['D']]+||| ```+unlines' : List (List Char) -> List Char+unlines' [] = []+unlines' ls = assert_total (foldr1 addLine ls) where+ addLine : List Char -> List Char -> List Char+ addLine l s = l ++ ('\n' :: s)++||| Joins the strings by newlines into a single string.+|||+||| ```idris example+||| unlines ["line", "line2", "ln3", "D"]+||| ```+unlines : List String -> String+unlines = pack . unlines' . map unpack+ ||| Returns the length of the string. ||| ||| ```idris example@@ -287,6 +307,14 @@ length : String -> Nat length = fromInteger . prim__zextInt_BigInt . prim_lenString +||| Returns a substring of a given string+||| @index The (zero based) index of the string to extract. If this is+||| beyond the end of the String, the function returns the empty string.+||| @len The desired length of the substring. Truncated if this exceeds+||| the length of the input.+substr : (index : Nat) -> (len : Nat) -> String -> String+substr i len = pack . List.take len . drop i . unpack+ ||| Lowercases all characters in the string. ||| ||| ```idris example@@ -321,3 +349,16 @@ isInfixOf : String -> String -> Bool isInfixOf a b = isInfixOf (unpack a) (unpack b)++||| Check if a foreign pointer is null+partial+nullPtr : Ptr -> IO Bool+nullPtr p = do ok <- foreign FFI_C "isNull" (Ptr -> IO Int) p+ return (ok /= 0)++||| Check if a supposed string was actually a null pointer+partial+nullStr : String -> IO Bool+nullStr p = do ok <- foreign FFI_C "isNull" (String -> IO Int) p+ return (ok /= 0)+
libs/prelude/prelude.ipkg view
@@ -6,9 +6,10 @@ Prelude.Algebra, Prelude.Basics, Prelude.Bool, Prelude.Cast, Prelude.Classes, Prelude.Nat, Prelude.List, Prelude.Maybe, Prelude.Monad, Prelude.Applicative, Prelude.Either,- Prelude.Strings, Prelude.Chars, Prelude.Functor,+ Prelude.Strings, Prelude.Chars, Prelude.Show, Prelude.Functor, Prelude.Foldable, Prelude.Traversable, Prelude.Bits, Prelude.Stream, Prelude.Uninhabited, Prelude.Pairs, Prelude.Providers,+ Prelude.Interactive, Prelude.File, Language.Reflection, Language.Reflection.Errors, Language.Reflection.Elab,
rts/idris_rts.c view
@@ -26,6 +26,7 @@ VAL* valstack = malloc(stack_size * sizeof(VAL)); + vm->active = 1; vm->valstack = valstack; vm->valstack_top = valstack; vm->valstack_base = valstack;@@ -104,7 +105,12 @@ pthread_mutex_destroy(&(vm -> inbox_block)); pthread_cond_destroy(&(vm -> inbox_waiting)); #endif- free(vm);+ // free(vm); + // Set the VM as inactive, so that if any message gets sent to it+ // it will not get there, rather than crash the entire system.+ // (TODO: We really need to be cleverer than this if we're going to+ // write programs than create lots of threads...)+ vm->active = 0; STATS_LEAVE_EXIT(stats) return stats;@@ -464,7 +470,7 @@ Closure* cl = allocate(sizeof(Closure) + sizeof(char)*32, 0); SETTY(cl, STRING); cl -> info.str = (char*)cl + sizeof(Closure);- sprintf(cl -> info.str, "%g", GETFLOAT(i));+ snprintf(cl -> info.str, 32, "%.16g", GETFLOAT(i)); return cl; } @@ -738,7 +744,7 @@ } // Add a message to another VM's message queue-void idris_sendMessage(VM* sender, VM* dest, VAL msg) {+int idris_sendMessage(VM* sender, VM* dest, VAL msg) { // FIXME: If GC kicks in in the middle of the copy, we're in trouble. // Probably best check there is enough room in advance. (How?) @@ -749,6 +755,8 @@ // So: we try to copy, if a collection happens, we do the copy again // under the assumption there's enough space this time. + if (dest->active == 0) { return 0; } // No VM to send to+ int gcs = dest->stats.collections; pthread_mutex_lock(&dest->alloc_lock); VAL dmsg = copyTo(dest, msg);@@ -784,6 +792,7 @@ pthread_mutex_unlock(&(dest->inbox_lock)); // printf("Sending [unlock]...\n");+ return 1; } VM* idris_checkMessages(VM* vm) {@@ -800,6 +809,29 @@ } return 0; }++VM* idris_checkMessagesTimeout(VM* vm, int delay) {+ VM* sender = idris_checkMessagesFrom(vm, NULL);+ if (sender != NULL) {+ return sender;+ }++ struct timespec timeout;+ int status;++ // Wait either for a timeout or until we get a signal that a message+ // has arrived.+ pthread_mutex_lock(&vm->inbox_block);+ timeout.tv_sec = time (NULL) + delay;+ timeout.tv_nsec = 0;+ status = pthread_cond_timedwait(&vm->inbox_waiting, &vm->inbox_block,+ &timeout);+ (void)(status); //don't emit 'unused' warning+ pthread_mutex_unlock(&vm->inbox_block);++ return idris_checkMessagesFrom(vm, NULL);+}+ Msg* idris_getMessageFrom(VM* vm, VM* sender) { Msg* msg;
rts/idris_rts.h view
@@ -78,6 +78,10 @@ typedef struct Msg_t Msg; struct VM_t {+ int active; // 0 if no longer running; keep for message passing+ // TODO: If we're going to have lots of concurrent threads,+ // we really need to be cleverer than this!+ VAL* valstack; VAL* valstack_top; VAL* valstack_base;@@ -253,12 +257,14 @@ VAL copyTo(VM* newVM, VAL x); // Add a message to another VM's message queue-void idris_sendMessage(VM* sender, VM* dest, VAL msg);+int idris_sendMessage(VM* sender, VM* dest, VAL msg); // Check whether there are any messages in the queue and return PID of // sender if so (null if not) VM* idris_checkMessages(VM* vm); // Check whether there are any messages in the queue VM* idris_checkMessagesFrom(VM* vm, VM* sender);+// Check whether there are any messages in the queue, and wait if not+VM* idris_checkMessagesTimeout(VM* vm, int timeout); // block until there is a message in the queue Msg* idris_recvMessage(VM* vm); // block until there is a message in the queue
rts/idris_stdfgn.c view
@@ -1,5 +1,6 @@ #include "idris_stdfgn.h" #include "idris_rts.h"+#include "idris_gmp.h" #include "idris_gc.h" #include <sys/select.h> #include <fcntl.h>@@ -80,9 +81,9 @@ return *(environ + i); } -int idris_time() {+VAL idris_time() { time_t t = time(NULL);- return (int)t;+ return MKBIGI(t); } void idris_forceGC(void* vm) {
rts/idris_stdfgn.h view
@@ -1,6 +1,8 @@ #ifndef _IDRISSTDFGN_H #define _IDRISSTDFGN_H +#include "idris_rts.h"+ // A collection of useful standard functions to be used by the prelude. void putStr(char* str);@@ -22,7 +24,7 @@ char* getEnvPair(int i); -int idris_time();+VAL idris_time(); void idris_forceGC();
rts/windows/idris_stdfgn.c view
@@ -72,9 +72,9 @@ return *(environ + i); } -int idris_time() {+VAL idris_time() { time_t t = time(NULL);- return (int)t;+ return MKBIGI(t); } void idris_forceGC(void* vm) {
src/IRTS/CodegenC.hs view
@@ -64,7 +64,7 @@ (if (exec == Executable) then mprog else hi) case exec of MavenProject -> putStrLn ("FAILURE: output type not supported")- Raw -> writeFile out cout+ Raw -> writeSource out cout _ -> do (tmpn, tmph) <- tempfile hPutStr tmph cout@@ -570,6 +570,10 @@ doOp v (LExternal se) [] | se == sUN "prim__stderr" = v ++ "MKPTR(vm, stderr)" doOp v (LExternal nul) [] | nul == sUN "prim__null" = v ++ "MKPTR(vm, NULL)"+doOp v (LExternal eqp) [x, y] | eqp == sUN "prim__eqPtr" + = v ++ "MKINT((i_int)(GETPTR(" ++ creg x ++ ") == GETPTR(" ++ creg y ++ ")))"+doOp v (LExternal eqp) [x, y] | eqp == sUN "prim__eqManagedPtr" + = v ++ "MKINT((i_int)(GETMPTR(" ++ creg x ++ ") == GETMPTR(" ++ creg y ++ ")))" doOp v (LExternal rp) [p, i] | rp == sUN "prim__registerPtr" = v ++ "MKMPTR(vm, GETPTR(" ++ creg p ++ "), GETINT(" ++ creg i ++ "))"
src/IRTS/CodegenJavaScript.hs view
@@ -132,12 +132,12 @@ ++ idrRuntime ++ tgtRuntime )- TIO.writeFile filename ( T.pack runtime- `T.append` T.concat (map compileJS opt)- `T.append` T.concat (map compileJS cons)- `T.append` main- `T.append` invokeMain- )+ writeSourceText filename ( T.pack runtime+ `T.append` T.concat (map compileJS opt)+ `T.append` T.concat (map compileJS cons)+ `T.append` main+ `T.append` invokeMain+ ) setPermissions filename (emptyPermissions { readable = True , executable = target == Node , writable = True@@ -250,12 +250,7 @@ , JSApp ( JSIdent (translateName (sMN 0 "runMain")) ) [JSNew "i$POINTER" [JSNum (JSInt 0)]]- , JSWhile (JSProj jsCALLSTACK "length") (- JSSeq [ JSAlloc "func" (Just jsPOP)- , JSAlloc "args" (Just jsPOP)- , JSApp (JSProj (JSIdent "func") "apply") [JSThis, JSIdent "args"]- ]- )+ , JSApp (JSIdent "i$RUN") [] ] invokeMain :: T.Text@@ -601,7 +596,7 @@ jsBASETOP _ n = JSAssign jsSTACKBASE (JSBinOp "+" jsSTACKTOP (JSNum (JSInt n))) jsNULL :: CompileInfo -> Reg -> JS-jsNULL _ r = JSAssign (translateReg r) JSNull+jsNULL _ r = JSDelete (translateReg r) jsERROR :: CompileInfo -> String -> JS jsERROR _ = JSError@@ -680,9 +675,10 @@ | LNoOp <- op = translateReg (last args) | LWriteStr <- op,- (_:str:_) <- args = JSAssign (translateReg reg)- (JSApp (JSIdent "i$putStr") [translateReg str])+ (_:str:_) <- args = JSApp (JSIdent "i$putStr") [translateReg str] + | LReadStr <- op = JSApp (JSIdent "i$getLine") []+ | (LZExt (ITFixed IT8) ITNative) <- op = jsUnPackBits $ translateReg (last args) | (LZExt (ITFixed IT16) ITNative) <- op = jsUnPackBits $ translateReg (last args) | (LZExt (ITFixed IT32) ITNative) <- op = jsUnPackBits $ translateReg (last args)@@ -699,15 +695,15 @@ | (LSRem (ATInt ITBig)) <- op , (lhs:rhs:_) <- args = invokeMeth lhs "mod" [rhs] | (LEq (ATInt ITBig)) <- op- , (lhs:rhs:_) <- args = invokeMeth lhs "equals" [rhs]+ , (lhs:rhs:_) <- args = JSPreOp "+" $ invokeMeth lhs "equals" [rhs] | (LSLt (ATInt ITBig)) <- op- , (lhs:rhs:_) <- args = invokeMeth lhs "lesser" [rhs]+ , (lhs:rhs:_) <- args = JSPreOp "+" $ invokeMeth lhs "lesser" [rhs] | (LSLe (ATInt ITBig)) <- op- , (lhs:rhs:_) <- args = invokeMeth lhs "lesserOrEquals" [rhs]+ , (lhs:rhs:_) <- args = JSPreOp "+" $ invokeMeth lhs "lesserOrEquals" [rhs] | (LSGt (ATInt ITBig)) <- op- , (lhs:rhs:_) <- args = invokeMeth lhs "greater" [rhs]+ , (lhs:rhs:_) <- args = JSPreOp "+" $ invokeMeth lhs "greater" [rhs] | (LSGe (ATInt ITBig)) <- op- , (lhs:rhs:_) <- args = invokeMeth lhs "greaterOrEquals" [rhs]+ , (lhs:rhs:_) <- args = JSPreOp "+" $ invokeMeth lhs "greaterOrEquals" [rhs] | (LPlus ATFloat) <- op , (lhs:rhs:_) <- args = translateBinaryOp "+" lhs rhs@@ -718,15 +714,15 @@ | (LSDiv ATFloat) <- op , (lhs:rhs:_) <- args = translateBinaryOp "/" lhs rhs | (LEq ATFloat) <- op- , (lhs:rhs:_) <- args = translateBinaryOp "==" lhs rhs+ , (lhs:rhs:_) <- args = translateCompareOp "==" lhs rhs | (LSLt ATFloat) <- op- , (lhs:rhs:_) <- args = translateBinaryOp "<" lhs rhs+ , (lhs:rhs:_) <- args = translateCompareOp "<" lhs rhs | (LSLe ATFloat) <- op- , (lhs:rhs:_) <- args = translateBinaryOp "<=" lhs rhs+ , (lhs:rhs:_) <- args = translateCompareOp "<=" lhs rhs | (LSGt ATFloat) <- op- , (lhs:rhs:_) <- args = translateBinaryOp ">" lhs rhs+ , (lhs:rhs:_) <- args = translateCompareOp ">" lhs rhs | (LSGe ATFloat) <- op- , (lhs:rhs:_) <- args = translateBinaryOp ">=" lhs rhs+ , (lhs:rhs:_) <- args = translateCompareOp ">=" lhs rhs | (LPlus (ATInt ITChar)) <- op , (lhs:rhs:_) <- args =@@ -765,44 +761,26 @@ ] | (LLSHR (ITFixed IT8)) <- op- , (lhs:rhs:_) <- args =- jsPackUBits8 (- JSBinOp ">>" (jsUnPackBits $ translateReg lhs) (jsUnPackBits $ translateReg rhs)- )+ , (lhs:rhs:_) <- args = jsPackUBits8 $ bitsBinaryOp ">>" lhs rhs | (LLSHR (ITFixed IT16)) <- op- , (lhs:rhs:_) <- args =- jsPackUBits16 (- JSBinOp ">>" (jsUnPackBits $ translateReg lhs) (jsUnPackBits $ translateReg rhs)- )+ , (lhs:rhs:_) <- args = jsPackUBits16 $ bitsBinaryOp ">>" lhs rhs | (LLSHR (ITFixed IT32)) <- op- , (lhs:rhs:_) <- args =- jsPackUBits32 (- JSBinOp ">>" (jsUnPackBits $ translateReg lhs) (jsUnPackBits $ translateReg rhs)- )+ , (lhs:rhs:_) <- args = jsPackUBits32 $ bitsBinaryOp ">>" lhs rhs | (LLSHR (ITFixed IT64)) <- op , (lhs:rhs:_) <- args = jsMeth (translateReg lhs) "shiftRight" [translateReg rhs] | (LSHL (ITFixed IT8)) <- op- , (lhs:rhs:_) <- args =- jsPackUBits8 (- JSBinOp "<<" (jsUnPackBits $ translateReg lhs) (jsUnPackBits $ translateReg rhs)- )+ , (lhs:rhs:_) <- args = jsPackUBits8 $ bitsBinaryOp "<<" lhs rhs | (LSHL (ITFixed IT16)) <- op- , (lhs:rhs:_) <- args =- jsPackUBits16 (- JSBinOp "<<" (jsUnPackBits $ translateReg lhs) (jsUnPackBits $ translateReg rhs)- )+ , (lhs:rhs:_) <- args = jsPackUBits16 $ bitsBinaryOp "<<" lhs rhs | (LSHL (ITFixed IT32)) <- op- , (lhs:rhs:_) <- args =- jsPackUBits32 (- JSBinOp "<<" (jsUnPackBits $ translateReg lhs) (jsUnPackBits $ translateReg rhs)- )+ , (lhs:rhs:_) <- args = jsPackUBits32 $ bitsBinaryOp "<<" lhs rhs | (LSHL (ITFixed IT64)) <- op , (lhs:rhs:_) <- args =@@ -811,88 +789,52 @@ ] | (LAnd (ITFixed IT8)) <- op- , (lhs:rhs:_) <- args =- jsPackUBits8 (- JSBinOp "&" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))- )+ , (lhs:rhs:_) <- args = jsPackUBits8 $ bitsBinaryOp "&" lhs rhs | (LAnd (ITFixed IT16)) <- op- , (lhs:rhs:_) <- args =- jsPackUBits16 (- JSBinOp "&" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))- )+ , (lhs:rhs:_) <- args = jsPackUBits16 $ bitsBinaryOp "&" lhs rhs | (LAnd (ITFixed IT32)) <- op- , (lhs:rhs:_) <- args =- jsPackUBits32 (- JSBinOp "&" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))- )+ , (lhs:rhs:_) <- args = jsPackUBits32 $ bitsBinaryOp "&" lhs rhs | (LAnd (ITFixed IT64)) <- op , (lhs:rhs:_) <- args = jsMeth (translateReg lhs) "and" [translateReg rhs] | (LOr (ITFixed IT8)) <- op- , (lhs:rhs:_) <- args =- jsPackUBits8 (- JSBinOp "|" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))- )+ , (lhs:rhs:_) <- args = jsPackUBits8 $ bitsBinaryOp "|" lhs rhs | (LOr (ITFixed IT16)) <- op- , (lhs:rhs:_) <- args =- jsPackUBits16 (- JSBinOp "|" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))- )+ , (lhs:rhs:_) <- args = jsPackUBits16 $ bitsBinaryOp "|" lhs rhs | (LOr (ITFixed IT32)) <- op- , (lhs:rhs:_) <- args =- jsPackUBits32 (- JSBinOp "|" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))- )+ , (lhs:rhs:_) <- args = jsPackUBits32 $ bitsBinaryOp "|" lhs rhs | (LOr (ITFixed IT64)) <- op , (lhs:rhs:_) <- args = jsMeth (translateReg lhs) "or" [translateReg rhs] | (LXOr (ITFixed IT8)) <- op- , (lhs:rhs:_) <- args =- jsPackUBits8 (- JSBinOp "^" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))- )+ , (lhs:rhs:_) <- args = jsPackUBits8 $ bitsBinaryOp "^" lhs rhs | (LXOr (ITFixed IT16)) <- op- , (lhs:rhs:_) <- args =- jsPackUBits16 (- JSBinOp "^" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))- )+ , (lhs:rhs:_) <- args = jsPackUBits16 $ bitsBinaryOp "^" lhs rhs | (LXOr (ITFixed IT32)) <- op- , (lhs:rhs:_) <- args =- jsPackUBits32 (- JSBinOp "^" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))- )+ , (lhs:rhs:_) <- args = jsPackUBits32 $ bitsBinaryOp "^" lhs rhs | (LXOr (ITFixed IT64)) <- op , (lhs:rhs:_) <- args = jsMeth (translateReg lhs) "xor" [translateReg rhs] | (LPlus (ATInt (ITFixed IT8))) <- op- , (lhs:rhs:_) <- args =- jsPackUBits8 (- JSBinOp "+" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))- )+ , (lhs:rhs:_) <- args = jsPackUBits8 $ bitsBinaryOp "+" lhs rhs | (LPlus (ATInt (ITFixed IT16))) <- op- , (lhs:rhs:_) <- args =- jsPackUBits16 (- JSBinOp "+" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))- )+ , (lhs:rhs:_) <- args = jsPackUBits16 $ bitsBinaryOp "+" lhs rhs | (LPlus (ATInt (ITFixed IT32))) <- op- , (lhs:rhs:_) <- args =- jsPackUBits32 (- JSBinOp "+" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))- )+ , (lhs:rhs:_) <- args = jsPackUBits32 $ bitsBinaryOp "+" lhs rhs | (LPlus (ATInt (ITFixed IT64))) <- op , (lhs:rhs:_) <- args =@@ -901,22 +843,13 @@ ] | (LMinus (ATInt (ITFixed IT8))) <- op- , (lhs:rhs:_) <- args =- jsPackUBits8 (- JSBinOp "-" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))- )+ , (lhs:rhs:_) <- args = jsPackUBits8 $ bitsBinaryOp "-" lhs rhs | (LMinus (ATInt (ITFixed IT16))) <- op- , (lhs:rhs:_) <- args =- jsPackUBits16 (- JSBinOp "-" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))- )+ , (lhs:rhs:_) <- args = jsPackUBits16 $ bitsBinaryOp "-" lhs rhs | (LMinus (ATInt (ITFixed IT32))) <- op- , (lhs:rhs:_) <- args =- jsPackUBits32 (- JSBinOp "-" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))- )+ , (lhs:rhs:_) <- args = jsPackUBits32 $ bitsBinaryOp "-" lhs rhs | (LMinus (ATInt (ITFixed IT64))) <- op , (lhs:rhs:_) <- args =@@ -925,22 +858,13 @@ ] | (LTimes (ATInt (ITFixed IT8))) <- op- , (lhs:rhs:_) <- args =- jsPackUBits8 (- JSBinOp "*" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))- )+ , (lhs:rhs:_) <- args = jsPackUBits8 $ bitsBinaryOp "*" lhs rhs | (LTimes (ATInt (ITFixed IT16))) <- op- , (lhs:rhs:_) <- args =- jsPackUBits16 (- JSBinOp "*" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))- )+ , (lhs:rhs:_) <- args = jsPackUBits16 $ bitsBinaryOp "*" lhs rhs | (LTimes (ATInt (ITFixed IT32))) <- op- , (lhs:rhs:_) <- args =- jsPackUBits32 (- JSBinOp "*" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))- )+ , (lhs:rhs:_) <- args = jsPackUBits32 $ bitsBinaryOp "*" lhs rhs | (LTimes (ATInt (ITFixed IT64))) <- op , (lhs:rhs:_) <- args =@@ -949,110 +873,62 @@ ] | (LEq (ATInt (ITFixed IT8))) <- op- , (lhs:rhs:_) <- args =- jsPackUBits8 (- JSBinOp "==" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))- )+ , (lhs:rhs:_) <- args = bitsCompareOp "==" lhs rhs | (LEq (ATInt (ITFixed IT16))) <- op- , (lhs:rhs:_) <- args =- jsPackUBits16 (- JSBinOp "==" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))- )+ , (lhs:rhs:_) <- args = bitsCompareOp "==" lhs rhs | (LEq (ATInt (ITFixed IT32))) <- op- , (lhs:rhs:_) <- args =- jsPackUBits32 (- JSBinOp "==" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))- )+ , (lhs:rhs:_) <- args = bitsCompareOp "==" lhs rhs | (LEq (ATInt (ITFixed IT64))) <- op- , (lhs:rhs:_) <- args =- jsMeth (jsMeth (translateReg lhs) "equals" [translateReg rhs]) "and" [- jsBigInt (JSString $ show 0xFFFFFFFFFFFFFFFF)- ]+ , (lhs:rhs:_) <- args = JSPreOp "+" $ invokeMeth lhs "equals" [rhs] | (LLt (ITFixed IT8)) <- op- , (lhs:rhs:_) <- args =- jsPackUBits8 (- JSBinOp "<" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))- )+ , (lhs:rhs:_) <- args = bitsCompareOp "<" lhs rhs | (LLt (ITFixed IT16)) <- op- , (lhs:rhs:_) <- args =- jsPackUBits16 (- JSBinOp "<" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))- )+ , (lhs:rhs:_) <- args = bitsCompareOp "<" lhs rhs | (LLt (ITFixed IT32)) <- op- , (lhs:rhs:_) <- args =- jsPackUBits32 (- JSBinOp "<" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))- )+ , (lhs:rhs:_) <- args = bitsCompareOp "<" lhs rhs | (LLt (ITFixed IT64)) <- op- , (lhs:rhs:_) <- args = invokeMeth lhs "lesser" [rhs]+ , (lhs:rhs:_) <- args = JSPreOp "+" $ invokeMeth lhs "lesser" [rhs] | (LLe (ITFixed IT8)) <- op- , (lhs:rhs:_) <- args =- jsPackUBits8 (- JSBinOp "<=" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))- )+ , (lhs:rhs:_) <- args = bitsCompareOp "<=" lhs rhs | (LLe (ITFixed IT16)) <- op- , (lhs:rhs:_) <- args =- jsPackUBits16 (- JSBinOp "<=" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))- )+ , (lhs:rhs:_) <- args = bitsCompareOp "<=" lhs rhs | (LLe (ITFixed IT32)) <- op- , (lhs:rhs:_) <- args =- jsPackUBits32 (- JSBinOp "<=" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))- )+ , (lhs:rhs:_) <- args = bitsCompareOp "<=" lhs rhs | (LLe (ITFixed IT64)) <- op- , (lhs:rhs:_) <- args = invokeMeth lhs "lesserOrEquals" [rhs]+ , (lhs:rhs:_) <- args = JSPreOp "+" $ invokeMeth lhs "lesserOrEquals" [rhs] | (LGt (ITFixed IT8)) <- op- , (lhs:rhs:_) <- args =- jsPackUBits8 (- JSBinOp ">" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))- )+ , (lhs:rhs:_) <- args = bitsCompareOp ">" lhs rhs | (LGt (ITFixed IT16)) <- op- , (lhs:rhs:_) <- args =- jsPackUBits16 (- JSBinOp ">" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))- )+ , (lhs:rhs:_) <- args = bitsCompareOp ">" lhs rhs | (LGt (ITFixed IT32)) <- op- , (lhs:rhs:_) <- args =- jsPackUBits32 (- JSBinOp ">" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))- )+ , (lhs:rhs:_) <- args = bitsCompareOp ">" lhs rhs | (LGt (ITFixed IT64)) <- op- , (lhs:rhs:_) <- args = invokeMeth lhs "greater" [rhs]+ , (lhs:rhs:_) <- args = JSPreOp "+" $ invokeMeth lhs "greater" [rhs] | (LGe (ITFixed IT8)) <- op- , (lhs:rhs:_) <- args =- jsPackUBits8 (- JSBinOp ">=" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))- )+ , (lhs:rhs:_) <- args = bitsCompareOp ">=" lhs rhs | (LGe (ITFixed IT16)) <- op- , (lhs:rhs:_) <- args =- jsPackUBits16 (- JSBinOp ">=" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))- )+ , (lhs:rhs:_) <- args = bitsCompareOp ">=" lhs rhs | (LGe (ITFixed IT32)) <- op- , (lhs:rhs:_) <- args =- jsPackUBits32 (- JSBinOp ">=" (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))- )+ , (lhs:rhs:_) <- args = bitsCompareOp ">=" lhs rhs | (LGe (ITFixed IT64)) <- op- , (lhs:rhs:_) <- args = invokeMeth lhs "greaterOrEquals" [rhs]+ , (lhs:rhs:_) <- args = JSPreOp "+" $ invokeMeth lhs "greaterOrEquals" [rhs] | (LUDiv (ITFixed IT8)) <- op , (lhs:rhs:_) <- args =@@ -1154,8 +1030,7 @@ jsPackSBits32 $ JSPreOp "~" $ jsUnPackBits (translateReg arg) | (LCompl (ITFixed IT64)) <- op- , (arg:_) <- args =- invokeMeth arg "not" []+ , (arg:_) <- args = invokeMeth arg "not" [] | (LPlus _) <- op , (lhs:rhs:_) <- args = translateBinaryOp "+" lhs rhs@@ -1168,15 +1043,15 @@ | (LSRem _) <- op , (lhs:rhs:_) <- args = translateBinaryOp "%" lhs rhs | (LEq _) <- op- , (lhs:rhs:_) <- args = translateBinaryOp "==" lhs rhs+ , (lhs:rhs:_) <- args = translateCompareOp "==" lhs rhs | (LSLt _) <- op- , (lhs:rhs:_) <- args = translateBinaryOp "<" lhs rhs+ , (lhs:rhs:_) <- args = translateCompareOp "<" lhs rhs | (LSLe _) <- op- , (lhs:rhs:_) <- args = translateBinaryOp "<=" lhs rhs+ , (lhs:rhs:_) <- args = translateCompareOp "<=" lhs rhs | (LSGt _) <- op- , (lhs:rhs:_) <- args = translateBinaryOp ">" lhs rhs+ , (lhs:rhs:_) <- args = translateCompareOp ">" lhs rhs | (LSGe _) <- op- , (lhs:rhs:_) <- args = translateBinaryOp ">=" lhs rhs+ , (lhs:rhs:_) <- args = translateCompareOp ">=" lhs rhs | (LAnd _) <- op , (lhs:rhs:_) <- args = translateBinaryOp "&" lhs rhs | (LOr _) <- op@@ -1193,9 +1068,9 @@ | LStrConcat <- op , (lhs:rhs:_) <- args = translateBinaryOp "+" lhs rhs | LStrEq <- op- , (lhs:rhs:_) <- args = translateBinaryOp "==" lhs rhs+ , (lhs:rhs:_) <- args = translateCompareOp "==" lhs rhs | LStrLt <- op- , (lhs:rhs:_) <- args = translateBinaryOp "<" lhs rhs+ , (lhs:rhs:_) <- args = translateCompareOp "<" lhs rhs | LStrLen <- op , (arg:_) <- args = JSProj (translateReg arg) "length" | (LStrInt ITNative) <- op@@ -1270,13 +1145,28 @@ , (arg:_) <- args = jsCall "i$systemInfo" [translateReg arg] | LExternal nul <- op , nul == sUN "prim__null"- , (_) <- args = JSNull+ , _ <- args = JSNull+ | LExternal ex <- op+ , ex == sUN "prim__eqPtr"+ , [lhs, rhs] <- args = translateCompareOp "==" lhs rhs | otherwise = JSError $ "Not implemented: " ++ show op where translateBinaryOp :: String -> Reg -> Reg -> JS translateBinaryOp op lhs rhs = JSBinOp op (translateReg lhs) (translateReg rhs) + translateCompareOp :: String -> Reg -> Reg -> JS+ translateCompareOp op lhs rhs =+ JSPreOp "+" $ translateBinaryOp op lhs rhs++ bitsBinaryOp :: String -> Reg -> Reg -> JS+ bitsBinaryOp op lhs rhs =+ JSBinOp op (jsUnPackBits (translateReg lhs)) (jsUnPackBits (translateReg rhs))++ bitsCompareOp :: String -> Reg -> Reg -> JS+ bitsCompareOp op lhs rhs =+ JSPreOp "+" $ bitsBinaryOp op lhs rhs+ invokeMeth :: Reg -> String -> [Reg] -> JS invokeMeth obj meth args = JSApp (JSProj (translateReg obj) meth) $ map translateReg args@@ -1331,6 +1221,7 @@ | TAILCALL n <- bc = jsTAILCALL info n | FOREIGNCALL r _ (FStr n) args <- bc = jsFOREIGN info r n (map fcall args)+ | FOREIGNCALL _ _ _ _ <- bc = error "JS FFI call not statically known" | TOPBASE n <- bc = jsTOPBASE info n | BASETOP n <- bc = jsBASETOP info n | STOREOLD <- bc = jsSTOREOLD info
src/IRTS/Compiler.hs view
@@ -60,7 +60,7 @@ maindef <- case mtm of Nothing -> return [] Just tm -> do md <- irMain tm- iLOG $ "MAIN: " ++ show md+ logLvl 1 $ "MAIN: " ++ show md return [(sMN 0 "runMain", md)] objs <- getObjectFiles codegen libs <- getLibs codegen@@ -83,13 +83,13 @@ let (nexttag, tagged) = addTags 65536 (liftAll defsUniq) let ctxtIn = addAlist tagged emptyContext - iLOG "Defunctionalising"+ logLvl 1 "Defunctionalising" let defuns_in = defunctionalise nexttag ctxtIn logLvl 5 $ show defuns_in- iLOG "Inlining"+ logLvl 1 "Inlining" let defuns = inline defuns_in logLvl 5 $ show defuns- iLOG "Resolving variables for CG"+ logLvl 1 "Resolving variables for CG" -- iputStrLn $ showSep "\n" (map show (toAlist defuns)) let checked = simplifyDefs defuns (toAlist defuns) outty <- outputTy@@ -103,7 +103,7 @@ Just f -> runIO $ writeFile f (dumpDefuns defuns) triple <- Idris.AbsSyntax.targetTriple cpu <- Idris.AbsSyntax.targetCPU- iLOG "Building output"+ logLvl 1 "Building output" case checked of OK c -> do return $ CodegenInfo f outty triple cpu hdrs impdirs objs libs flags@@ -120,7 +120,7 @@ where checkMVs = do i <- getIState case map fst (idris_metavars i) \\ primDefs of [] -> return ()- ms -> ifail $ "There are undefined metavariables: " ++ show ms+ ms -> ifail $ "There are undefined holes: " ++ show ms checkTotality = do i <- getIState case idris_totcheckfail i of [] -> return ()@@ -136,7 +136,7 @@ Via "c" -> codegenC ir -- Any external code generator Via cg -> do let cmd = "idris-" ++ cg- args = [mainmod, "-o", outputFile ir]+ args = [mainmod, "-o", outputFile ir] ++ compilerFlags ir exit <- rawSystem cmd args when (exit /= ExitSuccess) $ putStrLn ("FAILURE: " ++ show cmd ++ " " ++ show args)
src/IRTS/JavaScript/AST.hs view
@@ -76,6 +76,7 @@ | JSWhile JS JS | JSFFI String [JS] | JSAnnotation JSAnnotation JS+ | JSDelete JS | JSNoop deriving Eq @@ -129,6 +130,9 @@ `T.append` " */\n" `T.append` compileJS' indent js +compileJS' indent (JSDelete js) =+ "delete " `T.append` compileJS' 0 js+ compileJS' indent (JSFFI raw args) = ffi raw (map (T.unpack . compileJS' indent) args) @@ -190,7 +194,7 @@ `T.append` compileJS' indent rhs compileJS' indent (JSPreOp op val) =- T.pack op `T.append` compileJS' indent val+ T.pack op `T.append` "(" `T.append` compileJS' indent val `T.append` ")" compileJS' indent (JSProj obj field) | JSFunction {} <- obj =
src/Idris/ASTUtils.hs view
@@ -1,4 +1,7 @@-module Idris.ASTUtils where+module Idris.ASTUtils(Field(), cg_usedpos, ctxt_lookup, fgetState, fmodifyState,+ fputState, idris_fixities, ist_callgraph, ist_optimisation,+ known_classes, known_terms, opt_detaggable, opt_inaccessible, + opts_idrisCmdline, repl_definitions) where -- This implements just a few basic lens-like concepts to ease state updates. -- Similar to fclabels in approach, just without the extra dependency.
src/Idris/AbsSyntax.hs view
@@ -16,6 +16,7 @@ import System.Console.Haskeline import System.IO+import System.Directory (canonicalizePath, doesFileExist) import Control.Applicative import Control.Monad (liftM3)@@ -344,7 +345,7 @@ addToCalledG n ns = return () -- TODO push_estack :: Name -> Bool -> Idris ()-push_estack n inst +push_estack n inst = do i <- getIState putIState (i { elab_stack = (n, inst) : elab_stack i }) @@ -400,10 +401,10 @@ addAutoHint n hint = do ist <- getIState case lookupCtxtExact n (idris_autohints ist) of- Nothing -> + Nothing -> do let hs = addDef n [hint] (idris_autohints ist) putIState $ ist { idris_autohints = hs }- Just nhints -> + Just nhints -> do let hs = addDef n (hint : nhints) (idris_autohints ist) putIState $ ist { idris_autohints = hs } @@ -516,14 +517,26 @@ addInternalApp :: FilePath -> Int -> PTerm -> Idris () addInternalApp fp l t = do i <- getIState- putIState (i { idris_lineapps = ((fp, l), t) : idris_lineapps i })+ -- We canonicalise the path to make "./Test/Module.idr" equal+ -- to "Test/Module.idr"+ exists <- runIO $ doesFileExist fp+ when exists $+ do fp' <- runIO $ canonicalizePath fp+ putIState (i { idris_lineapps = ((fp', l), t) : idris_lineapps i }) getInternalApp :: FilePath -> Int -> Idris PTerm getInternalApp fp l = do i <- getIState- case lookup (fp, l) (idris_lineapps i) of- Just n' -> return n'- Nothing -> return Placeholder- -- TODO: What if it's not there?+ -- We canonicalise the path to make+ -- "./Test/Module.idr" equal to+ -- "Test/Module.idr"+ exists <- runIO $ doesFileExist fp+ if exists+ then do fp' <- runIO $ canonicalizePath fp+ case lookup (fp', l) (idris_lineapps i) of+ Just n' -> return n'+ Nothing -> return Placeholder+ -- TODO: What if it's not there?+ else return Placeholder -- Pattern definitions are only used for coverage checking, so erase them -- when we're done@@ -576,7 +589,7 @@ putIState $ i { tt_ctxt = ctxt', idris_constraints = ics } where insertAll [] c = c- insertAll ((c, fc) : cs) ics + insertAll ((c, fc) : cs) ics = insertAll cs $ S.insert (ConstraintFC c fc) ics addDeferred = addDeferred' Ref@@ -584,7 +597,7 @@ -- | Save information about a name that is not yet defined addDeferred' :: NameType- -> [(Name, (Int, Maybe Name, Type, Bool))]+ -> [(Name, (Int, Maybe Name, Type, [Name], Bool))] -- ^ The Name is the name being made into a metavar, -- the Int is the number of vars that are part of a -- putative proof context, the Maybe Name is the@@ -593,10 +606,10 @@ -- allowed -> Idris () addDeferred' nt ns- = do mapM_ (\(n, (i, _, t, _)) -> updateContext (addTyDecl n nt (tidyNames S.empty t))) ns+ = do mapM_ (\(n, (i, _, t, _, _)) -> updateContext (addTyDecl n nt (tidyNames S.empty t))) ns mapM_ (\(n, _) -> when (not (n `elem` primDefs)) $ addIBC (IBCMetavar n)) ns i <- getIState- putIState $ i { idris_metavars = map (\(n, (i, top, _, isTopLevel)) -> (n, (top, i, isTopLevel))) ns +++ putIState $ i { idris_metavars = map (\(n, (i, top, _, ns, isTopLevel)) -> (n, (top, i, ns, isTopLevel))) ns ++ idris_metavars i } where -- 'tidyNames' is to generate user accessible names in case they are@@ -637,7 +650,12 @@ setWidth w = do ist <- getIState put ist { idris_consolewidth = w } +setDepth :: Maybe Int -> Idris ()+setDepth d = do ist <- getIState+ put ist { idris_options = (idris_options ist) { opt_printdepth = d } } +typeDescription :: String+typeDescription = "The type of types" type1Doc :: Doc OutputAnnotation@@ -676,6 +694,11 @@ getCmdLine = do i <- getIState return (opt_cmdline (idris_options i)) +getDumpHighlighting :: Idris Bool+getDumpHighlighting = do ist <- getIState+ return (findC (opt_cmdline (idris_options ist)))+ where findC = elem DumpHighlights+ getDumpDefun :: Idris (Maybe FilePath) getDumpDefun = do i <- getIState return $ findC (opt_cmdline (idris_options i))@@ -767,6 +790,12 @@ let opts = idris_options i return (opt_nobanner opts) +setEvalTypes :: Bool -> Idris ()+setEvalTypes n = do i <- getIState+ let opts = idris_options i+ let opt' = opts { opt_evaltypes = n }+ putIState $ i { idris_options = opt' }+ setQuiet :: Bool -> Idris () setQuiet q = do i <- getIState let opts = idris_options i@@ -928,9 +957,6 @@ cmdOptType x = do i <- getIState return $ x `elem` opt_cmdline (idris_options i) -iLOG :: String -> Idris ()-iLOG = logLvl 1- noErrors :: Idris Bool noErrors = do i <- getIState case errSpan i of@@ -978,15 +1004,15 @@ PLet fc n' nfc (en ty) (en v) (en (shadow n n' s)) | otherwise = PLet fc n nfc (en ty) (en v) (en s) -- FIXME: Should only do this in a type signature!- en (PDPair f p (PRef f' n) t r)+ en (PDPair f hls p (PRef f' fcs n) t r) | n `elem` (map fst ps ++ ns) && t /= Placeholder = let n' = mkShadow n in- PDPair f p (PRef f' n') (en t) (en (shadow n n' r))+ PDPair f hls p (PRef f' fcs n') (en t) (en (shadow n n' r)) en (PRewrite f l r g) = PRewrite f (en l) (en r) (fmap en g) en (PTyped l r) = PTyped (en l) (en r)- en (PPair f p l r) = PPair f p (en l) (en r)- en (PDPair f p l t r) = PDPair f p (en l) (en t) (en r)- en (PAlternative a as) = PAlternative a (map en as)+ en (PPair f hls p l r) = PPair f hls p (en l) (en r)+ en (PDPair f hls p l t r) = PDPair f hls p (en l) (en t) (en r)+ en (PAlternative ns a as) = PAlternative ns a (map en as) en (PHidden t) = PHidden (en t) en (PUnifyLog t) = PUnifyLog (en t) en (PDisamb ds t) = PDisamb ds (en t)@@ -997,32 +1023,33 @@ en (PQuote (Var n)) | n `nselem` ns = PQuote (Var (dec n))- en (PApp fc (PInferRef fc' n) as)- | n `nselem` ns = PApp fc (PInferRef fc' (dec n))- (map (pexp . (PRef fc)) (map fst ps) ++ (map (fmap en) as))- en (PApp fc (PRef fc' n) as)- | n `elem` infs = PApp fc (PInferRef fc' (dec n))- (map (pexp . (PRef fc)) (map fst ps) ++ (map (fmap en) as))- | n `nselem` ns = PApp fc (PRef fc' (dec n))- (map (pexp . (PRef fc)) (map fst ps) ++ (map (fmap en) as))- en (PAppBind fc (PRef fc' n) as)- | n `elem` infs = PAppBind fc (PInferRef fc' (dec n))- (map (pexp . (PRef fc)) (map fst ps) ++ (map (fmap en) as))- | n `nselem` ns = PAppBind fc (PRef fc' (dec n))- (map (pexp . (PRef fc)) (map fst ps) ++ (map (fmap en) as))- en (PRef fc n)- | n `elem` infs = PApp fc (PInferRef fc (dec n))- (map (pexp . (PRef fc)) (map fst ps))- | n `nselem` ns = PApp fc (PRef fc (dec n))- (map (pexp . (PRef fc)) (map fst ps))- en (PInferRef fc n)- | n `nselem` ns = PApp fc (PInferRef fc (dec n))- (map (pexp . (PRef fc)) (map fst ps))+ en (PApp fc (PInferRef fc' hl n) as)+ | n `nselem` ns = PApp fc (PInferRef fc' hl (dec n))+ (map (pexp . (PRef fc hl)) (map fst ps) ++ (map (fmap en) as))+ en (PApp fc (PRef fc' hl n) as)+ | n `elem` infs = PApp fc (PInferRef fc' hl (dec n))+ (map (pexp . (PRef fc hl)) (map fst ps) ++ (map (fmap en) as))+ | n `nselem` ns = PApp fc (PRef fc' hl (dec n))+ (map (pexp . (PRef fc hl)) (map fst ps) ++ (map (fmap en) as))+ en (PAppBind fc (PRef fc' hl n) as)+ | n `elem` infs = PAppBind fc (PInferRef fc' hl (dec n))+ (map (pexp . (PRef fc hl)) (map fst ps) ++ (map (fmap en) as))+ | n `nselem` ns = PAppBind fc (PRef fc' hl (dec n))+ (map (pexp . (PRef fc hl)) (map fst ps) ++ (map (fmap en) as))+ en (PRef fc hl n)+ | n `elem` infs = PApp fc (PInferRef fc hl (dec n))+ (map (pexp . (PRef fc hl)) (map fst ps))+ | n `nselem` ns = PApp fc (PRef fc hl (dec n))+ (map (pexp . (PRef fc hl)) (map fst ps))+ en (PInferRef fc hl n)+ | n `nselem` ns = PApp fc (PInferRef fc hl (dec n))+ (map (pexp . (PRef fc hl)) (map fst ps)) en (PApp fc f as) = PApp fc (en f) (map (fmap en) as) en (PAppBind fc f as) = PAppBind fc (en f) (map (fmap en) as) en (PCase fc c os) = PCase fc (en c) (map (pmap en) os) en (PIfThenElse fc c t f) = PIfThenElse fc (en c) (en t) (en f)- en (PRunElab fc tm) = PRunElab fc (en tm)+ en (PRunElab fc tm ns) = PRunElab fc (en tm) ns+ en (PConstSugar fc tm) = PConstSugar fc (en tm) en t = t nselem x [] = False@@ -1043,13 +1070,13 @@ PTy doc argdocs syn fc o (dec n) nfc (piBindp expl_param ps (expandParams dec ps ns [] ty)) else --trace (show (n, expandParams dec ps ns ty)) $ PTy doc argdocs syn fc o n nfc (expandParams dec ps ns [] ty)-expandParamsD rhsonly ist dec ps ns (PPostulate e doc syn fc o n ty)+expandParamsD rhsonly ist dec ps ns (PPostulate e doc syn fc nfc o n ty) = if n `elem` ns && (not rhsonly) then -- trace (show (n, expandParams dec ps ns ty)) $- PPostulate e doc syn fc o (dec n) (piBind ps- (expandParams dec ps ns [] ty))+ PPostulate e doc syn fc nfc o (dec n)+ (piBind ps (expandParams dec ps ns [] ty)) else --trace (show (n, expandParams dec ps ns ty)) $- PPostulate e doc syn fc o n (expandParams dec ps ns [] ty)+ PPostulate e doc syn fc nfc o n (expandParams dec ps ns [] ty) expandParamsD rhsonly ist dec ps ns (PClauses fc opts n cs) = let n' = if n `elem` ns then dec n else n in PClauses fc opts n' (map expandParamsC cs)@@ -1083,10 +1110,10 @@ removeBound lhs ns = ns \\ nub (bnames lhs) - bnames (PRef _ n) = [n]+ bnames (PRef _ _ n) = [n] bnames (PApp _ _ args) = concatMap bnames (map getTm args)- bnames (PPair _ _ l r) = bnames l ++ bnames r- bnames (PDPair _ _ l Placeholder r) = bnames l ++ bnames r+ bnames (PPair _ _ _ l r) = bnames l ++ bnames r+ bnames (PDPair _ _ _ l Placeholder r) = bnames l ++ bnames r bnames _ = [] -- | Expands parameters defined in parameter and where blocks inside of declarations@@ -1142,7 +1169,7 @@ getPriority :: IState -> PTerm -> Int getPriority i tm = 1 -- pri tm where- pri (PRef _ n) =+ pri (PRef _ _ n) = case lookupP n (tt_ctxt i) of ((P (DCon _ _ _) _ _):_) -> 1 ((P (TCon _ _) _ _):_) -> 1@@ -1155,9 +1182,9 @@ pri (PAppBind _ f as) = max 1 (max (pri f) (foldr max 0 (map (pri.getTm) as))) pri (PCase _ f as) = max 1 (max (pri f) (foldr max 0 (map (pri.snd) as))) pri (PTyped l r) = pri l- pri (PPair _ _ l r) = max 1 (max (pri l) (pri r))- pri (PDPair _ _ l t r) = max 1 (max (pri l) (max (pri t) (pri r)))- pri (PAlternative a as) = maximum (map pri as)+ pri (PPair _ _ _ l r) = max 1 (max (pri l) (pri r))+ pri (PDPair _ _ _ l t r) = max 1 (max (pri l) (max (pri t) (pri r)))+ pri (PAlternative _ a as) = maximum (map pri as) pri (PConstant _ _) = 0 pri Placeholder = 1 pri _ = 3@@ -1268,20 +1295,20 @@ (mkConst c args) (doAdd cs ns t) | otherwise = doAdd cs ns t - mkConst c args = PApp fc (PRef fc c)- (map (\n -> PExp 0 [] (sMN 0 "carg") (PRef fc n)) args)+ mkConst c args = PApp fc (PRef fc [] c)+ (map (\n -> PExp 0 [] (sMN 0 "carg") (PRef fc [] n)) args) getConstraints (PPi (Constraint _ _) _ _ c sc) = getcapp c ++ getConstraints sc getConstraints (PPi _ _ _ c sc) = getConstraints sc getConstraints _ = [] - getcapp (PApp _ (PRef _ c) args)+ getcapp (PApp _ (PRef _ _ c) args) = do ns <- mapM getName args return (UConstraint c ns) getcapp _ = [] - getName (PExp _ _ _ (PRef _ n)) = return n+ getName (PExp _ _ _ (PRef _ _ n)) = return n getName _ = [] -- Add implicit bindings from using block, and bind any missing names@@ -1318,7 +1345,7 @@ bindFree (n:ns) tm | elem n (map iname uimpls) = bindFree ns tm | otherwise- = PPi (Imp [] Dynamic False Nothing) n NoFC Placeholder (bindFree ns tm)+ = PPi (Imp [InaccessibleArg] Dynamic False Nothing) n NoFC Placeholder (bindFree ns tm) getArgnames (PPi _ n _ c sc) = n : getArgnames sc@@ -1358,8 +1385,9 @@ -- argument position. -- This has become a right mess already. Better redo it some time...--- TODO: This is obsoleted by the new way of elaborating types, but there's still--- a couple of places which use it. Clean them up!+-- TODO: This is obsoleted by the new way of elaborating types, (which+-- calls addUsingImpls) but there's still a couple of places which use+-- it. Clean them up! -- -- Issue 1739 in the issue tracker -- https://github.com/idris-lang/Idris-dev/issues/1739@@ -1437,7 +1465,7 @@ imps True (n:env) sc imps top env (PPi (Exp l _ _) n _ ty sc) = do let isn = nub (implNamesIn uvars ty ++ case sc of- (PRef _ x) -> namesIn uvars ist sc `dropAll` [n]+ (PRef _ _ x) -> namesIn uvars ist sc `dropAll` [n] _ -> []) (decls, ns) <- get -- ignore decls in HO types put (PExp (getPriority ist ty) l n Placeholder : decls,@@ -1445,7 +1473,7 @@ imps True (n:env) sc imps top env (PPi (Constraint l _) n _ ty sc) = do let isn = nub (implNamesIn uvars ty ++ case sc of- (PRef _ x) -> namesIn uvars ist sc `dropAll` [n]+ (PRef _ _ x) -> namesIn uvars ist sc `dropAll` [n] _ -> []) (decls, ns) <- get -- ignore decls in HO types put (PConstraint 10 l n Placeholder : decls,@@ -1453,7 +1481,7 @@ imps True (n:env) sc imps top env (PPi (TacImp l _ scr) n _ ty sc) = do let isn = nub (implNamesIn uvars ty ++ case sc of- (PRef _ x) -> namesIn uvars ist sc `dropAll` [n]+ (PRef _ _ x) -> namesIn uvars ist sc `dropAll` [n] _ -> []) (decls, ns) <- get -- ignore decls in HO types put (PTacImplicit 10 l n scr Placeholder : decls,@@ -1465,20 +1493,20 @@ put (decls, nub (ns ++ (isn `dropAll` (env ++ map fst (getImps decls))))) imps top env (PTyped l r) = imps top env l- imps top env (PPair _ _ l r)+ imps top env (PPair _ _ _ l r) = do (decls, ns) <- get let isn = namesIn uvars ist l ++ namesIn uvars ist r put (decls, nub (ns ++ (isn `dropAll` (env ++ map fst (getImps decls)))))- imps top env (PDPair _ _ (PRef _ n) t r)+ imps top env (PDPair _ _ _ (PRef _ _ n) t r) = do (decls, ns) <- get let isn = nub (namesIn uvars ist t ++ namesIn uvars ist r) \\ [n] put (decls, nub (ns ++ (isn \\ (env ++ map fst (getImps decls)))))- imps top env (PDPair _ _ l t r)+ imps top env (PDPair _ _ _ l t r) = do (decls, ns) <- get let isn = namesIn uvars ist l ++ namesIn uvars ist t ++ namesIn uvars ist r put (decls, nub (ns ++ (isn \\ (env ++ map fst (getImps decls)))))- imps top env (PAlternative a as)+ imps top env (PAlternative ms a as) = do (decls, ns) <- get let isn = concatMap (namesIn uvars ist) as put (decls, nub (ns ++ (isn `dropAll` (env ++ map fst (getImps decls)))))@@ -1488,15 +1516,17 @@ imps top env (PHidden tm) = imps False env tm imps top env (PUnifyLog tm) = imps False env tm imps top env (PNoImplicits tm) = imps False env tm- imps top env (PRunElab fc tm) = imps False env tm+ imps top env (PRunElab fc tm ns) = imps False env tm+ imps top env (PConstSugar fc tm) = imps top env tm -- ignore PConstSugar - it's for highlighting only! imps top env _ = return () pibind using [] sc = sc pibind using (n:ns) sc = case lookup n using of- Just ty -> PPi (Imp [] Dynamic False Nothing) n NoFC ty (pibind using ns sc)- Nothing -> PPi (Imp [] Dynamic False Nothing) n NoFC Placeholder- (pibind using ns sc)+ Just ty -> PPi (Imp [] Dynamic False Nothing)+ n NoFC ty (pibind using ns sc)+ Nothing -> PPi (Imp [InaccessibleArg] Dynamic False Nothing)+ n NoFC Placeholder (pibind using ns sc) -- Add implicit arguments in function calls addImplPat :: IState -> PTerm -> PTerm@@ -1520,13 +1550,13 @@ addImpl' :: Bool -> [Name] -> [Name] -> [Name] -> IState -> PTerm -> PTerm addImpl' inpat env infns imp_meths ist ptm- = mkUniqueNames env (ai False (zip env (repeat Nothing)) [] ptm)+ = mkUniqueNames env [] (ai False (zip env (repeat Nothing)) [] ptm) where ai :: Bool -> [(Name, Maybe PTerm)] -> [[T.Text]] -> PTerm -> PTerm- ai qq env ds (PRef fc f)- | f `elem` infns = PInferRef fc f+ ai qq env ds (PRef fc fcs f)+ | f `elem` infns = PInferRef fc fcs f | not (f `elem` map fst env) = handleErr $ aiFn inpat inpat qq imp_meths ist fc f fc ds []- ai qq env ds (PHidden (PRef fc f))+ ai qq env ds (PHidden (PRef fc hl f)) | not (f `elem` map fst env) = PHidden (handleErr $ aiFn inpat False qq imp_meths ist fc f fc ds []) ai qq env ds (PRewrite fc l r g) = let l' = ai qq env ds l@@ -1537,24 +1567,24 @@ = let l' = ai qq env ds l r' = ai qq env ds r in PTyped l' r'- ai qq env ds (PPair fc p l r)+ ai qq env ds (PPair fc hls p l r) = let l' = ai qq env ds l r' = ai qq env ds r in- PPair fc p l' r'- ai qq env ds (PDPair fc p l t r)+ PPair fc hls p l' r'+ ai qq env ds (PDPair fc hls p l t r) = let l' = ai qq env ds l t' = ai qq env ds t r' = ai qq env ds r in- PDPair fc p l' t' r'- ai qq env ds (PAlternative a as)+ PDPair fc hls p l' t' r'+ ai qq env ds (PAlternative ms a as) = let as' = map (ai qq env ds) as in- PAlternative a as'+ PAlternative ms a as' ai qq env _ (PDisamb ds' as) = ai qq env ds' as- ai qq env ds (PApp fc (PInferRef ffc f) as)+ ai qq env ds (PApp fc (PInferRef ffc hl f) as) = let as' = map (fmap (ai qq env ds)) as in- PApp fc (PInferRef ffc f) as'- ai qq env ds (PApp fc ftm@(PRef ffc f) as)- | f `elem` infns = ai qq env ds (PApp fc (PInferRef ffc f) as)+ PApp fc (PInferRef ffc hl f) as'+ ai qq env ds (PApp fc ftm@(PRef ffc hl f) as)+ | f `elem` infns = ai qq env ds (PApp fc (PInferRef ffc hl f) as) | not (f `elem` map fst env) = let as' = map (fmap (ai qq env ds)) as in handleErr $ aiFn inpat False qq imp_meths ist fc f ffc ds as'@@ -1586,15 +1616,16 @@ sc' = ai qq ((n, Just ty):env) ds sc in PLam fc n nfc ty' sc' _ -> ai qq env ds (PLam fc (sMN 0 "lamp") NoFC ty- (PCase fc (PRef fc (sMN 0 "lamp") )- [(PRef fc n, sc)]))+ (PCase fc (PRef fc [] (sMN 0 "lamp") )+ [(PRef fc [] n, sc)])) ai qq env ds (PLet fc n nfc ty val sc) = case lookupDef n (tt_ctxt ist) of [] -> let ty' = ai qq env ds ty val' = ai qq env ds val sc' = ai qq ((n, Just ty):env) ds sc in PLet fc n nfc ty' val' sc'- _ -> ai qq env ds (PCase fc val [(PRef fc n, sc)])+ defs ->+ ai qq env ds (PCase fc val [(PRef fc [] n, sc)]) ai qq env ds (PPi p n nfc ty sc) = let ty' = ai qq env ds ty env' = if n `elem` imp_meths then env@@ -1613,7 +1644,8 @@ ai qq env ds (PQuasiquote tm g) = PQuasiquote (ai True env ds tm) (fmap (ai True env ds) g) ai qq env ds (PUnquote tm) = PUnquote (ai False env ds tm)- ai qq env ds (PRunElab fc tm) = PRunElab fc (ai False env ds tm)+ ai qq env ds (PRunElab fc tm ns) = PRunElab fc (ai False env ds tm) ns+ ai qq env ds (PConstSugar fc tm) = PConstSugar fc (ai qq env ds tm) ai qq env ds tm = tm handleErr (Left err) = PElabError err@@ -1652,7 +1684,7 @@ vname _ = False aiFn inpat expat qq imp_meths ist fc f ffc ds as- | f `elem` primNames = Right $ PApp fc (PRef ffc f) as+ | f `elem` primNames = Right $ PApp fc (PRef ffc [ffc] f) as aiFn inpat expat qq imp_meths ist fc f ffc ds as -- This is where namespaces get resolved by adding PAlternative = do let ns = lookupCtxtName f (idris_implicits ist)@@ -1661,13 +1693,13 @@ [] -> nh x -> x case ns' of- [(f',ns)] -> Right $ mkPApp fc (length ns) (PRef ffc (isImpName f f')) (insertImpl ns as)+ [(f',ns)] -> Right $ mkPApp fc (length ns) (PRef ffc [ffc] (isImpName f f')) (insertImpl ns as) [] -> if f `elem` (map fst (idris_metavars ist))- then Right $ PApp fc (PRef ffc f) as- else Right $ mkPApp fc (length as) (PRef ffc f) as+ then Right $ PApp fc (PRef ffc [ffc] f) as+ else Right $ mkPApp fc (length as) (PRef ffc [ffc] f) as alts -> Right $- PAlternative (ExactlyOne True) $- map (\(f', ns) -> mkPApp fc (length ns) (PRef ffc (isImpName f f'))+ PAlternative [] (ExactlyOne True) $+ map (\(f', ns) -> mkPApp fc (length ns) (PRef ffc [ffc] (isImpName f f')) (insertImpl ns as)) alts where -- if the name is in imp_meths, we should actually refer to the bound@@ -1694,9 +1726,9 @@ insertImpl :: [PArg] -- ^ expected argument types (from idris_implicits) -> [PArg] -- ^ given arguments -> [PArg]- insertImpl ps as + insertImpl ps as = let (as', badimpls) = partition (impIn ps) as in- map addUnknownImp badimpls ++ + map addUnknownImp badimpls ++ insImpAcc M.empty ps (filter expArg as') (filter (not . expArg) as') insImpAcc :: M.Map Name PTerm -- accumulated param names & arg terms@@ -1715,7 +1747,7 @@ case find n imps [] of Just (tm, imps') -> PImp p False l n tm : insImpAcc (M.insert n tm pnas) ps given imps'- Nothing -> let ph = if f `elem` imp_meths then PRef fc n else Placeholder in+ Nothing -> let ph = if f `elem` imp_meths then PRef fc [] n else Placeholder in PImp p True l n ph : insImpAcc (M.insert n ph pnas) ps given imps insImpAcc pnas (PTacImplicit p l n sc' ty : ps) given imps =@@ -1741,7 +1773,7 @@ find n (PTacImplicit _ _ n' _ t : gs) acc | n == n' = Just (t, reverse acc ++ gs) find n (g : gs) acc = find n gs (g : acc)- + -- return True if the second argument is an implicit argument which is -- expected in the implicits, or if it's not an implicit impIn :: [PArg] -> PArg -> Bool@@ -1758,14 +1790,14 @@ stripLinear :: IState -> PTerm -> PTerm stripLinear i tm = evalState (sl tm) [] where sl :: PTerm -> State [Name] PTerm- sl (PRef fc f)+ sl (PRef fc hl f) | (_:_) <- lookupTy f (tt_ctxt i)- = return $ PRef fc f+ = return $ PRef fc hl f | otherwise = do ns <- get if (f `elem` ns)- then return $ PHidden (PRef fc f) -- Placeholder+ then return $ PHidden (PRef fc hl f) -- Placeholder else do put (f : ns)- return (PRef fc f)+ return (PRef fc hl f) sl (PPatvar fc f) = do ns <- get if (f `elem` ns)@@ -1773,22 +1805,22 @@ else do put (f : ns) return (PPatvar fc f) -- Assumption is that variables are all the same in each alternative- sl t@(PAlternative b as) = do ns <- get- as' <- slAlts ns as- return (PAlternative b as')+ sl t@(PAlternative ms b as) = do ns <- get+ as' <- slAlts ns as+ return (PAlternative ms b as') where slAlts ns (a : as) = do put ns a' <- sl a as' <- slAlts ns as return (a' : as') slAlts ns [] = return []- sl (PPair fc p l r) = do l' <- sl l; r' <- sl r; return (PPair fc p l' r')- sl (PDPair fc p l t r) = do l' <- sl l- t' <- sl t- r' <- sl r- return (PDPair fc p l' t' r')+ sl (PPair fc hls p l r) = do l' <- sl l; r' <- sl r; return (PPair fc hls p l' r')+ sl (PDPair fc hls p l t r) = do l' <- sl l+ t' <- sl t+ r' <- sl r+ return (PDPair fc hls p l' t' r') sl (PApp fc fn args) = do fn' <- case fn of -- Just the args, fn isn't matchable as a var- PRef _ _ -> return fn+ PRef _ _ _ -> return fn t -> sl t args' <- mapM slA args return $ PApp fc fn' args'@@ -1810,10 +1842,14 @@ stripUnmatchable :: IState -> PTerm -> PTerm stripUnmatchable i (PApp fc fn args) = PApp fc fn (fmap (fmap su) args) where su :: PTerm -> PTerm- su (PRef fc f)+ su tm@(PRef fc hl f) | (Bind n (Pi _ t _) sc :_) <- lookupTy f (tt_ctxt i) = Placeholder- su (PApp fc f@(PRef _ fn) args)+ | (TType _ : _) <- lookupTy f (tt_ctxt i)+ = PHidden tm+ | (UType _ : _) <- lookupTy f (tt_ctxt i)+ = PHidden tm+ su (PApp fc f@(PRef _ _ fn) args) -- here we use canBeDConName because the impossible pattern -- check will not necessarily fully resolve constructor names, -- and these bare names will otherwise get in the way of@@ -1822,14 +1858,15 @@ = PApp fc f (fmap (fmap su) args) su (PApp fc f args) = PHidden (PApp fc f args)- su (PAlternative b alts)+ su (PAlternative ms b alts) = let alts' = filter (/= Placeholder) (map su alts) in if null alts' then Placeholder- else PAlternative b alts'- su (PPair fc p l r) = PPair fc p (su l) (su r)- su (PDPair fc p l t r) = PDPair fc p (su l) (su t) (su r)+ else PAlternative ms b alts'+ su (PPair fc hls p l r) = PPair fc hls p (su l) (su r)+ su (PDPair fc hls p l t r) = PDPair fc hls p (su l) (su t) (su r) su t@(PLam fc _ _ _ _) = PHidden t su t@(PPi _ _ _ _ _) = PHidden t+ su t@(PConstant _ c) | isTypeConst c = PHidden t su t = t ctxt = tt_ctxt i@@ -1850,9 +1887,8 @@ -- FIXME: It's possible that this really has to happen after elaboration findStatics :: IState -> PTerm -> (PTerm, [Bool])-findStatics ist tm = trace (show tm) $- let (ns, ss) = fs tm in- runState (pos ns ss tm) []+findStatics ist tm = let (ns, ss) = fs tm+ in runState (pos ns ss tm) [] where fs (PPi p n fc t sc) | Static <- pstatic p = let (ns, ss) = fs sc in@@ -1903,24 +1939,24 @@ fullApp x = x match' x y = match (fullApp x) (fullApp y)- match (PApp _ (PRef _ (NS (UN fi) [b])) [_,_,x]) x'+ match (PApp _ (PRef _ _ (NS (UN fi) [b])) [_,_,x]) x' | fi == txt "fromInteger" && b == txt "builtins", PConstant _ (I _) <- getTm x = match (getTm x) x'- match x' (PApp _ (PRef _ (NS (UN fi) [b])) [_,_,x])+ match x' (PApp _ (PRef _ _ (NS (UN fi) [b])) [_,_,x]) | fi == txt "fromInteger" && b == txt "builtins", PConstant _ (I _) <- getTm x = match (getTm x) x'- match (PApp _ (PRef _ (UN l)) [_,x]) x' | l == txt "lazy" = match (getTm x) x'- match x (PApp _ (PRef _ (UN l)) [_,x']) | l == txt "lazy" = match x (getTm x')+ match (PApp _ (PRef _ _ (UN l)) [_,x]) x' | l == txt "lazy" = match (getTm x) x'+ match x (PApp _ (PRef _ _ (UN l)) [_,x']) | l == txt "lazy" = match x (getTm x') match (PApp _ f args) (PApp _ f' args') | length args == length args' = do mf <- match' f f' ms <- zipWithM matchArg args args' return (mf ++ concat ms)- match (PRef f n) (PApp _ x []) = match (PRef f n) x- match (PPatvar f n) xr = match (PRef f n) xr- match xr (PPatvar f n) = match xr (PRef f n)- match (PApp _ x []) (PRef f n) = match x (PRef f n)- match (PRef _ n) tm@(PRef _ n')+ match (PRef f hl n) (PApp _ x []) = match (PRef f hl n) x+ match (PPatvar f n) xr = match (PRef f [f] n) xr+ match xr (PPatvar f n) = match xr (PRef f [f] n)+ match (PApp _ x []) (PRef f hl n) = match x (PRef f hl n)+ match (PRef _ _ n) tm@(PRef _ _ n') | n == n' && not names && (not (isConName n (tt_ctxt i) || isFnName n (tt_ctxt i)) || tm == Placeholder)@@ -1929,7 +1965,7 @@ | n == n' || n == dropNS n' || dropNS n == n' = return [] where dropNS (NS n _) = n dropNS n = n- match (PRef _ n) tm+ match (PRef _ _ n) tm | not names && (not (isConName n (tt_ctxt i) || isFnName n (tt_ctxt i)) || tm == Placeholder) = return [(n, tm)]@@ -1942,24 +1978,24 @@ return (ml ++ mr) match (PTyped l r) x = match l x match x (PTyped l r) = match x l- match (PPair _ _ l r) (PPair _ _ l' r') = do ml <- match' l l'- mr <- match' r r'- return (ml ++ mr)- match (PDPair _ _ l t r) (PDPair _ _ l' t' r') = do ml <- match' l l'- mt <- match' t t'- mr <- match' r r'- return (ml ++ mt ++ mr)- match (PAlternative a as) (PAlternative a' as')+ match (PPair _ _ _ l r) (PPair _ _ _ l' r') = do ml <- match' l l'+ mr <- match' r r'+ return (ml ++ mr)+ match (PDPair _ _ _ l t r) (PDPair _ _ _ l' t' r') = do ml <- match' l l'+ mt <- match' t t'+ mr <- match' r r'+ return (ml ++ mt ++ mr)+ match (PAlternative _ a as) (PAlternative _ a' as') = do ms <- zipWithM match' as as' return (concat ms)- match a@(PAlternative _ as) b+ match a@(PAlternative _ _ as) b = do let ms = zipWith match' as (repeat b) case (rights (map toEither ms)) of (x: _) -> return x _ -> LeftErr (a, b) match (PCase _ _ _) _ = return [] -- lifted out match (PMetavar _ _) _ = return [] -- modified- match (PInferRef _ _) _ = return [] -- modified+ match (PInferRef _ _ _) _ = return [] -- modified match (PQuote _) _ = return [] match (PProof _) _ = return [] match (PTactics _) _ = return []@@ -2017,13 +2053,13 @@ substMatchShadow :: Name -> [Name] -> PTerm -> PTerm -> PTerm substMatchShadow n shs tm t = sm shs t where- sm xs (PRef _ n') | n == n' = tm+ sm xs (PRef _ _ n') | n == n' = tm sm xs (PLam fc x xfc t sc) = PLam fc x xfc (sm xs t) (sm xs sc) sm xs (PPi p x fc t sc) | x `elem` xs = let x' = nextName x in- PPi p x' fc (sm (x':xs) (substMatch x (PRef emptyFC x') t))- (sm (x':xs) (substMatch x (PRef emptyFC x') sc))+ PPi p x' fc (sm (x':xs) (substMatch x (PRef emptyFC [] x') t))+ (sm (x':xs) (substMatch x (PRef emptyFC [] x') sc)) | otherwise = PPi p x fc (sm xs t) (sm (x : xs) sc) sm xs (PApp f x as) = fullApp $ PApp f (sm xs x) (map (fmap (sm xs)) as) sm xs (PCase f x as) = PCase f (sm xs x) (map (pmap (sm xs)) as)@@ -2031,13 +2067,14 @@ sm xs (PRewrite f x y tm) = PRewrite f (sm xs x) (sm xs y) (fmap (sm xs) tm) sm xs (PTyped x y) = PTyped (sm xs x) (sm xs y)- sm xs (PPair f p x y) = PPair f p (sm xs x) (sm xs y)- sm xs (PDPair f p x t y) = PDPair f p (sm xs x) (sm xs t) (sm xs y)- sm xs (PAlternative a as) = PAlternative a (map (sm xs) as)+ sm xs (PPair f hls p x y) = PPair f hls p (sm xs x) (sm xs y)+ sm xs (PDPair f hls p x t y) = PDPair f hls p (sm xs x) (sm xs t) (sm xs y)+ sm xs (PAlternative ms a as) = PAlternative ms a (map (sm xs) as) sm xs (PHidden x) = PHidden (sm xs x) sm xs (PUnifyLog x) = PUnifyLog (sm xs x) sm xs (PNoImplicits x) = PNoImplicits (sm xs x)- sm xs (PRunElab fc script) = PRunElab fc (sm xs script)+ sm xs (PRunElab fc script ns) = PRunElab fc (sm xs script) ns+ sm xs (PConstSugar fc tm) = PConstSugar fc (sm xs tm) sm xs x = x fullApp (PApp _ (PApp fc f args) xs) = fullApp (PApp fc f (args ++ xs))@@ -2045,7 +2082,7 @@ shadow :: Name -> Name -> PTerm -> PTerm shadow n n' t = sm t where- sm (PRef fc x) | n == x = PRef fc n'+ sm (PRef fc hl x) | n == x = PRef fc hl n' sm (PLam fc x xfc t sc) | n /= x = PLam fc x xfc (sm t) (sm sc) | otherwise = PLam fc x xfc (sm t) sc sm (PPi p x fc t sc) | n /= x = PPi p x fc (sm t) (sm sc)@@ -2058,9 +2095,9 @@ sm (PIfThenElse fc c t f) = PIfThenElse fc (sm c) (sm t) (sm f) sm (PRewrite f x y tm) = PRewrite f (sm x) (sm y) (fmap sm tm) sm (PTyped x y) = PTyped (sm x) (sm y)- sm (PPair f p x y) = PPair f p (sm x) (sm y)- sm (PDPair f p x t y) = PDPair f p (sm x) (sm t) (sm y)- sm (PAlternative a as) = PAlternative a (map sm as)+ sm (PPair f hls p x y) = PPair f hls p (sm x) (sm y)+ sm (PDPair f hls p x t y) = PDPair f hls p (sm x) (sm t) (sm y)+ sm (PAlternative ms a as) = PAlternative ms a (map sm as) sm (PTactics ts) = PTactics (map (fmap sm) ts) sm (PProof ts) = PProof (map (fmap sm) ts) sm (PHidden x) = PHidden (sm x)@@ -2068,16 +2105,19 @@ sm (PNoImplicits x) = PNoImplicits (sm x) sm x = x --- Rename any binders which are repeated (so that we don't have to mess+-- | Rename any binders which are repeated (so that we don't have to mess -- about with shadowing anywhere else).+mkUniqueNames :: [Name] -> [(Name, Name)] -> PTerm -> PTerm+mkUniqueNames env shadows tm + = evalState (mkUniq initMap tm) (S.fromList env) where -mkUniqueNames :: [Name] -> PTerm -> PTerm-mkUniqueNames env tm = evalState (mkUniq tm) (S.fromList env) where+ initMap = M.fromList shadows+ inScope :: S.Set Name inScope = S.fromList $ boundNamesIn tm - mkUniqA arg = do t' <- mkUniq (getTm arg)- return (arg { getTm = t' })+ mkUniqA nmap arg = do t' <- mkUniq nmap (getTm arg)+ return (arg { getTm = t' }) -- Initialise the unique name with the environment length (so we're not -- looking for too long...)@@ -2087,84 +2127,95 @@ -- FIXME: Probably ought to do this for completeness! It's fine as -- long as there are no bindings inside tactics though.- mkUniqT tac = return tac+ mkUniqT nmap tac = return tac - mkUniq :: PTerm -> State (S.Set Name) PTerm- mkUniq (PLam fc n nfc ty sc)+ mkUniq :: M.Map Name Name -> PTerm -> State (S.Set Name) PTerm+ mkUniq nmap (PLam fc n nfc ty sc) = do env <- get (n', sc') <- if n `S.member` env then do let n' = uniqueNameSet (initN n (S.size env)) (S.union env inScope)- return (n', shadow n n' sc)+ return (n', sc) -- shadow n n' sc) else return (n, sc) put (S.insert n' env)- ty' <- mkUniq ty- sc'' <- mkUniq sc'+ let nmap' = M.insert n n' nmap+ ty' <- mkUniq nmap ty+ sc'' <- mkUniq nmap' sc' return $! PLam fc n' nfc ty' sc''- mkUniq (PPi p n fc ty sc)+ mkUniq nmap (PPi p n fc ty sc) = do env <- get (n', sc') <- if n `S.member` env then do let n' = uniqueNameSet (initN n (S.size env)) (S.union env inScope)- return (n', shadow n n' sc)+ return (n', sc) -- shadow n n' sc) else return (n, sc) put (S.insert n' env)- ty' <- mkUniq ty- sc'' <- mkUniq sc'+ let nmap' = M.insert n n' nmap+ ty' <- mkUniq nmap ty+ sc'' <- mkUniq nmap' sc' return $! PPi p n' fc ty' sc''- mkUniq (PLet fc n nfc ty val sc)+ mkUniq nmap (PLet fc n nfc ty val sc) = do env <- get (n', sc') <- if n `S.member` env then do let n' = uniqueNameSet (initN n (S.size env)) (S.union env inScope)- return (n', shadow n n' sc)+ return (n', sc) -- shadow n n' sc) else return (n, sc) put (S.insert n' env)- ty' <- mkUniq ty; val' <- mkUniq val- sc'' <- mkUniq sc'+ let nmap' = M.insert n n' nmap+ ty' <- mkUniq nmap ty; val' <- mkUniq nmap val+ sc'' <- mkUniq nmap' sc' return $! PLet fc n' nfc ty' val' sc''- mkUniq (PApp fc t args)- = do t' <- mkUniq t- args' <- mapM mkUniqA args+ mkUniq nmap (PApp fc t args)+ = do t' <- mkUniq nmap t+ args' <- mapM (mkUniqA nmap) args return $! PApp fc t' args'- mkUniq (PAppBind fc t args)- = do t' <- mkUniq t- args' <- mapM mkUniqA args+ mkUniq nmap (PAppBind fc t args)+ = do t' <- mkUniq nmap t+ args' <- mapM (mkUniqA nmap) args return $! PAppBind fc t' args'- mkUniq (PCase fc t alts)- = do t' <- mkUniq t- alts' <- mapM (\(x,y)-> do x' <- mkUniq x; y' <- mkUniq y+ mkUniq nmap (PCase fc t alts)+ = do t' <- mkUniq nmap t+ alts' <- mapM (\(x,y)-> do x' <- mkUniq nmap x; y' <- mkUniq nmap y return (x', y')) alts return $! PCase fc t' alts'- mkUniq (PIfThenElse fc c t f)- = liftM3 (PIfThenElse fc) (mkUniq c) (mkUniq t) (mkUniq f)- mkUniq (PPair fc p l r)- = do l' <- mkUniq l; r' <- mkUniq r- return $! PPair fc p l' r'- mkUniq (PDPair fc p (PRef fc' n) t sc)+ mkUniq nmap (PIfThenElse fc c t f)+ = liftM3 (PIfThenElse fc) (mkUniq nmap c) (mkUniq nmap t) (mkUniq nmap f)+ mkUniq nmap (PPair fc hls p l r)+ = do l' <- mkUniq nmap l; r' <- mkUniq nmap r+ return $! PPair fc hls p l' r'+ mkUniq nmap (PDPair fc hls p (PRef fc' hls' n) t sc) | t /= Placeholder = do env <- get (n', sc') <- if n `S.member` env then do let n' = uniqueNameSet n (S.union env inScope)- return (n', shadow n n' sc)+ return (n', sc) -- shadow n n' sc) else return (n, sc) put (S.insert n' env)- t' <- mkUniq t- sc'' <- mkUniq sc'- return $! PDPair fc p (PRef fc' n') t' sc''- mkUniq (PDPair fc p l t r)- = do l' <- mkUniq l; t' <- mkUniq t; r' <- mkUniq r- return $! PDPair fc p l' t' r'- mkUniq (PAlternative b as)- = liftM (PAlternative b) (mapM mkUniq as)- mkUniq (PHidden t) = liftM PHidden (mkUniq t)- mkUniq (PUnifyLog t) = liftM PUnifyLog (mkUniq t)- mkUniq (PDisamb n t) = liftM (PDisamb n) (mkUniq t)- mkUniq (PNoImplicits t) = liftM PNoImplicits (mkUniq t)- mkUniq (PProof ts) = liftM PProof (mapM mkUniqT ts)- mkUniq (PTactics ts) = liftM PTactics (mapM mkUniqT ts)- mkUniq (PRunElab fc ts) = liftM (PRunElab fc ) (mkUniq ts)- mkUniq t = return t+ let nmap' = M.insert n n' nmap+ t' <- mkUniq nmap t+ sc'' <- mkUniq nmap' sc'+ return $! PDPair fc hls p (PRef fc' hls' n') t' sc''+ mkUniq nmap (PDPair fc hls p l t r)+ = do l' <- mkUniq nmap l; t' <- mkUniq nmap t; r' <- mkUniq nmap r+ return $! PDPair fc hls p l' t' r'+ mkUniq nmap (PAlternative ns b as)+ -- store the nmap and defer the rest until we've pruned the set+ -- during elaboration+ = return $ PAlternative (M.toList nmap ++ ns) b as+ mkUniq nmap (PHidden t) = liftM PHidden (mkUniq nmap t)+ mkUniq nmap (PUnifyLog t) = liftM PUnifyLog (mkUniq nmap t)+ mkUniq nmap (PDisamb n t) = liftM (PDisamb n) (mkUniq nmap t)+ mkUniq nmap (PNoImplicits t) = liftM PNoImplicits (mkUniq nmap t)+ mkUniq nmap (PProof ts) = liftM PProof (mapM (mkUniqT nmap) ts)+ mkUniq nmap (PTactics ts) = liftM PTactics (mapM (mkUniqT nmap) ts)+ mkUniq nmap (PRunElab fc ts ns) = liftM (\tm -> PRunElab fc tm ns) (mkUniq nmap ts)+ mkUniq nmap (PConstSugar fc tm) = liftM (PConstSugar fc) (mkUniq nmap tm)+ mkUniq nmap t = return (shadowAll (M.toList nmap) t)+ where+ shadowAll [] t = t+ shadowAll ((n, n') : ns) t = shadow n n' (shadowAll ns t)+
src/Idris/AbsSyntaxTree.hs view
@@ -88,7 +88,9 @@ opt_origerr :: Bool, opt_autoSolve :: Bool, -- ^ automatically apply "solve" tactic in prover opt_autoImport :: [FilePath], -- ^ e.g. Builtins+Prelude- opt_optimise :: [Optimisation]+ opt_optimise :: [Optimisation],+ opt_printdepth :: Maybe Int,+ opt_evaltypes :: Bool -- ^ normalise types in :t } deriving (Show, Eq) @@ -113,10 +115,14 @@ , opt_autoSolve = True , opt_autoImport = [] , opt_optimise = defaultOptimise+ , opt_printdepth = Just 5000+ , opt_evaltypes = True } data PPOption = PPOption { ppopt_impl :: Bool -- ^^ whether to show implicits+ , ppopt_pinames :: Bool -- ^^ whether to show names in pi bindings+ , ppopt_depth :: Maybe Int } deriving (Show) data Optimisation = PETransform -- partial eval and associated transforms@@ -126,16 +132,22 @@ -- | Pretty printing options with default verbosity. defaultPPOption :: PPOption-defaultPPOption = PPOption { ppopt_impl = False }+defaultPPOption = PPOption { ppopt_impl = False, + ppopt_pinames = False,+ ppopt_depth = Just 200 } -- | Pretty printing options with the most verbosity. verbosePPOption :: PPOption-verbosePPOption = PPOption { ppopt_impl = True }+verbosePPOption = PPOption { ppopt_impl = True,+ ppopt_pinames = True,+ ppopt_depth = Just 200 } -- | Get pretty printing options from the big options record. ppOption :: IOption -> PPOption ppOption opt = PPOption {- ppopt_impl = opt_showimp opt+ ppopt_impl = opt_showimp opt,+ ppopt_pinames = False,+ ppopt_depth = opt_printdepth opt } -- | Get pretty printing options from an idris state record.@@ -189,10 +201,11 @@ idris_name :: Int, idris_lineapps :: [((FilePath, Int), PTerm)], -- ^ Full application LHS on source line- idris_metavars :: [(Name, (Maybe Name, Int, Bool))],+ idris_metavars :: [(Name, (Maybe Name, Int, [Name], Bool))], -- ^ The currently defined but not proven metavariables. The Int -- is the number of vars to display as a context, the Maybe Name- -- is its top-level function, and the Bool is whether :p is+ -- is its top-level function, the [Name] is the list of local variables+ -- available for proof search and the Bool is whether :p is -- allowed idris_coercions :: [Name], idris_errRev :: [(Term, Term)],@@ -205,7 +218,7 @@ idris_cgflags :: [(Codegen, String)], idris_hdrs :: [(Codegen, String)], idris_imported :: [(FilePath, Bool)], -- ^ Imported ibc file names, whether public- proof_list :: [(Name, [String])],+ proof_list :: [(Name, (Bool, [String]))], errSpan :: Maybe FC, parserWarnings :: [(FC, Err)], lastParse :: Maybe Name,@@ -237,7 +250,9 @@ elab_stack :: [(Name, Bool)], -- ^ Stack of names currently being elaborated, Bool set if it's an instance -- (instances appear twice; also as a funtion name) idris_symbols :: M.Map Name Name, -- ^ Symbol table (preserves sharing of names)- idris_exports :: [Name] -- ^ Functions with ExportList+ idris_exports :: [Name], -- ^ Functions with ExportList+ idris_highlightedRegions :: [(FC, OutputAnnotation)], -- ^ Highlighting information to output+ idris_parserHighlights :: [(FC, OutputAnnotation)] -- ^ Highlighting information from the parser } -- Required for parsers library, and therefore trifecta@@ -325,7 +340,7 @@ [] [] [] defaultOpts 6 [] [] [] [] emptySyntaxRules [] [] [] [] [] [] [] [] [] Nothing [] Nothing [] [] Nothing Nothing [] Hidden False [] Nothing [] [] (RawOutput stdout) True defaultTheme [] (0, emptyContext) emptyContext M.empty- AutomaticWidth S.empty S.empty [] Nothing Nothing [] [] M.empty []+ AutomaticWidth S.empty S.empty [] Nothing Nothing [] [] M.empty [] [] [] -- | The monad for the main REPL - reading and processing files and updating -- global state (hence the IO inner monad).@@ -373,7 +388,7 @@ | Execute PTerm | ExecVal PTerm | Metavars- | Prove Name+ | Prove Bool Name -- ^ If false, use prover, if true, use elab shell | AddProof (Maybe Name) | RmProof Name | ShowProof Name@@ -381,7 +396,7 @@ | Universes | LogLvl Int | Spec PTerm- | HNF PTerm+ | WHNF PTerm | TestInline PTerm | Defn Name | Missing Name@@ -394,10 +409,13 @@ | AddProofClauseFrom Bool Int Name | AddMissing Bool Int Name | MakeWith Bool Int Name+ | MakeCase Bool Int Name | MakeLemma Bool Int Name- | DoProofSearch Bool Bool Int Name [Name]- -- ^ the first bool is whether to update,- -- the second is whether to search recursively (i.e. for the arguments)+ | DoProofSearch Bool -- update file+ Bool -- recursive search+ Int -- depth+ Name -- top level name+ [Name] -- hints | SetOpt Opt | UnsetOpt Opt | NOP@@ -406,6 +424,7 @@ | ColourOff | ListErrorHandlers | SetConsoleWidth ConsoleWidth+ | SetPrinterDepth (Maybe Int) | Apropos [String] String | WhoCalls Name | CallsWho Name@@ -444,6 +463,7 @@ | DefaultPartial | WarnPartial | WarnReach+ | EvalTypes | NoCoverage | ErrContext | ShowImpl@@ -465,6 +485,7 @@ | DumpDefun String | DumpCases String | UseCodegen Codegen+ | CodegenArgs String | OutputTy OutputType | Extension LanguageExt | InterpretScript String@@ -479,8 +500,14 @@ | AutoWidth -- ^ Automatically adjust terminal width | AutoSolve -- ^ Automatically issue "solve" tactic in interactive prover | UseConsoleWidth ConsoleWidth+ | DumpHighlights deriving (Show, Eq) +data ElabShellCmd = EQED | EAbandon | EUndo | EProofState | EProofTerm+ | EEval PTerm | ECheck PTerm | ESearch PTerm+ | EDocStr (Either Name Const)+ deriving (Show, Eq)+ -- Parsed declarations data Fixity = Infixl { prec :: Int }@@ -568,6 +595,7 @@ | Specialise [(Name, Maybe Int)] -- specialise it, freeze these names | Constructor -- Data constructor type | AutoHint -- use in auto implicit search+ | PEGenerated -- generated by partial evaluator deriving (Show, Eq) {-! deriving instance Binary FnOpt@@ -594,41 +622,41 @@ -- datatypes and typeclasses. data PDecl' t = PFix FC Fixity [String] -- ^ Fixity declaration- | PTy (Docstring (Either Err PTerm)) [(Name, Docstring (Either Err PTerm))] SyntaxInfo FC FnOpts Name FC t -- ^ Type declaration (last FC is precise name location)+ | PTy (Docstring (Either Err t)) [(Name, Docstring (Either Err t))] SyntaxInfo FC FnOpts Name FC t -- ^ Type declaration (last FC is precise name location) | PPostulate Bool -- external def if true- (Docstring (Either Err PTerm)) SyntaxInfo FC FnOpts Name t -- ^ Postulate+ (Docstring (Either Err t)) SyntaxInfo FC FC FnOpts Name t -- ^ Postulate, second FC is precise name location | PClauses FC FnOpts Name [PClause' t] -- ^ Pattern clause | PCAF FC Name t -- ^ Top level constant- | PData (Docstring (Either Err PTerm)) [(Name, Docstring (Either Err PTerm))] SyntaxInfo FC DataOpts (PData' t) -- ^ Data declaration.+ | PData (Docstring (Either Err t)) [(Name, Docstring (Either Err t))] SyntaxInfo FC DataOpts (PData' t) -- ^ Data declaration. | PParams FC [(Name, t)] [PDecl' t] -- ^ Params block | PNamespace String FC [PDecl' t] -- ^ New namespace, where FC is accurate location of the -- namespace in the file- | PRecord (Docstring (Either Err PTerm)) SyntaxInfo FC DataOpts+ | PRecord (Docstring (Either Err t)) SyntaxInfo FC DataOpts Name -- Record name FC -- Record name precise location [(Name, FC, Plicity, t)] -- Parameters, where FC is precise name span- [(Name, Docstring (Either Err PTerm))] -- Param Docs- [((Maybe (Name, FC)), Plicity, t, Maybe (Docstring (Either Err PTerm)))] -- Fields+ [(Name, Docstring (Either Err t))] -- Param Docs+ [((Maybe (Name, FC)), Plicity, t, Maybe (Docstring (Either Err t)))] -- Fields (Maybe (Name, FC)) -- Optional constructor name and location- (Docstring (Either Err PTerm)) -- Constructor doc+ (Docstring (Either Err t)) -- Constructor doc SyntaxInfo -- Constructor SyntaxInfo -- ^ Record declaration- | PClass (Docstring (Either Err PTerm)) SyntaxInfo FC+ | PClass (Docstring (Either Err t)) SyntaxInfo FC [(Name, t)] -- constraints Name -- class name FC -- accurate location of class name [(Name, FC, t)] -- parameters and precise locations- [(Name, Docstring (Either Err PTerm))] -- parameter docstrings+ [(Name, Docstring (Either Err t))] -- parameter docstrings [(Name, FC)] -- determining parameters and precise locations [PDecl' t] -- declarations (Maybe (Name, FC)) -- instance constructor name and location- (Docstring (Either Err PTerm)) -- instance constructor docs+ (Docstring (Either Err t)) -- instance constructor docs -- ^ Type class: arguments are documentation, syntax info, source location, constraints, -- class name, class name location, parameters, method declarations, optional constructor name | PInstance- (Docstring (Either Err PTerm)) -- Instance docs- [(Name, Docstring (Either Err PTerm))] -- Parameter docs+ (Docstring (Either Err t)) -- Instance docs+ [(Name, Docstring (Either Err t))] -- Parameter docs SyntaxInfo FC [(Name, t)] -- constraints Name -- class@@ -644,9 +672,11 @@ | PSyntax FC Syntax -- ^ Syntax definition | PMutual FC [PDecl' t] -- ^ Mutual block | PDirective Directive -- ^ Compiler directive.- | PProvider (Docstring (Either Err PTerm)) SyntaxInfo FC (ProvideWhat' t) Name -- ^ Type provider. The first t is the type, the second is the term+ | PProvider (Docstring (Either Err t)) SyntaxInfo FC FC (ProvideWhat' t) Name -- ^ Type provider. The first t is the type, the second is the term. The second FC is precise highlighting location. | PTransform FC Bool t t -- ^ Source-to-source transformation rule. If -- bool is True, lhs and rhs must be convertible+ | PRunElabDecl FC t [String] -- ^ FC is decl-level, for errors, and+ -- Strings represent the namespace deriving Functor {-! deriving instance Binary PDecl'@@ -664,8 +694,8 @@ DDefault Bool | DLogging Integer | DDynamicLibs [String] |- DNameHint Name [Name] |- DErrorHandlers Name Name [Name] |+ DNameHint Name FC [(Name, FC)] |+ DErrorHandlers Name FC Name FC [(Name, FC)] | DLanguage LanguageExt | DUsed FC Name Name @@ -722,6 +752,18 @@ | PLaterdecl { d_name :: Name, d_name_fc :: FC, d_tcon :: t } -- ^ "Placeholder" for data whose constructors are defined later deriving Functor+ +-- | Transform the FCs in a PData and its associated terms. The first+-- function transforms the general-purpose FCs, and the second transforms+-- those that are used for semantic source highlighting, so they can be+-- treated specially.+mapPDataFC :: (FC -> FC) -> (FC -> FC) -> PData -> PData+mapPDataFC f g (PDatadecl n nfc tycon ctors) =+ PDatadecl n (g nfc) (mapPTermFC f g tycon) (map ctorFC ctors)+ where ctorFC (doc, argDocs, n, nfc, ty, fc, ns) =+ (doc, argDocs, n, g nfc, mapPTermFC f g ty, f fc, ns)+mapPDataFC f g (PLaterdecl n nfc tycon) =+ PLaterdecl n (g nfc) (mapPTermFC f g tycon) {-! deriving instance Binary PData' deriving instance NFData PData'@@ -734,12 +776,80 @@ type PData = PData' PTerm type PClause = PClause' PTerm --- get all the names declared in a decl+-- | Transform the FCs in a PTerm. The first function transforms the+-- general-purpose FCs, and the second transforms those that are used+-- for semantic source highlighting, so they can be treated specially.+mapPDeclFC :: (FC -> FC) -> (FC -> FC) -> PDecl -> PDecl+mapPDeclFC f g (PFix fc fixity ops) =+ PFix (f fc) fixity ops+mapPDeclFC f g (PTy doc argdocs syn fc opts n nfc ty) =+ PTy doc argdocs syn (f fc) opts n (g nfc) (mapPTermFC f g ty)+mapPDeclFC f g (PPostulate ext doc syn fc nfc opts n ty) =+ PPostulate ext doc syn (f fc) (g nfc) opts n (mapPTermFC f g ty) +mapPDeclFC f g (PClauses fc opts n clauses) =+ PClauses (f fc) opts n (map (fmap (mapPTermFC f g)) clauses)+mapPDeclFC f g (PCAF fc n tm) = PCAF (f fc) n (mapPTermFC f g tm)+mapPDeclFC f g (PData doc argdocs syn fc opts dat) =+ PData doc argdocs syn (f fc) opts (mapPDataFC f g dat)+mapPDeclFC f g (PParams fc params decls) =+ PParams (f fc)+ (map (\(n, ty) -> (n, mapPTermFC f g ty)) params)+ (map (mapPDeclFC f g) decls)+mapPDeclFC f g (PNamespace ns fc decls) =+ PNamespace ns (f fc) (map (mapPDeclFC f g) decls)+mapPDeclFC f g (PRecord doc syn fc opts n nfc params paramdocs fields ctor ctorDoc syn') =+ PRecord doc syn (f fc) opts n (g nfc)+ (map (\(pn, pnfc, plic, ty) -> (pn, g pnfc, plic, mapPTermFC f g ty)) params)+ paramdocs+ (map (\(fn, plic, ty, fdoc) -> (fmap (\(fn', fnfc) -> (fn', g fnfc)) fn,+ plic, mapPTermFC f g ty, fdoc))+ fields)+ (fmap (\(ctorN, ctorNFC) -> (ctorN, g ctorNFC)) ctor)+ ctorDoc+ syn'+mapPDeclFC f g (PClass doc syn fc constrs n nfc params paramDocs det body ctor ctorDoc) =+ PClass doc syn (f fc)+ (map (\(constrn, constr) -> (constrn, mapPTermFC f g constr)) constrs)+ n (g nfc) (map (\(n, nfc, pty) -> (n, g nfc, mapPTermFC f g pty)) params)+ paramDocs (map (\(dn, dnfc) -> (dn, g dnfc)) det)+ (map (mapPDeclFC f g) body)+ (fmap (\(n, nfc) -> (n, g nfc)) ctor)+ ctorDoc+mapPDeclFC f g (PInstance doc paramDocs syn fc constrs cn cnfc params instTy instN body) =+ PInstance doc paramDocs syn (f fc)+ (map (\(constrN, constrT) -> (constrN, mapPTermFC f g constrT)) constrs)+ cn (g cnfc) (map (mapPTermFC f g) params)+ (mapPTermFC f g instTy)+ instN+ (map (mapPDeclFC f g) body)+mapPDeclFC f g (PDSL n dsl) = PDSL n (fmap (mapPTermFC f g) dsl)+mapPDeclFC f g (PSyntax fc syn) = PSyntax (f fc) $+ case syn of+ Rule syms tm ctxt -> Rule syms (mapPTermFC f g tm) ctxt+ DeclRule syms decls -> DeclRule syms (map (mapPDeclFC f g) decls)+mapPDeclFC f g (PMutual fc decls) =+ PMutual (f fc) (map (mapPDeclFC f g) decls)+mapPDeclFC f g (PDirective d) =+ PDirective $+ case d of+ DNameHint n nfc ns ->+ DNameHint n (g nfc) (map (\(hn, hnfc) -> (hn, g hnfc)) ns)+ DErrorHandlers n nfc n' nfc' ns ->+ DErrorHandlers n (g nfc) n' (g nfc') $+ map (\(an, anfc) -> (an, g anfc)) ns+mapPDeclFC f g (PProvider doc syn fc nfc what n) =+ PProvider doc syn (f fc) (g nfc) (fmap (mapPTermFC f g) what) n+mapPDeclFC f g (PTransform fc safe l r) =+ PTransform (f fc) safe (mapPTermFC f g l) (mapPTermFC f g r)+mapPDeclFC f g (PRunElabDecl fc script ns) =+ PRunElabDecl (f fc) (mapPTermFC f g script) ns++-- | Get all the names declared in a declaration declared :: PDecl -> [Name] declared (PFix _ _ _) = [] declared (PTy _ _ _ _ _ n fc t) = [n]-declared (PPostulate _ _ _ _ _ n t) = [n]+declared (PPostulate _ _ _ _ _ _ n t) = [n] declared (PClauses _ _ n _) = [] -- not a declaration declared (PCAF _ n _) = [n] declared (PData _ _ _ _ _ (PDatadecl n _ _ ts)) = n : map fstt ts@@ -760,7 +870,7 @@ tldeclared :: PDecl -> [Name] tldeclared (PFix _ _ _) = [] tldeclared (PTy _ _ _ _ _ n _ t) = [n]-tldeclared (PPostulate _ _ _ _ _ n t) = [n]+tldeclared (PPostulate _ _ _ _ _ _ n t) = [n] tldeclared (PClauses _ _ n _) = [] -- not a declaration tldeclared (PRecord _ _ _ _ n _ _ _ _ cn _ _) = n : map fst (maybeToList cn) tldeclared (PData _ _ _ _ _ (PDatadecl n _ _ ts)) = n : map fstt ts@@ -775,7 +885,7 @@ defined :: PDecl -> [Name] defined (PFix _ _ _) = [] defined (PTy _ _ _ _ _ n _ t) = []-defined (PPostulate _ _ _ _ _ n t) = []+defined (PPostulate _ _ _ _ _ _ n t) = [] defined (PClauses _ _ n _) = [n] -- not a declaration defined (PCAF _ n _) = [n] defined (PData _ _ _ _ _ (PDatadecl n _ _ ts)) = n : map fstt ts@@ -799,7 +909,7 @@ updateNs :: [(Name, Name)] -> PTerm -> PTerm updateNs [] t = t updateNs ns t = mapPT updateRef t- where updateRef (PRef fc f) = PRef fc (updateN ns f)+ where updateRef (PRef fc fcs f) = PRef fc fcs (updateN ns f) updateRef t = t -- updateDNs :: [(Name, Name)] -> PDecl -> PDecl@@ -817,8 +927,8 @@ -- | High level language terms data PTerm = PQuote Raw -- ^ Inclusion of a core term into the high-level language- | PRef FC Name -- ^ A reference to a variable- | PInferRef FC Name -- ^ A name to be defined later+ | PRef FC [FC] Name -- ^ A reference to a variable. The FC is its precise source location for highlighting. The list of FCs is a collection of additional highlighting locations.+ | PInferRef FC [FC] Name -- ^ A name to be defined later | PPatvar FC Name -- ^ A pattern variable | PLam FC Name FC PTerm PTerm -- ^ A lambda abstraction. Second FC is name span. | PPi Plicity Name FC PTerm PTerm -- ^ (n : t1) -> t2, where the FC is for the precise location of the variable@@ -833,10 +943,10 @@ | PTrue FC PunInfo -- ^ Unit type..? | PResolveTC FC -- ^ Solve this dictionary by type class resolution | PRewrite FC PTerm PTerm (Maybe PTerm) -- ^ "rewrite" syntax, with optional result type- | PPair FC PunInfo PTerm PTerm -- ^ A pair (a, b) and whether it's a product type or a pair (solved by elaboration)- | PDPair FC PunInfo PTerm PTerm PTerm -- ^ A dependent pair (tm : a ** b) and whether it's a sigma type or a pair that inhabits one (solved by elaboration)+ | PPair FC [FC] PunInfo PTerm PTerm -- ^ A pair (a, b) and whether it's a product type or a pair (solved by elaboration). The list of FCs is its punctuation.+ | PDPair FC [FC] PunInfo PTerm PTerm PTerm -- ^ A dependent pair (tm : a ** b) and whether it's a sigma type or a pair that inhabits one (solved by elaboration). The [FC] is its punctuation. | PAs FC Name PTerm -- ^ @-pattern, valid LHS only- | PAlternative PAltType [PTerm] -- ^ True if only one may work. (| A, B, C|)+ | PAlternative [(Name, Name)] PAltType [PTerm] -- ^ (| A, B, C|). Includes unapplied unique name mappings for mkUniqueNames. | PHidden PTerm -- ^ Irrelevant or hidden pattern | PType FC -- ^ 'Type' type | PUniverse Universe -- ^ Some universe@@ -857,16 +967,73 @@ | PNoImplicits PTerm -- ^ never run implicit converions on the term | PQuasiquote PTerm (Maybe PTerm) -- ^ `(Term [: Term]) | PUnquote PTerm -- ^ ~Term- | PQuoteName Name -- ^ `{n}- | PRunElab FC PTerm -- ^ %runElab tm - New-style proof script+ | PQuoteName Name FC -- ^ `{n} where the FC is the precise highlighting for the name in particular+ | PRunElab FC PTerm [String] -- ^ %runElab tm - New-style proof script. Args are location, script, enclosing namespace.+ | PConstSugar FC PTerm -- ^ A desugared constant. The FC is a precise source location that will be used to highlight it later. deriving (Eq, Data, Typeable) data PAltType = ExactlyOne Bool -- ^ flag sets whether delay is allowed- | FirstSuccess + | FirstSuccess+ | TryImplicit deriving (Eq, Data, Typeable) +-- | Transform the FCs in a PTerm. The first function transforms the+-- general-purpose FCs, and the second transforms those that are used+-- for semantic source highlighting, so they can be treated specially.+mapPTermFC :: (FC -> FC) -> (FC -> FC) -> PTerm -> PTerm+mapPTermFC f g (PQuote q) = PQuote q+mapPTermFC f g (PRef fc fcs n) = PRef (g fc) (map g fcs) n+mapPTermFC f g (PInferRef fc fcs n) = PInferRef (g fc) (map g fcs) n+mapPTermFC f g (PPatvar fc n) = PPatvar (g fc) n+mapPTermFC f g (PLam fc n fc' t1 t2) = PLam (f fc) n (g fc') (mapPTermFC f g t1) (mapPTermFC f g t2)+mapPTermFC f g (PPi plic n fc t1 t2) = PPi plic n (g fc) (mapPTermFC f g t1) (mapPTermFC f g t2)+mapPTermFC f g (PLet fc n fc' t1 t2 t3) = PLet (f fc) n (g fc') (mapPTermFC f g t1) (mapPTermFC f g t2) (mapPTermFC f g t3)+mapPTermFC f g (PTyped t1 t2) = PTyped (mapPTermFC f g t1) (mapPTermFC f g t2)+mapPTermFC f g (PApp fc t args) = PApp (f fc) (mapPTermFC f g t) (map (fmap (mapPTermFC f g)) args)+mapPTermFC f g (PAppImpl t1 impls) = PAppImpl (mapPTermFC f g t1) impls+mapPTermFC f g (PAppBind fc t args) = PAppBind (f fc) (mapPTermFC f g t) (map (fmap (mapPTermFC f g)) args)+mapPTermFC f g (PMatchApp fc n) = PMatchApp (f fc) n+mapPTermFC f g (PIfThenElse fc t1 t2 t3) = PIfThenElse (f fc) (mapPTermFC f g t1) (mapPTermFC f g t2) (mapPTermFC f g t3)+mapPTermFC f g (PCase fc t cases) = PCase (f fc) (mapPTermFC f g t) (map (\(l,r) -> (mapPTermFC f g l, mapPTermFC f g r)) cases)+mapPTermFC f g (PTrue fc info) = PTrue (f fc) info+mapPTermFC f g (PResolveTC fc) = PResolveTC (f fc)+mapPTermFC f g (PRewrite fc t1 t2 t3) = PRewrite (f fc) (mapPTermFC f g t1) (mapPTermFC f g t2) (fmap (mapPTermFC f g) t3)+mapPTermFC f g (PPair fc hls info t1 t2) = PPair (f fc) (map g hls) info (mapPTermFC f g t1) (mapPTermFC f g t2)+mapPTermFC f g (PDPair fc hls info t1 t2 t3) = PDPair (f fc) (map g hls) info (mapPTermFC f g t1) (mapPTermFC f g t2) (mapPTermFC f g t3)+mapPTermFC f g (PAs fc n t) = PAs (f fc) n (mapPTermFC f g t)+mapPTermFC f g (PAlternative ns ty ts) = PAlternative ns ty (map (mapPTermFC f g) ts)+mapPTermFC f g (PHidden t) = PHidden (mapPTermFC f g t)+mapPTermFC f g (PType fc) = PType (f fc)+mapPTermFC f g (PUniverse u) = PUniverse u+mapPTermFC f g (PGoal fc t1 n t2) = PGoal (f fc) (mapPTermFC f g t1) n (mapPTermFC f g t2)+mapPTermFC f g (PConstant fc c) = PConstant (f fc) c+mapPTermFC f g Placeholder = Placeholder+mapPTermFC f g (PDoBlock dos) = PDoBlock (map mapPDoFC dos)+ where mapPDoFC (DoExp fc t) = DoExp (f fc) (mapPTermFC f g t)+ mapPDoFC (DoBind fc n nfc t) = DoBind (f fc) n (g nfc) (mapPTermFC f g t)+ mapPDoFC (DoBindP fc t1 t2 alts) =+ DoBindP (f fc) (mapPTermFC f g t1) (mapPTermFC f g t2) (map (\(l,r)-> (mapPTermFC f g l, mapPTermFC f g r)) alts)+ mapPDoFC (DoLet fc n nfc t1 t2) = DoLet (f fc) n (g nfc) (mapPTermFC f g t1) (mapPTermFC f g t2)+ mapPDoFC (DoLetP fc t1 t2) = DoLetP (f fc) (mapPTermFC f g t1) (mapPTermFC f g t2)+mapPTermFC f g (PIdiom fc t) = PIdiom (f fc) (mapPTermFC f g t)+mapPTermFC f g (PReturn fc) = PReturn (f fc)+mapPTermFC f g (PMetavar fc n) = PMetavar (g fc) n+mapPTermFC f g (PProof tacs) = PProof (map (fmap (mapPTermFC f g)) tacs)+mapPTermFC f g (PTactics tacs) = PTactics (map (fmap (mapPTermFC f g)) tacs)+mapPTermFC f g (PElabError err) = PElabError err+mapPTermFC f g PImpossible = PImpossible+mapPTermFC f g (PCoerced t) = PCoerced (mapPTermFC f g t)+mapPTermFC f g (PDisamb msg t) = PDisamb msg (mapPTermFC f g t)+mapPTermFC f g (PUnifyLog t) = PUnifyLog (mapPTermFC f g t)+mapPTermFC f g (PNoImplicits t) = PNoImplicits (mapPTermFC f g t)+mapPTermFC f g (PQuasiquote t1 t2) = PQuasiquote (mapPTermFC f g t1) (fmap (mapPTermFC f g) t2)+mapPTermFC f g (PUnquote t) = PUnquote (mapPTermFC f g t)+mapPTermFC f g (PRunElab fc tm ns) = PRunElab (f fc) (mapPTermFC f g tm) ns+mapPTermFC f g (PConstSugar fc tm) = PConstSugar (g fc) (mapPTermFC f g tm)+mapPTermFC f g (PQuoteName n fc) = PQuoteName n (g fc)+ {-!-deriving instance Binary PTerm+dg instance Binary PTerm deriving instance NFData PTerm !-} @@ -882,9 +1049,9 @@ mpt (PCase fc c os) = PCase fc (mapPT f c) (map (pmap (mapPT f)) os) mpt (PIfThenElse fc c t e) = PIfThenElse fc (mapPT f c) (mapPT f t) (mapPT f e) mpt (PTyped l r) = PTyped (mapPT f l) (mapPT f r)- mpt (PPair fc p l r) = PPair fc p (mapPT f l) (mapPT f r)- mpt (PDPair fc p l t r) = PDPair fc p (mapPT f l) (mapPT f t) (mapPT f r)- mpt (PAlternative a as) = PAlternative a (map (mapPT f) as)+ mpt (PPair fc hls p l r) = PPair fc hls p (mapPT f l) (mapPT f r)+ mpt (PDPair fc hls p l t r) = PDPair fc hls p (mapPT f l) (mapPT f t) (mapPT f r)+ mpt (PAlternative ns a as) = PAlternative ns a (map (mapPT f) as) mpt (PHidden t) = PHidden (mapPT f t) mpt (PDoBlock ds) = PDoBlock (map (fmap (mapPT f)) ds) mpt (PProof ts) = PProof (map (fmap (mapPT f)) ts)@@ -906,7 +1073,9 @@ | MatchRefine Name | LetTac Name t | LetTacTy Name t t | Exact t | Compute | Trivial | TCInstance- | ProofSearch Bool Bool Int (Maybe Name) [Name]+ | ProofSearch Bool Bool Int (Maybe Name) + [Name] -- allowed local names+ [Name] -- hints -- ^ the bool is whether to search recursively | Solve | Attack@@ -957,6 +1126,14 @@ size Skip = 1 size (TFail ts) = 1 + size ts size SourceFC = 1+ size DoUnify = 1+ size (CaseTac x) = 1 + size x+ size (Equiv t) = 1 + size t+ size (Claim x y) = 1 + size x + size y+ size Unfocus = 1+ size (MatchRefine x) = 1 + size x+ size (LetTacTy x y z) = 1 + size x + size y + size z+ size TCInstance = 1 type PTactic = PTactic' PTerm @@ -1028,8 +1205,8 @@ -- | Get the highest FC in a term, if one exists highestFC :: PTerm -> Maybe FC highestFC (PQuote _) = Nothing-highestFC (PRef fc _) = Just fc-highestFC (PInferRef fc _) = Just fc+highestFC (PRef fc _ _) = Just fc+highestFC (PInferRef fc _ _) = Just fc highestFC (PPatvar fc _) = Just fc highestFC (PLam fc _ _ _ _) = Just fc highestFC (PPi _ _ _ _ _) = Nothing@@ -1043,10 +1220,10 @@ highestFC (PTrue fc _) = Just fc highestFC (PResolveTC fc) = Just fc highestFC (PRewrite fc _ _ _) = Just fc-highestFC (PPair fc _ _ _) = Just fc-highestFC (PDPair fc _ _ _ _) = Just fc+highestFC (PPair fc _ _ _ _) = Just fc+highestFC (PDPair fc _ _ _ _ _) = Just fc highestFC (PAs fc _ _) = Just fc-highestFC (PAlternative _ args) =+highestFC (PAlternative _ _ args) = case mapMaybe highestFC args of [] -> Nothing (fc:_) -> Just fc@@ -1080,7 +1257,10 @@ highestFC (PNoImplicits tm) = highestFC tm highestFC (PQuasiquote _ _) = Nothing highestFC (PUnquote tm) = highestFC tm-highestFC (PQuoteName _) = Nothing+highestFC (PQuoteName _ fc) = Just fc+highestFC (PRunElab fc _ _) = Just fc+highestFC (PConstSugar fc _) = Just fc+highestFC (PAppImpl t _) = highestFC t -- Type class data @@ -1147,15 +1327,20 @@ !-} data Syntax = Rule [SSymbol] PTerm SynContext+ | DeclRule [SSymbol] [PDecl] deriving Show syntaxNames :: Syntax -> [Name] syntaxNames (Rule syms _ _) = mapMaybe ename syms where ename (Keyword n) = Just n ename _ = Nothing+syntaxNames (DeclRule syms _) = mapMaybe ename syms+ where ename (Keyword n) = Just n+ ename _ = Nothing syntaxSymbols :: Syntax -> [SSymbol] syntaxSymbols (Rule ss _ _) = ss+syntaxSymbols (DeclRule ss _) = ss {-! deriving instance Binary Syntax deriving instance NFData Syntax@@ -1214,10 +1399,10 @@ symCompare (SimpleExpr _) (Expr _) = GT symCompare (SimpleExpr e1) (SimpleExpr e2) = compare e1 e2 -initDSL = DSL (PRef f (sUN ">>="))- (PRef f (sUN "return"))- (PRef f (sUN "<*>"))- (PRef f (sUN "pure"))+initDSL = DSL (PRef f [] (sUN ">>="))+ (PRef f [] (sUN "return"))+ (PRef f [] (sUN "<*>"))+ (PRef f [] (sUN "pure")) Nothing Nothing Nothing@@ -1228,7 +1413,7 @@ data Using = UImplicit Name PTerm | UConstraint Name [Name]- deriving (Show, Eq)+ deriving (Show, Eq, Data, Typeable) {-! deriving instance Binary Using deriving instance NFData Using@@ -1272,11 +1457,11 @@ inferDecl = PDatadecl inferTy NoFC (PType bi) [(emptyDocstring, [], inferCon, NoFC, PPi impl (sMN 0 "iType") NoFC (PType bi) (- PPi expl (sMN 0 "ival") NoFC (PRef bi (sMN 0 "iType"))- (PRef bi inferTy)), bi, [])]+ PPi expl (sMN 0 "ival") NoFC (PRef bi [] (sMN 0 "iType"))+ (PRef bi [] inferTy)), bi, [])] inferOpts = [] -infTerm t = PApp bi (PRef bi inferCon) [pimp (sMN 0 "iType") Placeholder True, pexp t]+infTerm t = PApp bi (PRef bi [] inferCon) [pimp (sMN 0 "iType") Placeholder True, pexp t] infP = P (TCon 6 0) inferTy (TType (UVal 0)) getInferTerm, getInferType :: Term -> Term@@ -1327,15 +1512,15 @@ "You may need to use `(~=~)` to explicitly request heterogeneous equality." eqDecl = PDatadecl eqTy NoFC (piBindp impl [(n "A", PType bi), (n "B", PType bi)]- (piBind [(n "x", PRef bi (n "A")), (n "y", PRef bi (n "B"))]+ (piBind [(n "x", PRef bi [] (n "A")), (n "y", PRef bi [] (n "B"))] (PType bi))) [(reflDoc, reflParamDoc, eqCon, NoFC, PPi impl (n "A") NoFC (PType bi) (- PPi impl (n "x") NoFC (PRef bi (n "A"))- (PApp bi (PRef bi eqTy) [pimp (n "A") Placeholder False,+ PPi impl (n "x") NoFC (PRef bi [] (n "A"))+ (PApp bi (PRef bi [] eqTy) [pimp (n "A") Placeholder False, pimp (n "B") Placeholder False,- pexp (PRef bi (n "x")),- pexp (PRef bi (n "x"))])), bi, [])]+ pexp (PRef bi [] (n "x")),+ pexp (PRef bi [] (n "x"))])), bi, [])] where n a = sUN a reflDoc = annotCode (const (Left $ Msg "")) . parseDocstring . T.pack $ "A proof that `x` in fact equals `x`. To construct this, you must have already " ++@@ -1391,34 +1576,42 @@ -- | Colourise annotations according to an Idris state. It ignores the names -- in the annotation, as there's no good way to show extended information on a -- terminal.-consoleDecorate :: IState -> OutputAnnotation -> String -> String-consoleDecorate ist _ | not (idris_colourRepl ist) = id-consoleDecorate ist (AnnConst c) = let theme = idris_colourTheme ist- in if constIsType c- then colouriseType theme- else colouriseData theme-consoleDecorate ist (AnnData _ _) = colouriseData (idris_colourTheme ist)-consoleDecorate ist (AnnType _ _) = colouriseType (idris_colourTheme ist)-consoleDecorate ist (AnnBoundName _ True) = colouriseImplicit (idris_colourTheme ist)-consoleDecorate ist (AnnBoundName _ False) = colouriseBound (idris_colourTheme ist)-consoleDecorate ist AnnKeyword = colouriseKeyword (idris_colourTheme ist)-consoleDecorate ist (AnnName n _ _ _) = let ctxt = tt_ctxt ist- theme = idris_colourTheme ist- in case () of- _ | isDConName n ctxt -> colouriseData theme- _ | isFnName n ctxt -> colouriseFun theme- _ | isTConName n ctxt -> colouriseType theme- _ | isPostulateName n ist -> colourisePostulate theme- _ | otherwise -> id -- don't colourise unknown names-consoleDecorate ist (AnnFC _) = id-consoleDecorate ist (AnnTextFmt fmt) = Idris.Colours.colourise (colour fmt)+annotationColour :: IState -> OutputAnnotation -> Maybe IdrisColour+annotationColour ist _ | not (idris_colourRepl ist) = Nothing+annotationColour ist (AnnConst c) =+ let theme = idris_colourTheme ist+ in Just $ if constIsType c+ then typeColour theme+ else dataColour theme+annotationColour ist (AnnData _ _) = Just $ dataColour (idris_colourTheme ist)+annotationColour ist (AnnType _ _) = Just $ typeColour (idris_colourTheme ist)+annotationColour ist (AnnBoundName _ True) = Just $ implicitColour (idris_colourTheme ist)+annotationColour ist (AnnBoundName _ False) = Just $ boundVarColour (idris_colourTheme ist)+annotationColour ist AnnKeyword = Just $ keywordColour (idris_colourTheme ist)+annotationColour ist (AnnName n _ _ _) =+ let ctxt = tt_ctxt ist+ theme = idris_colourTheme ist+ in case () of+ _ | isDConName n ctxt -> Just $ dataColour theme+ _ | isFnName n ctxt -> Just $ functionColour theme+ _ | isTConName n ctxt -> Just $ typeColour theme+ _ | isPostulateName n ist -> Just $ postulateColour theme+ _ | otherwise -> Nothing -- don't colourise unknown names+annotationColour ist (AnnTextFmt fmt) = Just (colour fmt) where colour BoldText = IdrisColour Nothing True False True False colour UnderlineText = IdrisColour Nothing True True False False colour ItalicText = IdrisColour Nothing True False False True-consoleDecorate ist (AnnTerm _ _) = id-consoleDecorate ist (AnnSearchResult _) = id-consoleDecorate ist (AnnErr _) = id+annotationColour ist _ = Nothing ++-- | Colourise annotations according to an Idris state. It ignores the names+-- in the annotation, as there's no good way to show extended+-- information on a terminal. Note that strings produced this way will+-- not be coloured on Windows, so the use of the colour rendering+-- functions in Idris.Output is to be preferred.+consoleDecorate :: IState -> OutputAnnotation -> String -> String+consoleDecorate ist ann = maybe id colourise (annotationColour ist ann)+ isPostulateName :: Name -> IState -> Bool isPostulateName n ist = S.member n (idris_postulates ist) @@ -1441,96 +1634,103 @@ -> [FixDecl] -- ^^ Fixity declarations -> PTerm -- ^^ the term to pretty-print -> Doc OutputAnnotation-pprintPTerm ppo bnd docArgs infixes = prettySe startPrec bnd+pprintPTerm ppo bnd docArgs infixes = prettySe (ppopt_depth ppo) startPrec bnd where startPrec = 0 funcAppPrec = 10 - prettySe :: Int -> [(Name, Bool)] -> PTerm -> Doc OutputAnnotation- prettySe p bnd (PQuote r) =+ prettySe :: Maybe Int -> Int -> [(Name, Bool)] -> PTerm -> Doc OutputAnnotation+ prettySe d p bnd (PQuote r) = text "![" <> pretty r <> text "]"- prettySe p bnd (PPatvar fc n) = pretty n- prettySe p bnd e- | Just str <- slist p bnd e = str- | Just n <- snat p e = annotate (AnnData "Nat" "") (text (show n))- prettySe p bnd (PRef fc n) = prettyName True (ppopt_impl ppo) bnd n- prettySe p bnd (PLam fc n nfc ty sc) =- bracket p startPrec . group . align . hang 2 $+ prettySe d p bnd (PPatvar fc n) = pretty n+ prettySe d p bnd e+ | Just str <- slist d p bnd e = depth d $ str+ | Just n <- snat d p e = depth d $ annotate (AnnData "Nat" "") (text (show n))+ prettySe d p bnd (PRef fc _ n) = prettyName True (ppopt_impl ppo) bnd n+ prettySe d p bnd (PLam fc n nfc ty sc) =+ depth d . bracket p startPrec . group . align . hang 2 $ text "\\" <> prettyBindingOf n False <+> text "=>" <$>- prettySe startPrec ((n, False):bnd) sc- prettySe p bnd (PLet fc n nfc ty v sc) =- bracket p startPrec . group . align $- kwd "let" <+> (group . align . hang 2 $ prettyBindingOf n False <+> text "=" <$> prettySe startPrec bnd v) </>- kwd "in" <+> (group . align . hang 2 $ prettySe startPrec ((n, False):bnd) sc)- prettySe p bnd (PPi (Exp l s _) n _ ty sc)- | n `elem` allNamesIn sc || ppopt_impl ppo || n `elem` docArgs =- bracket p startPrec . group $- enclose lparen rparen (group . align $ prettyBindingOf n False <+> colon <+> prettySe startPrec bnd ty) <+>- st <> text "->" <$> prettySe startPrec ((n, False):bnd) sc+ prettySe (decD d) startPrec ((n, False):bnd) sc+ prettySe d p bnd (PLet fc n nfc ty v sc) =+ depth d . bracket p startPrec . group . align $+ kwd "let" <+> (group . align . hang 2 $ prettyBindingOf n False <+> text "=" <$> prettySe (decD d) startPrec bnd v) </>+ kwd "in" <+> (group . align . hang 2 $ prettySe (decD d) startPrec ((n, False):bnd) sc)+ prettySe d p bnd (PPi (Exp l s _) n _ ty sc)+ | n `elem` allNamesIn sc || ppopt_impl ppo && uname n || n `elem` docArgs+ || ppopt_pinames ppo && uname n =+ depth d . bracket p startPrec . group $+ enclose lparen rparen (group . align $ prettyBindingOf n False <+> colon <+> prettySe (decD d) startPrec bnd ty) <+>+ st <> text "->" <$> prettySe (decD d) startPrec ((n, False):bnd) sc | otherwise =- bracket p startPrec . group $- group (prettySe (startPrec + 1) bnd ty <+> st) <> text "->" <$> group (prettySe startPrec ((n, False):bnd) sc)+ depth d . bracket p startPrec . group $+ group (prettySe (decD d) (startPrec + 1) bnd ty <+> st) <> text "->" <$>+ group (prettySe (decD d) startPrec ((n, False):bnd) sc) where+ uname (UN n) = case str n of+ ('_':_) -> False+ _ -> True+ uname _ = False+ st = case s of Static -> text "[static]" <> space _ -> empty- prettySe p bnd (PPi (Imp l s _ fa) n _ ty sc)+ prettySe d p bnd (PPi (Imp l s _ fa) n _ ty sc) | ppopt_impl ppo =- bracket p startPrec $- lbrace <> prettyBindingOf n True <+> colon <+> prettySe startPrec bnd ty <> rbrace <+>- st <> text "->" </> prettySe startPrec ((n, True):bnd) sc- | otherwise = prettySe startPrec ((n, True):bnd) sc+ depth d . bracket p startPrec $+ lbrace <> prettyBindingOf n True <+> colon <+> prettySe (decD d) startPrec bnd ty <> rbrace <+>+ st <> text "->" </> prettySe (decD d) startPrec ((n, True):bnd) sc+ | otherwise = depth d $ prettySe (decD d) startPrec ((n, True):bnd) sc where st = case s of Static -> text "[static]" <> space _ -> empty- prettySe p bnd (PPi (Constraint _ _) n _ ty sc) =- bracket p startPrec $- prettySe (startPrec + 1) bnd ty <+> text "=>" </> prettySe startPrec ((n, True):bnd) sc- prettySe p bnd (PPi (TacImp _ _ (PTactics [ProofSearch _ _ _ _ _])) n _ ty sc) =- lbrace <> kwd "auto" <+> pretty n <+> colon <+> prettySe startPrec bnd ty <>- rbrace <+> text "->" </> prettySe startPrec ((n, True):bnd) sc- prettySe p bnd (PPi (TacImp _ _ s) n _ ty sc) =- bracket p startPrec $- lbrace <> kwd "default" <+> prettySe (funcAppPrec + 1) bnd s <+> pretty n <+> colon <+> prettySe startPrec bnd ty <>- rbrace <+> text "->" </> prettySe startPrec ((n, True):bnd) sc+ prettySe d p bnd (PPi (Constraint _ _) n _ ty sc) =+ depth d . bracket p startPrec $+ prettySe (decD d) (startPrec + 1) bnd ty <+> text "=>" </> prettySe (decD d) startPrec ((n, True):bnd) sc+ prettySe d p bnd (PPi (TacImp _ _ (PTactics [ProofSearch _ _ _ _ _ _])) n _ ty sc) =+ lbrace <> kwd "auto" <+> pretty n <+> colon <+> prettySe (decD d) startPrec bnd ty <>+ rbrace <+> text "->" </> prettySe (decD d) startPrec ((n, True):bnd) sc+ prettySe d p bnd (PPi (TacImp _ _ s) n _ ty sc) =+ depth d . bracket p startPrec $+ lbrace <> kwd "default" <+> prettySe (decD d) (funcAppPrec + 1) bnd s <+> pretty n <+> colon <+> prettySe (decD d) startPrec bnd ty <>+ rbrace <+> text "->" </> prettySe (decD d) startPrec ((n, True):bnd) sc -- This case preserves the behavior of the former constructor PEq. -- It should be removed if feasible when the pretty-printing of infix -- operators in general is improved.- prettySe p bnd (PApp _ (PRef _ n) [lt, rt, l, r])+ prettySe d p bnd (PApp _ (PRef _ _ n) [lt, rt, l, r]) | n == eqTy, ppopt_impl ppo =- bracket p eqPrec $+ depth d . bracket p eqPrec $ enclose lparen rparen eq <+>- align (group (vsep (map (prettyArgS bnd)+ align (group (vsep (map (prettyArgS (decD d) bnd) [lt, rt, l, r]))) | n == eqTy =- bracket p eqPrec . align . group $+ depth d . bracket p eqPrec . align . group $ prettyTerm (getTm l) <+> eq <$> group (prettyTerm (getTm r)) where eq = annName eqTy (text "=") eqPrec = startPrec- prettyTerm = prettySe (eqPrec + 1) bnd- prettySe p bnd (PApp _ (PRef _ f) args) -- normal names, no explicit args+ prettyTerm = prettySe (decD d) (eqPrec + 1) bnd+ prettySe d p bnd (PApp _ (PRef _ _ f) args) -- normal names, no explicit args | UN nm <- basename f , not (ppopt_impl ppo) && null (getShowArgs args) = prettyName True (ppopt_impl ppo) bnd f- prettySe p bnd (PAppBind _ (PRef _ f) [])+ prettySe d p bnd (PAppBind _ (PRef _ _ f) []) | not (ppopt_impl ppo) = text "!" <> prettyName True (ppopt_impl ppo) bnd f- prettySe p bnd (PApp _ (PRef _ op) args) -- infix operators+ prettySe d p bnd (PApp _ (PRef _ _ op) args) -- infix operators | UN nm <- basename op , not (tnull nm) && (not (ppopt_impl ppo)) && (not $ isAlpha (thead nm)) = case getShowArgs args of [] -> opName True- [x] -> group (opName True <$> group (prettySe startPrec bnd (getTm x)))+ [x] -> group (opName True <$> group (prettySe (decD d) startPrec bnd (getTm x))) [l,r] -> let precedence = maybe (startPrec - 1) prec f- in bracket p precedence $ inFix (getTm l) (getTm r)+ in depth d . bracket p precedence $ inFix (getTm l) (getTm r) (l@(PExp _ _ _ _) : r@(PExp _ _ _ _) : rest) ->- bracket p funcAppPrec $+ depth d . bracket p funcAppPrec $ enclose lparen rparen (inFix (getTm l) (getTm r)) <+>- align (group (vsep (map (prettyArgS bnd) rest)))- as -> opName True <+> align (vsep (map (prettyArgS bnd) as))+ align (group (vsep (map (prettyArgS d bnd) rest)))+ as -> opName True <+> align (vsep (map (prettyArgS d bnd) as)) where opName isPrefix = prettyName isPrefix (ppopt_impl ppo) bnd op f = getFixity (opStr op) left = case f of@@ -1542,26 +1742,26 @@ Just (Infixr p') -> p' Just f' -> prec f' + 1 inFix l r = align . group $- (prettySe left bnd l <+> opName False) <$>- group (prettySe right bnd r)- prettySe p bnd (PApp _ hd@(PRef fc f) [tm]) -- symbols, like 'foo+ (prettySe (decD d) left bnd l <+> opName False) <$>+ group (prettySe (decD d) right bnd r)+ prettySe d p bnd (PApp _ hd@(PRef fc _ f) [tm]) -- symbols, like 'foo | PConstant NoFC (Idris.Core.TT.Str str) <- getTm tm, f == sUN "Symbol_" = annotate (AnnType ("'" ++ str) ("The symbol " ++ str)) $- char '\'' <> prettySe startPrec bnd (PRef fc (sUN str))- prettySe p bnd (PApp _ f as) = -- Normal prefix applications+ char '\'' <> prettySe (decD d) startPrec bnd (PRef fc [] (sUN str))+ prettySe d p bnd (PApp _ f as) = -- Normal prefix applications let args = getShowArgs as- fp = prettySe (startPrec + 1) bnd f+ fp = prettySe (decD d) (startPrec + 1) bnd f shownArgs = if ppopt_impl ppo then as else args in- bracket p funcAppPrec . group $+ depth d . bracket p funcAppPrec . group $ if null shownArgs then fp- else fp <+> align (vsep (map (prettyArgS bnd) shownArgs))- prettySe p bnd (PCase _ scr cases) =- align $ kwd "case" <+> prettySe startPrec bnd scr <+> kwd "of" <$>- indent 2 (vsep (map ppcase cases))+ else fp <+> align (vsep (map (prettyArgS d bnd) shownArgs))+ prettySe d p bnd (PCase _ scr cases) =+ align $ kwd "case" <+> prettySe (decD d) startPrec bnd scr <+> kwd "of" <$>+ depth d (indent 2 (vsep (map ppcase cases))) where- ppcase (l, r) = let prettyCase = prettySe startPrec+ ppcase (l, r) = let prettyCase = prettySe (decD d) startPrec ([(n, False) | n <- vars l] ++ bnd) in nest nestingSize $ prettyCase l <+> text "=>" <+> prettyCase r@@ -1579,70 +1779,97 @@ noNS (NS _ _) = False noNS _ = True - prettySe p bnd (PIfThenElse _ c t f) =- group . align . hang 2 . vsep $- [ kwd "if" <+> prettySe startPrec bnd c- , kwd "then" <+> prettySe startPrec bnd t- , kwd "else" <+> prettySe startPrec bnd f+ prettySe d p bnd (PIfThenElse _ c t f) =+ depth d . bracket p funcAppPrec . group . align . hang 2 . vsep $+ [ kwd "if" <+> prettySe (decD d) startPrec bnd c+ , kwd "then" <+> prettySe (decD d) startPrec bnd t+ , kwd "else" <+> prettySe (decD d) startPrec bnd f ]- prettySe p bnd (PHidden tm) = text "." <> prettySe funcAppPrec bnd tm- prettySe p bnd (PResolveTC _) = kwd "%instance"- prettySe p bnd (PTrue _ IsType) = annName unitTy $ text "()"- prettySe p bnd (PTrue _ IsTerm) = annName unitCon $ text "()"- prettySe p bnd (PTrue _ TypeOrTerm) = text "()"- prettySe p bnd (PRewrite _ l r _) =- bracket p startPrec $- text "rewrite" <+> prettySe (startPrec + 1) bnd l <+> text "in" <+> prettySe startPrec bnd r- prettySe p bnd (PTyped l r) =- lparen <> prettySe startPrec bnd l <+> colon <+> prettySe startPrec bnd r <> rparen- prettySe p bnd pair@(PPair _ pun _ _) -- flatten tuples to the right, like parser- | Just elts <- pairElts pair = enclose (ann lparen) (ann rparen) .+ prettySe d p bnd (PHidden tm) = text "." <> prettySe (decD d) funcAppPrec bnd tm+ prettySe d p bnd (PResolveTC _) = kwd "%instance"+ prettySe d p bnd (PTrue _ IsType) = annName unitTy $ text "()"+ prettySe d p bnd (PTrue _ IsTerm) = annName unitCon $ text "()"+ prettySe d p bnd (PTrue _ TypeOrTerm) = text "()"+ prettySe d p bnd (PRewrite _ l r _) =+ depth d . bracket p startPrec $+ text "rewrite" <+> prettySe (decD d) (startPrec + 1) bnd l <+> text "in" <+> prettySe (decD d) startPrec bnd r+ prettySe d p bnd (PTyped l r) =+ lparen <> prettySe (decD d) startPrec bnd l <+> colon <+> prettySe (decD d) startPrec bnd r <> rparen+ prettySe d p bnd pair@(PPair _ _ pun _ _) -- flatten tuples to the right, like parser+ | Just elts <- pairElts pair = depth d . enclose (ann lparen) (ann rparen) . align . group . vsep . punctuate (ann comma) $- map (prettySe startPrec bnd) elts+ map (prettySe (decD d) startPrec bnd) elts where ann = case pun of TypeOrTerm -> id IsType -> annName pairTy IsTerm -> annName pairCon- prettySe p bnd (PDPair _ pun l t r) =+ prettySe d p bnd (PDPair _ _ pun l t r) =+ depth d $ annotated lparen <> left <+> annotated (text "**") <+>- prettySe startPrec (addBinding bnd) r <>+ prettySe (decD d) startPrec (addBinding bnd) r <> annotated rparen where annotated = case pun of IsType -> annName sigmaTy IsTerm -> annName sigmaCon TypeOrTerm -> id (left, addBinding) = case (l, pun) of- (PRef _ n, IsType) -> (bindingOf n False <+> text ":" <+> prettySe startPrec bnd t, ((n, False) :))- _ -> (prettySe startPrec bnd l, id )- prettySe p bnd (PAlternative a as) =+ (PRef _ _ n, IsType) -> (bindingOf n False <+> text ":" <+> prettySe (decD d) startPrec bnd t, ((n, False) :))+ _ -> (prettySe (decD d) startPrec bnd l, id)+ prettySe d p bnd (PAlternative ns a as) = lparen <> text "|" <> prettyAs <> text "|" <> rparen where prettyAs =- foldr (\l -> \r -> l <+> text "," <+> r) empty $ map (prettySe startPrec bnd) as- prettySe p bnd (PType _) = annotate (AnnType "Type" "The type of types") $ text "Type"- prettySe p bnd (PUniverse u) = annotate (AnnType (show u) "The type of unique types") $ text (show u)- prettySe p bnd (PConstant _ c) = annotate (AnnConst c) (text (show c))+ foldr (\l -> \r -> l <+> text "," <+> r) empty $ map (depth d . prettySe (decD d) startPrec bnd) as+ prettySe d p bnd (PType _) = annotate (AnnType "Type" "The type of types") $ text "Type"+ prettySe d p bnd (PUniverse u) = annotate (AnnType (show u) "The type of unique types") $ text (show u)+ prettySe d p bnd (PConstant _ c) = annotate (AnnConst c) (text (show c)) -- XXX: add pretty for tactics- prettySe p bnd (PProof ts) =- kwd "proof" <+> lbrace <> text "..." <> rbrace- prettySe p bnd (PTactics ts) =- kwd "tactics" <+> lbrace <> text "..." <> rbrace- prettySe p bnd (PMetavar _ n) = annotate (AnnName n (Just MetavarOutput) Nothing Nothing) $ text "?" <> pretty n- prettySe p bnd (PReturn f) = kwd "return"- prettySe p bnd PImpossible = kwd "impossible"- prettySe p bnd Placeholder = text "_"- prettySe p bnd (PDoBlock _) = text "do block pretty not implemented"- prettySe p bnd (PCoerced t) = prettySe p bnd t- prettySe p bnd (PElabError s) = pretty s+ prettySe d p bnd (PProof ts) =+ kwd "proof" <+> lbrace <> ellipsis <> rbrace+ prettySe d p bnd (PTactics ts) =+ kwd "tactics" <+> lbrace <> ellipsis <> rbrace+ prettySe d p bnd (PMetavar _ n) = annotate (AnnName n (Just MetavarOutput) Nothing Nothing) $ text "?" <> pretty n+ prettySe d p bnd (PReturn f) = kwd "return"+ prettySe d p bnd PImpossible = kwd "impossible"+ prettySe d p bnd Placeholder = text "_"+ prettySe d p bnd (PDoBlock dos) =+ bracket p startPrec $+ kwd "do" <+> align (vsep (map (group . align . hang 2) (ppdo bnd dos)))+ where ppdo bnd (DoExp _ tm:dos) = prettySe (decD d) startPrec bnd tm : ppdo bnd dos+ ppdo bnd (DoBind _ bn _ tm : dos) =+ (prettyBindingOf bn False <+> text "<-" <+>+ group (align (hang 2 (prettySe (decD d) startPrec bnd tm)))) :+ ppdo ((bn, False):bnd) dos+ ppdo bnd (DoBindP _ _ _ _ : dos) = -- ok because never made by delab+ text "no pretty printer for pattern-matching do binding" :+ ppdo bnd dos+ ppdo bnd (DoLet _ ln _ ty v : dos) =+ (kwd "let" <+> prettyBindingOf ln False <+>+ (if ty /= Placeholder+ then colon <+> prettySe (decD d) startPrec bnd ty <+> text "="+ else text "=") <+>+ group (align (hang 2 (prettySe (decD d) startPrec bnd v)))) :+ ppdo ((ln, False):bnd) dos+ ppdo bnd (DoLetP _ _ _ : dos) = -- ok because never made by delab+ text "no pretty printer for pattern-matching do binding" :+ ppdo bnd dos+ ppdo _ [] = []+ prettySe d p bnd (PCoerced t) = prettySe d p bnd t+ prettySe d p bnd (PElabError s) = pretty s -- Quasiquote pprinting ignores bound vars- prettySe p bnd (PQuasiquote t Nothing) = text "`(" <> prettySe p [] t <> text ")"- prettySe p bnd (PQuasiquote t (Just g)) = text "`(" <> prettySe p [] t <+> colon <+> prettySe p [] g <> text ")"- prettySe p bnd (PUnquote t) = text "~" <> prettySe p bnd t- prettySe p bnd (PQuoteName n) = text "`{" <> prettyName True (ppopt_impl ppo) bnd n <> text "}"+ prettySe d p bnd (PQuasiquote t Nothing) = text "`(" <> prettySe (decD d) p [] t <> text ")"+ prettySe d p bnd (PQuasiquote t (Just g)) = text "`(" <> prettySe (decD d) p [] t <+> colon <+> prettySe (decD d) p [] g <> text ")"+ prettySe d p bnd (PUnquote t) = text "~" <> prettySe (decD d) p bnd t+ prettySe d p bnd (PQuoteName n _) = text "`{" <> prettyName True (ppopt_impl ppo) bnd n <> text "}"+ prettySe d p bnd (PRunElab _ tm _) =+ bracket p funcAppPrec . group . align . hang 2 $+ text "%runElab" <$>+ prettySe (decD d) funcAppPrec bnd tm+ prettySe d p bnd (PConstSugar fc tm) = prettySe d p bnd tm -- should never occur, but harmless - prettySe p bnd _ = text "missing pretty-printer for term"+ prettySe d p bnd _ = text "missing pretty-printer for term" prettyBindingOf :: Name -> Bool -> Doc OutputAnnotation prettyBindingOf n imp = annotate (AnnBoundName n imp) (text (display n))@@ -1652,15 +1879,15 @@ display (NS n ns) = (concat . intersperse "." . map T.unpack . reverse) ns ++ "." ++ display n display n = show n - prettyArgS bnd (PImp _ _ _ n tm) = prettyArgSi bnd (n, tm)- prettyArgS bnd (PExp _ _ _ tm) = prettyArgSe bnd tm- prettyArgS bnd (PConstraint _ _ _ tm) = prettyArgSc bnd tm- prettyArgS bnd (PTacImplicit _ _ n _ tm) = prettyArgSti bnd (n, tm)+ prettyArgS d bnd (PImp _ _ _ n tm) = prettyArgSi d bnd (n, tm)+ prettyArgS d bnd (PExp _ _ _ tm) = prettyArgSe d bnd tm+ prettyArgS d bnd (PConstraint _ _ _ tm) = prettyArgSc d bnd tm+ prettyArgS d bnd (PTacImplicit _ _ n _ tm) = prettyArgSti d bnd (n, tm) - prettyArgSe bnd arg = prettySe (funcAppPrec + 1) bnd arg- prettyArgSi bnd (n, val) = lbrace <> pretty n <+> text "=" <+> prettySe startPrec bnd val <> rbrace- prettyArgSc bnd val = lbrace <> lbrace <> prettySe startPrec bnd val <> rbrace <> rbrace- prettyArgSti bnd (n, val) = lbrace <> kwd "auto" <+> pretty n <+> text "=" <+> prettySe startPrec bnd val <> rbrace+ prettyArgSe d bnd arg = prettySe d (funcAppPrec + 1) bnd arg+ prettyArgSi d bnd (n, val) = lbrace <> pretty n <+> text "=" <+> prettySe (decD d) startPrec bnd val <> rbrace+ prettyArgSc d bnd val = lbrace <> lbrace <> prettySe (decD d) startPrec bnd val <> rbrace <> rbrace+ prettyArgSti d bnd (n, val) = lbrace <> kwd "auto" <+> pretty n <+> text "=" <+> prettySe (decD d) startPrec bnd val <> rbrace annName :: Name -> Doc OutputAnnotation -> Doc OutputAnnotation annName n = annotate (AnnName n Nothing Nothing Nothing)@@ -1669,55 +1896,65 @@ opStr (NS n _) = opStr n opStr (UN n) = T.unpack n - slist' _ _ e+ slist' :: Maybe Int -> Int -> [(Name, Bool)] -> PTerm -> Maybe [Doc OutputAnnotation]+ slist' (Just d) _ _ _ | d <= 0 = Nothing+ slist' d _ _ e | containsHole e = Nothing- slist' p bnd (PApp _ (PRef _ nil) _)+ slist' d p bnd (PApp _ (PRef _ _ nil) _) | not (ppopt_impl ppo) && nsroot nil == sUN "Nil" = Just []- slist' p bnd (PRef _ nil)+ slist' d p bnd (PRef _ _ nil) | not (ppopt_impl ppo) && nsroot nil == sUN "Nil" = Just []- slist' p bnd (PApp _ (PRef _ cons) args)+ slist' d p bnd (PApp _ (PRef _ _ cons) args) | nsroot cons == sUN "::", (PExp {getTm=tl}):(PExp {getTm=hd}):imps <- reverse args, all isImp imps,- Just tl' <- slist' p bnd tl- = Just (hd:tl')+ Just tl' <- slist' (decD d) p bnd tl+ = Just (prettySe d startPrec bnd hd : tl') where isImp (PImp {}) = True isImp _ = False- slist' _ _ tm = Nothing+ slist' _ _ _ tm = Nothing - slist p bnd e | Just es <- slist' p bnd e = Just $- case es of [] -> annotate (AnnData "" "") $ text "[]"- [x] -> enclose left right . group $- prettySe p bnd x- xs -> (enclose left right .- align . group . vsep .- punctuate comma .- map (prettySe p bnd)) xs+ slist d p bnd e | Just es <- slist' d p bnd e = Just $+ case es of+ [] -> annotate (AnnData "" "") $ text "[]"+ [x] -> enclose left right . group $ x+ xs -> enclose left right .+ align . group . vsep .+ punctuate comma $ xs where left = (annotate (AnnData "" "") (text "[")) right = (annotate (AnnData "" "") (text "]")) comma = (annotate (AnnData "" "") (text ","))- slist _ _ _ = Nothing+ slist _ _ _ _ = Nothing pairElts :: PTerm -> Maybe [PTerm]- pairElts (PPair _ _ x y) | Just elts <- pairElts y = Just (x:elts)- | otherwise = Just [x, y]+ pairElts (PPair _ _ _ x y) | Just elts <- pairElts y = Just (x:elts)+ | otherwise = Just [x, y] pairElts _ = Nothing natns = "Prelude.Nat." - snat p (PRef _ z)+ snat :: Maybe Int -> Int -> PTerm -> Maybe Integer+ snat (Just x) _ _ | x <= 0 = Nothing+ snat d p (PRef _ _ z) | show z == (natns++"Z") || show z == "Z" = Just 0- snat p (PApp _ s [PExp {getTm=n}])+ snat d p (PApp _ s [PExp {getTm=n}]) | show s == (natns++"S") || show s == "S",- Just n' <- snat p n+ Just n' <- snat (decD d) p n = Just $ 1 + n'- snat _ _ = Nothing+ snat _ _ _ = Nothing bracket outer inner doc | outer > inner = lparen <> doc <> rparen | otherwise = doc + ellipsis = text "..."++ depth Nothing = id+ depth (Just d) = if d <= 0 then const (ellipsis) else id++ decD = fmap (\x -> x - 1)+ kwd = annotate AnnKeyword . text fixities :: M.Map String Fixity@@ -1739,7 +1976,7 @@ -- | Check whether a PTerm has been delaborated from a Term containing a Hole or Guess containsHole :: PTerm -> Bool-containsHole pterm = or [isHoleName n | PRef _ n <- take 1000 $ universe pterm]+containsHole pterm = or [isHoleName n | PRef _ _ n <- take 1000 $ universe pterm] -- | Pretty-printer helper for names that attaches the correct annotations prettyName@@ -1872,11 +2109,14 @@ showTmImpls :: PTerm -> String showTmImpls = flip (displayS . renderCompact . prettyImp verbosePPOption) "" +-- | Show a term with specific options +showTmOpts :: PPOption -> PTerm -> String+showTmOpts opt = flip (displayS . renderPretty 1.0 10000000 . prettyImp opt) "" instance Sized PTerm where size (PQuote rawTerm) = size rawTerm- size (PRef fc name) = size name+ size (PRef fc _ name) = size name size (PLam fc name _ ty bdy) = 1 + size ty + size bdy size (PPi plicity name fc ty bdy) = 1 + size ty + size fc + size bdy size (PLet fc name nfc ty def bdy) = 1 + size ty + size def + size bdy@@ -1888,9 +2128,9 @@ size (PTrue fc _) = 1 size (PResolveTC fc) = 1 size (PRewrite fc left right _) = 1 + size left + size right- size (PPair fc _ left right) = 1 + size left + size right- size (PDPair fs _ left ty right) = 1 + size left + size ty + size right- size (PAlternative a alts) = 1 + size alts+ size (PPair fc _ _ left right) = 1 + size left + size right+ size (PDPair fs _ _ left ty right) = 1 + size left + size ty + size right+ size (PAlternative _ a alts) = 1 + size alts size (PHidden hidden) = size hidden size (PUnifyLog tm) = size tm size (PDisamb _ tm) = size tm@@ -1917,7 +2157,7 @@ allNamesIn :: PTerm -> [Name] allNamesIn tm = nub $ ni [] tm where -- TODO THINK added niTacImp, but is it right?- ni env (PRef _ n)+ ni env (PRef _ _ n) | not (n `elem` env) = [n] ni env (PPatvar _ n) = [n] ni env (PApp _ f as) = ni env f ++ concatMap (ni env) (map getTm as)@@ -1926,13 +2166,15 @@ ni env (PIfThenElse _ c t f) = ni env c ++ ni env t ++ ni env f ni env (PLam fc n _ ty sc) = ni env ty ++ ni (n:env) sc ni env (PPi p n _ ty sc) = niTacImp env p ++ ni env ty ++ ni (n:env) sc+ ni env (PLet _ n _ ty val sc) = ni env ty ++ ni env val ++ ni (n:env) sc ni env (PHidden tm) = ni env tm ni env (PRewrite _ l r _) = ni env l ++ ni env r ni env (PTyped l r) = ni env l ++ ni env r- ni env (PPair _ _ l r) = ni env l ++ ni env r- ni env (PDPair _ _ (PRef _ n) t r) = ni env t ++ ni (n:env) r- ni env (PDPair _ _ l t r) = ni env l ++ ni env t ++ ni env r- ni env (PAlternative a ls) = concatMap (ni env) ls+ ni env (PPair _ _ _ l r) = ni env l ++ ni env r+ ni env (PDPair _ _ _ (PRef _ _ n) Placeholder r) = n : ni env r+ ni env (PDPair _ _ _ (PRef _ _ n) t r) = ni env t ++ ni (n:env) r+ ni env (PDPair _ _ _ l t r) = ni env l ++ ni env t ++ ni env r+ ni env (PAlternative ns a ls) = concatMap (ni env) ls ni env (PUnifyLog tm) = ni env tm ni env (PDisamb _ tm) = ni env tm ni env (PNoImplicits tm) = ni env tm@@ -1955,10 +2197,10 @@ ni set (PPi p n _ ty sc) = niTacImp (S.insert n $ ni (ni set ty) sc) p ni set (PRewrite _ l r _) = ni (ni set l) r ni set (PTyped l r) = ni (ni set l) r- ni set (PPair _ _ l r) = ni (ni set l) r- ni set (PDPair _ _ (PRef _ n) t r) = ni (ni set t) r- ni set (PDPair _ _ l t r) = ni (ni (ni set l) t) r- ni set (PAlternative a as) = niTms set as+ ni set (PPair _ _ _ l r) = ni (ni set l) r+ ni set (PDPair _ _ _ (PRef _ _ n) t r) = ni (ni set t) r+ ni set (PDPair _ _ _ l t r) = ni (ni (ni set l) t) r+ ni set (PAlternative ns a as) = niTms set as ni set (PHidden tm) = ni set tm ni set (PUnifyLog tm) = ni set tm ni set (PDisamb _ tm) = ni set tm@@ -1975,12 +2217,12 @@ implicitNamesIn :: [Name] -> IState -> PTerm -> [Name] implicitNamesIn uvars ist tm = nub $ ni [] tm where- ni env (PRef _ n)+ ni env (PRef _ _ n) | not (n `elem` env) = case lookupTy n (tt_ctxt ist) of [] -> [n] _ -> if n `elem` uvars then [n] else []- ni env (PApp _ f@(PRef _ n) as)+ ni env (PApp _ f@(PRef _ _ n) as) | n `elem` uvars = ni env f ++ concatMap (ni env) (map getTm as) | otherwise = concatMap (ni env) (map getTm as) ni env (PApp _ f as) = ni env f ++ concatMap (ni env) (map getTm as)@@ -1994,10 +2236,10 @@ ni env (PPi p n _ ty sc) = ni env ty ++ ni (n:env) sc ni env (PRewrite _ l r _) = ni env l ++ ni env r ni env (PTyped l r) = ni env l ++ ni env r- ni env (PPair _ _ l r) = ni env l ++ ni env r- ni env (PDPair _ _ (PRef _ n) t r) = ni env t ++ ni (n:env) r- ni env (PDPair _ _ l t r) = ni env l ++ ni env t ++ ni env r- ni env (PAlternative a as) = concatMap (ni env) as+ ni env (PPair _ _ _ l r) = ni env l ++ ni env r+ ni env (PDPair _ _ _ (PRef _ _ n) t r) = ni env t ++ ni (n:env) r+ ni env (PDPair _ _ _ l t r) = ni env l ++ ni env t ++ ni env r+ ni env (PAlternative ns a as) = concatMap (ni env) as ni env (PHidden tm) = ni env tm ni env (PUnifyLog tm) = ni env tm ni env (PDisamb _ tm) = ni env tm@@ -2008,7 +2250,7 @@ namesIn :: [(Name, PTerm)] -> IState -> PTerm -> [Name] namesIn uvars ist tm = nub $ ni [] tm where- ni env (PRef _ n)+ ni env (PRef _ _ n) | not (n `elem` env) = case lookupTy n (tt_ctxt ist) of [] -> [n]@@ -2024,10 +2266,10 @@ ni env (PPi p n _ ty sc) = niTacImp env p ++ ni env ty ++ ni (n:env) sc ni env (PRewrite _ l r _) = ni env l ++ ni env r ni env (PTyped l r) = ni env l ++ ni env r- ni env (PPair _ _ l r) = ni env l ++ ni env r- ni env (PDPair _ _ (PRef _ n) t r) = ni env t ++ ni (n:env) r- ni env (PDPair _ _ l t r) = ni env l ++ ni env t ++ ni env r- ni env (PAlternative a as) = concatMap (ni env) as+ ni env (PPair _ _ _ l r) = ni env l ++ ni env r+ ni env (PDPair _ _ _ (PRef _ _ n) t r) = ni env t ++ ni (n:env) r+ ni env (PDPair _ _ _ l t r) = ni env l ++ ni env t ++ ni env r+ ni env (PAlternative ns a as) = concatMap (ni env) as ni env (PHidden tm) = ni env tm ni env (PUnifyLog tm) = ni env tm ni env (PDisamb _ tm) = ni env tm@@ -2042,7 +2284,7 @@ usedNamesIn :: [Name] -> IState -> PTerm -> [Name] usedNamesIn vars ist tm = nub $ ni [] tm where -- TODO THINK added niTacImp, but is it right?- ni env (PRef _ n)+ ni env (PRef _ _ n) | n `elem` vars && not (n `elem` env) = case lookupDefExact n (tt_ctxt ist) of Nothing -> [n]@@ -2055,10 +2297,10 @@ ni env (PPi p n _ ty sc) = niTacImp env p ++ ni env ty ++ ni (n:env) sc ni env (PRewrite _ l r _) = ni env l ++ ni env r ni env (PTyped l r) = ni env l ++ ni env r- ni env (PPair _ _ l r) = ni env l ++ ni env r- ni env (PDPair _ _ (PRef _ n) t r) = ni env t ++ ni (n:env) r- ni env (PDPair _ _ l t r) = ni env l ++ ni env t ++ ni env r- ni env (PAlternative a as) = concatMap (ni env) as+ ni env (PPair _ _ _ l r) = ni env l ++ ni env r+ ni env (PDPair _ _ _ (PRef _ _ n) t r) = ni env t ++ ni (n:env) r+ ni env (PDPair _ _ _ l t r) = ni env l ++ ni env t ++ ni env r+ ni env (PAlternative ns a as) = concatMap (ni env) as ni env (PHidden tm) = ni env tm ni env (PUnifyLog tm) = ni env tm ni env (PDisamb _ tm) = ni env tm
src/Idris/CaseSplit.hs view
@@ -32,7 +32,6 @@ import Text.Parser.Char(anyChar) import Text.Trifecta(Result(..), parseString) import Text.Trifecta.Delta-import qualified Data.ByteString.UTF8 as UTF8 import Debug.Trace @@ -72,7 +71,7 @@ Nothing -> ifail $ show n ++ " is not a pattern variable" Just ty -> do let splits = findPats ist ty- iLOG ("New patterns " ++ showSep ", " + logLvl 1 ("New patterns " ++ showSep ", " (map showTmImpls splits)) let newPats_in = zipWith (replaceVar ctxt n) splits (repeat t) logLvl 4 ("Working from " ++ show t)@@ -84,7 +83,7 @@ (showSep "\n" (map show (mapMaybe id newPats)))) logLvl 3 "----" let newPats' = mergeAllPats ist n t (mapMaybe id newPats)- iLOG ("Name updates " ++ showSep "\n"+ logLvl 1 ("Name updates " ++ showSep "\n" (map (\ (p, u) -> show u ++ " " ++ show p) newPats')) return (map snd newPats') @@ -128,7 +127,7 @@ stripNS :: Idris.AbsSyntaxTree.PTerm -> Idris.AbsSyntaxTree.PTerm stripNS tm = mapPT dens tm where- dens (PRef fc n) = PRef fc (nsroot n)+ dens (PRef fc hls n) = PRef fc hls (nsroot n) dens t = t mergeAllPats :: IState -> Name -> PTerm -> [PTerm] -> [(PTerm, [(Name, PTerm)])]@@ -138,7 +137,7 @@ (MS [] [] (filter (/=cv) (patvars t)) []) ps' = mergeAllPats ist cv t ps in ((p', u) : ps')- where patvars (PRef _ n) = [n]+ where patvars (PRef _ _ n) = [n] patvars (PApp _ _ as) = concatMap (patvars . getTm) as patvars (PPatvar _ n) = [n] patvars _ = []@@ -147,19 +146,19 @@ -- If any names are unified, make sure they stay unified. Always prefer -- user provided name (first pattern) mergePat ist (PPatvar fc n) new t- = mergePat ist (PRef fc n) new t+ = mergePat ist (PRef fc [] n) new t mergePat ist old (PPatvar fc n) t- = mergePat ist old (PRef fc n) t-mergePat ist orig@(PRef fc n) new@(PRef _ n') t+ = mergePat ist old (PRef fc [] n) t+mergePat ist orig@(PRef fc _ n) new@(PRef _ _ n') t | isDConName n' (tt_ctxt ist) = do addUpdate n new return new | otherwise = do ms <- get case lookup n' (namemap ms) of- Just x -> do addUpdate n (PRef fc x)- return (PRef fc x)+ Just x -> do addUpdate n (PRef fc [] x)+ return (PRef fc [] x) Nothing -> do put (ms { namemap = ((n', n) : namemap ms) })- return (PRef fc n)+ return (PRef fc [] n) mergePat ist (PApp _ _ args) (PApp fc f args') t = do newArgs <- zipWithM mergeArg args (zip args' (argTys ist f)) return (PApp fc f newArgs)@@ -170,16 +169,16 @@ return (y { machine_inf = machine_inf x, getTm = tm' }) _ -> return (y { getTm = tm' })-mergePat ist (PRef fc n) tm ty = do tm <- tidy ist tm ty- addUpdate n tm- return tm+mergePat ist (PRef fc _ n) tm ty = do tm <- tidy ist tm ty+ addUpdate n tm+ return tm mergePat ist x y t = return y mergeUserImpl :: PTerm -> PTerm -> PTerm mergeUserImpl x y = x argTys :: IState -> PTerm -> [Maybe Name]-argTys ist (PRef fc n) +argTys ist (PRef fc hls n) = case lookupTy n (tt_ctxt ist) of [ty] -> map (tyName . snd) (getArgTys ty) ++ repeat Nothing _ -> repeat Nothing@@ -189,14 +188,14 @@ argTys _ _ = repeat Nothing tidy :: IState -> PTerm -> Maybe Name -> State MergeState PTerm-tidy ist orig@(PRef fc n) ty+tidy ist orig@(PRef fc hls n) ty = do ms <- get case lookup n (namemap ms) of- Just x -> return (PRef fc x)+ Just x -> return (PRef fc [] x) Nothing -> case n of (UN _) -> return orig _ -> do n' <- inventName ist ty n- return (PRef fc n')+ return (PRef fc [] n') tidy ist (PApp fc f args) ty = do args' <- zipWithM tidyArg args (argTys ist f) return (PApp fc f args')@@ -223,7 +222,7 @@ [ti] -> map genPat (con_names ti) _ -> [Placeholder] where genPat n = case lookupCtxt n (idris_implicits ist) of- [args] -> PApp emptyFC (PRef emptyFC n)+ [args] -> PApp emptyFC (PRef emptyFC [] n) (map toPlaceholder args) _ -> error $ "Can't happen (genPat) " ++ show n toPlaceholder tm = tm { getTm = Placeholder }@@ -234,10 +233,10 @@ where subst :: PTerm -> PTerm subst orig@(PPatvar _ v) | v == n = t | otherwise = Placeholder- subst orig@(PRef _ v) | v == n = t- | isDConName v ctxt = orig- subst (PRef _ _) = Placeholder- subst (PApp fc (PRef _ t) pats) + subst orig@(PRef _ _ v) | v == n = t+ | isDConName v ctxt = orig+ subst (PRef _ _ _) = Placeholder+ subst (PApp fc (PRef _ _ t) pats) | isTConName t ctxt = Placeholder -- infer types subst (PApp fc f pats) = PApp fc f (map substArg pats) subst x = x@@ -266,24 +265,29 @@ rep str ((n, tm) : ups) = rep (updatePat False (show n) (nshow tm) str) ups updateRHSs i [] = return []- updateRHSs i (x : xs) = do (x', i') <- updateRHS i x+ updateRHSs i (x : xs) = do (x', i') <- updateRHS (null xs) i x xs' <- updateRHSs i' xs return (x' : xs') - updateRHS i ('?':'=':xs) = do (xs', i') <- updateRHS i xs- return ("?=" ++ xs', i')- updateRHS i ('?':xs) = do let (nm, rest) = span (not . isSpace) xs- (nm', i') <- getUniq nm i- return ('?':nm' ++ rest, i')- updateRHS i (x : xs) = do (xs', i') <- updateRHS i xs- return (x : xs', i')- updateRHS i [] = return ("", i)+ updateRHS last i ('?':'=':xs) = do (xs', i') <- updateRHS last i xs+ return ("?=" ++ xs', i')+ updateRHS last i ('?':xs) + = do let (nm, rest_in) = span (not . (\x -> isSpace x || x == ')'+ || x == '(')) xs+ let rest = if last then rest_in else+ case span (not . (=='\n')) rest_in of+ (_, restnl) -> restnl+ (nm', i') <- getUniq nm i+ return ('?':nm' ++ rest, i')+ updateRHS last i (x : xs) = do (xs', i') <- updateRHS last i xs+ return (x : xs', i')+ updateRHS last i [] = return ("", i) -- TMP HACK: If there are Nats, we don't want to show as numerals since -- this isn't supported in a pattern, so special case here- nshow (PRef _ (UN z)) | z == txt "Z" = "Z"- nshow (PApp _ (PRef _ (UN s)) [x]) | s == txt "S" =+ nshow (PRef _ _ (UN z)) | z == txt "Z" = "Z"+ nshow (PApp _ (PRef _ _ (UN s)) [x]) | s == txt "S" = "(S " ++ addBrackets (nshow (getTm x)) ++ ")" nshow t = show t @@ -360,11 +364,13 @@ getNameFrom i used (PPi _ _ _ _ _) = uniqueNameFrom (mkSupply [sUN "f", sUN "g"]) used getNameFrom i used (PApp fc f as) = getNameFrom i used f- getNameFrom i used (PRef fc f) + getNameFrom i used (PRef fc _ f) = case getNameHints i f of- [] -> uniqueName (sUN "x") used+ [] -> uniqueNameFrom (mkSupply [sUN "x", sUN "y",+ sUN "z"]) used ns -> uniqueNameFrom (mkSupply ns) used- getNameFrom i used _ = uniqueName (sUN "x") used + getNameFrom i used _ = uniqueNameFrom (mkSupply [sUN "x", sUN "y",+ sUN "z"]) used -- write method declarations, indent with 4 spaces mkClassBodies :: IState -> [(Name, (FnOpts, PTerm))] -> String@@ -416,7 +422,7 @@ newPats return (map fst newPats') where- base (PApp fc f args) = PApp fc f (map (fmap (const (PRef fc (sUN "_")))) args)+ base (PApp fc f args) = PApp fc f (map (fmap (const (PRef fc [] (sUN "_")))) args) base t = t nm ptm = do mptm <- elabNewPat ptm
src/Idris/Chaser.hs view
@@ -90,11 +90,11 @@ btree done f = do i <- getIState let file = extractFileName f- iLOG $ "CHASING " ++ show file+ logLvl 1 $ "CHASING " ++ show file ibcsd <- valIBCSubDir i ids <- allImportDirs fp <- findImport ids ibcsd file- iLOG $ "Found " ++ show fp+ logLvl 1 $ "Found " ++ show fp mt <- runIO $ getIModTime fp if (file `elem` built) then return [MTree fp False mt []]@@ -116,29 +116,29 @@ else return [] mt <- idrisCatch (runIO $ getModificationTime fn) (\c -> runIO $ getIModTime src)- ok <- checkIBCUpToDate fn src- return [MTree (IBC fn src) ok mt ms]+ -- FIXME: It's also not up to date if anything it imports has+ -- been modified since its own ibc has.+ --+ -- Issue #1592 on the issue tracker.+ --+ -- https://github.com/idris-lang/Idris-dev/issues/1592+ ibcOutdated <- fn `younger` (getSrcFile src)+ -- FIXME (EB): The below 'hasValidIBCVersion' that's+ -- commented out appears to be breaking reloading in vim+ -- mode. Until we know why, I've commented it out.+ ibcValid <- return True -- hasValidIBCVersion fn+ return [MTree (IBC fn src) (ibcOutdated || not ibcValid) mt ms] getSrcFile (IBC _ src) = getSrcFile src getSrcFile (LIDR src) = src getSrcFile (IDR src) = src - -- FIXME: It's also not up to date if anything it imports has- -- been modified since its own ibc has.- --- -- Issue #1592 on the issue tracker.- --- -- https://github.com/idris-lang/Idris-dev/issues/1592-- checkIBCUpToDate fn (LIDR src) = older fn src- checkIBCUpToDate fn (IDR src) = older fn src-- older ibc src = do exist <- runIO $ doesFileExist src- if exist then do- ibct <- runIO $ getModificationTime ibc- srct <- runIO $ getModificationTime src- return (srct >= ibct)- else return False+ younger ibc src = do exist <- runIO $ doesFileExist src+ if exist then do+ ibct <- runIO $ getModificationTime ibc+ srct <- runIO $ getModificationTime src+ return (srct > ibct)+ else return False children :: Bool -> FilePath -> [FilePath] -> Idris [ModuleTree] children lit f done = -- idrisCatch
src/Idris/CmdOptions.hs view
@@ -78,12 +78,15 @@ parseFlags = many $ flag' NoBanner (long "nobanner" <> help "Suppress the banner") <|> flag' Quiet (short 'q' <> long "quiet" <> help "Quiet verbosity")+ -- IDE Mode Specific Flags <|> flag' Idemode (long "ide-mode" <> help "Run the Idris REPL with machine-readable syntax") <|> flag' IdemodeSocket (long "ide-mode-socket" <> help "Choose a socket for IDE mode to listen on") <|> flag' Idemode (long "ideslave" <> help "Deprecated version of --ide-mode") -- TODO: Remove in v0.9.18 <|> flag' IdemodeSocket (long "ideslave-socket" <> help "Deprecated version of --ide-mode-socket") -- TODO: Remove in v0.9.18 <|> (Client <$> strOption (long "client"))+ -- Logging Flags <|> (OLogging <$> option auto (long "log" <> metavar "LEVEL" <> help "Debugging log level"))+ -- Turn off Certain libraries. <|> flag' NoBasePkgs (long "nobasepkgs" <> help "Do not use the given base package") <|> flag' NoPrelude (long "noprelude" <> help "Do not use the given prelude") <|> flag' NoBuiltins (long "nobuiltins" <> help "Do not use the builtin functions")@@ -91,7 +94,7 @@ <|> (Output <$> strOption (short 'o' <> long "output" <> metavar "FILE" <> help "Specify output file")) -- <|> flag' TypeCase (long "typecase") <|> flag' Interface (long "interface" <> help "Generate interface files from ExportLists")- <|> flag' TypeInType (long "typeintype")+ <|> flag' TypeInType (long "typeintype" <> help "Turn off Universe checking") <|> flag' DefaultTotal (long "total" <> help "Require functions to be total by default") <|> flag' DefaultPartial (long "partial") <|> flag' WarnPartial (long "warnpartial" <> help "Warn about undeclared partial functions")@@ -123,11 +126,13 @@ <|> flag' (OutputTy MavenProject) (long "mvn" <> help "Create a maven project (for Java codegen)") <|> (DumpDefun <$> strOption (long "dumpdefuns")) <|> (DumpCases <$> strOption (long "dumpcases"))- <|> ((\s -> UseCodegen $ parseCodegen s) <$> strOption (long "codegen" <> metavar "TARGET" <> help "Select code generator: C, Java, bytecode"))+ <|> ((\s -> UseCodegen $ parseCodegen s) <$> strOption (long "codegen" <> metavar "TARGET" <> help "Select code generator: C, Javascript, Node and bytecode are bundled with Idris"))+ <|> (CodegenArgs <$> strOption (long "cg-opt" <> metavar "ARG" <> help "Arguments to pass to code generator")) <|> (EvalExpr <$> strOption (long "eval" <> short 'e' <> metavar "EXPR" <> help "Evaluate an expression without loading the REPL")) <|> flag' (InterpretScript "Main.main") (long "execute" <> help "Execute as idris") <|> (InterpretScript <$> strOption (long "exec" <> metavar "EXPR" <> help "Execute as idris")) <|> ((\s -> Extension $ getExt s) <$> strOption (long "extension" <> short 'X' <> metavar "EXT" <> help "Turn on language extension (TypeProviders or ErrorReflection)"))+ -- Optimisation Levels <|> flag' (OptLevel 3) (long "O3") <|> flag' (OptLevel 2) (long "O2") <|> flag' (OptLevel 1) (long "O1")@@ -137,11 +142,12 @@ <|> (OptLevel <$> option auto (short 'O' <> long "level")) <|> (TargetTriple <$> strOption (long "target" <> metavar "TRIPLE" <> help "Select target triple (for llvm codegen)")) <|> (TargetCPU <$> strOption (long "cpu" <> metavar "CPU" <> help "Select target CPU e.g. corei7 or cortex-m3 (for LLVM codegen)"))+ -- Colour Options <|> flag' (ColourREPL True) (long "colour" <> long "color" <> help "Force coloured output") <|> flag' (ColourREPL False) (long "nocolour" <> long "nocolor" <> help "Disable coloured output") <|> (UseConsoleWidth <$> option (str >>= parseConsoleWidth) (long "consolewidth" <> metavar "WIDTH" <> help "Select console width: auto, infinite, nat"))-+ <|> flag' DumpHighlights (long "highlight" <> help "Emit source code highlighting") where getExt s = case maybeRead s of@@ -178,6 +184,5 @@ integerReader :: ReadP Int integerReader = do- digits <- many1 $ satisfy isDigit + digits <- many1 $ satisfy isDigit return $ read digits-
src/Idris/Colours.hs view
@@ -4,9 +4,10 @@ defaultTheme, colouriseKwd, colouriseBound, colouriseImplicit, colourisePostulate, colouriseType, colouriseFun, colouriseData, colouriseKeyword,- colourisePrompt, colourise, ColourType(..)) where+ colourisePrompt, colourise, ColourType(..), hStartColourise, hEndColourise) where import System.Console.ANSI+import System.IO (Handle) data IdrisColour = IdrisColour { colour :: Maybe Color , vivid :: Bool@@ -42,15 +43,28 @@ , postulateColour = IdrisColour (Just Green) True False True False } +-- | Compute the ANSI colours corresponding to an Idris colour+mkSGR :: IdrisColour -> [SGR]+mkSGR (IdrisColour c v u b i) =+ fg c +++ (if u then [SetUnderlining SingleUnderline] else []) +++ (if b then [SetConsoleIntensity BoldIntensity] else []) +++ (if i then [SetItalicized True] else [])+ where+ fg Nothing = []+ fg (Just c) = [SetColor Foreground (if v then Vivid else Dull) c]+ -- | Set the colour of a string using POSIX escape codes colourise :: IdrisColour -> String -> String-colourise (IdrisColour c v u b i) str = setSGRCode sgr ++ str ++ setSGRCode [Reset]- where sgr = fg c ++- (if u then [SetUnderlining SingleUnderline] else []) ++- (if b then [SetConsoleIntensity BoldIntensity] else []) ++- (if i then [SetItalicized True] else [])- fg Nothing = []- fg (Just c) = [SetColor Foreground (if v then Vivid else Dull) c]+colourise c str = setSGRCode (mkSGR c) ++ str ++ setSGRCode [Reset]++-- | Start a colour on a handle, to support colour output on Windows+hStartColourise :: Handle -> IdrisColour -> IO ()+hStartColourise h c = hSetSGR h (mkSGR c)++-- | End a colour region on a handle+hEndColourise :: Handle -> IdrisColour -> IO ()+hEndColourise h _ = hSetSGR h [Reset] -- | Set the colour of a string using POSIX escape codes, with trailing '\STX' denoting the end -- (required by Haskeline in the prompt string)
src/Idris/Completion.hs view
@@ -52,7 +52,7 @@ metavars :: Idris [String] metavars = do i <- get- return . map (show . nsroot) $ map fst (filter (\(_, (_,_,t)) -> not t) (idris_metavars i)) \\ primDefs+ return . map (show . nsroot) $ map fst (filter (\(_, (_,_,_,t)) -> not t) (idris_metavars i)) \\ primDefs modules :: Idris [String]
src/Idris/Core/Binary.hs view
@@ -18,6 +18,7 @@ put (NamePart n) = do putWord8 1 ; put n put (TermPart t) = do putWord8 2 ; put t put (SubReport ps) = do putWord8 3 ; put ps+ put (RawPart r) = do putWord8 4 ; put r get = do i <- getWord8 case i of@@ -25,6 +26,7 @@ 1 -> fmap NamePart get 2 -> fmap TermPart get 3 -> fmap SubReport get+ 4 -> fmap RawPart get _ -> error "Corrupted binary data for ErrorReportPart" instance Binary Provenance where@@ -182,6 +184,10 @@ put (UnknownImplicit n f) = do putWord8 40 put n put f+ put (NoValidAlts ns) = do putWord8 41+ put ns+ put (RunningElabScript e) = do putWord8 42+ put e get = do i <- getWord8 case i of@@ -251,6 +257,8 @@ return (ElabScriptStuck x1) 40 -> do x <- get ; y <- get return $ UnknownImplicit x y+ 41 -> fmap NoValidAlts get+ 42 -> fmap RunningElabScript get _ -> error "Corrupted binary data for Err'" ----- Generated by 'derive' @@ -494,9 +502,10 @@ put x2 Hole x1 -> do putWord8 4 put x1- GHole x1 x2 -> do putWord8 5- put x1- put x2+ GHole x1 x2 x3 -> do putWord8 5+ put x1+ put x2+ put x3 Guess x1 x2 -> do putWord8 6 put x1 put x2@@ -523,7 +532,8 @@ return (Hole x1) 5 -> do x1 <- get x2 <- get- return (GHole x1 x2)+ x3 <- get+ return (GHole x1 x2 x3) 6 -> do x1 <- get x2 <- get return (Guess x1 x2)
src/Idris/Core/CaseTree.hs view
@@ -269,6 +269,8 @@ fstT (x, _, _) = x lstT (_, _, x) = x + -- Check that all pattern variables are reachable by a case split+ -- Otherwise, they won't make sense on the RHS. chkAccessible (avs, l, c) | phase == RunTime || reflect = return (l, c) | otherwise = do mapM_ (acc l) avs
src/Idris/Core/DeepSeq.hs view
@@ -76,7 +76,7 @@ = rnf x1 `seq` rnf x2 `seq` rnf x3 `seq` rnf x4 `seq` () rnf (CantInferType x1) = rnf x1 `seq` () rnf (CantMatch x1) = rnf x1 `seq` ()- rnf (ReflectionError x1 x2) = x1 `seq` rnf x2 `seq` ()+ rnf (ReflectionError x1 x2) = rnf x1 `seq` rnf x2 `seq` () rnf (ReflectionFailed x1 x2) = rnf x1 `seq` rnf x2 `seq` () rnf (CantSolveGoal x1 x2) = rnf x1 `seq` rnf x2 `seq` () rnf (UniqueError x1 x2) = rnf x1 `seq` rnf x2 `seq` ()@@ -93,6 +93,7 @@ rnf (CantResolve x1 x2) = rnf x1 `seq` rnf x2 `seq` () rnf (InvalidTCArg x1 x2) = rnf x1 `seq` rnf x2 `seq` () rnf (CantResolveAlts x1) = rnf x1 `seq` ()+ rnf (NoValidAlts x1) = rnf x1 `seq` () rnf (IncompleteTerm x1) = rnf x1 `seq` () rnf (NoEliminator x1 x2) = rnf x1 `seq` rnf x2 `seq` () rnf (UniverseError x1 x2 x3 x4 x5) = rnf x1 `seq` rnf x2 `seq` rnf x3 `seq` rnf x4 `seq` rnf x5 `seq` ()@@ -110,7 +111,15 @@ rnf (LoadingFailed x1 x2) = rnf x1 `seq` rnf x2 `seq` () rnf (ElabScriptDebug x1 x2 x3) = rnf x1 `seq` rnf x2 `seq` rnf x3 `seq` () rnf (ElabScriptStuck x1) = rnf x1 `seq` ()+ rnf (RunningElabScript x1) = rnf x1 `seq` () +instance NFData ErrorReportPart where+ rnf (TextPart x1) = rnf x1 `seq` ()+ rnf (TermPart x1) = rnf x1 `seq` ()+ rnf (RawPart x1) = rnf x1 `seq` ()+ rnf (NamePart x1) = rnf x1 `seq` ()+ rnf (SubReport x1) = rnf x1 `seq` ()+ instance NFData ImplicitInfo where rnf (Impl x1) = rnf x1 `seq` () @@ -120,7 +129,7 @@ rnf (Let x1 x2) = rnf x1 `seq` rnf x2 `seq` () rnf (NLet x1 x2) = rnf x1 `seq` rnf x2 `seq` () rnf (Hole x1) = rnf x1 `seq` ()- rnf (GHole x1 x2) = rnf x1 `seq` rnf x2 `seq` ()+ rnf (GHole x1 x2 x3) = rnf x1 `seq` rnf x2 `seq` rnf x3 `seq` () rnf (Guess x1 x2) = rnf x1 `seq` rnf x2 `seq` () rnf (PVar x1) = rnf x1 `seq` () rnf (PVTy x1) = rnf x1 `seq` ()@@ -191,6 +200,7 @@ rnf Productive = () rnf (Partial x1) = rnf x1 `seq` () rnf Unchecked = ()+ rnf Generated = () instance NFData PReason where rnf (Other x1) = rnf x1 `seq` ()
src/Idris/Core/Elaborate.hs view
@@ -51,6 +51,20 @@ let p' = p { dontunify = n : dontunify p } put (ES (p', a) s m) +-- Add a name that's okay to use in proof search (typically either because +-- it was given explicitly on the lhs, or intrduced as an explicit lambda+-- or let binding)+addPSname :: Name -> Elab' aux ()+addPSname n@(UN _)+ = do ES (p, a) s m <- get+ let p' = p { psnames = n : psnames p }+ put (ES (p', a) s m)+addPSname _ = return () -- can only use user given names++getPSnames :: Elab' aux [Name]+getPSnames = do ES (p, a) s m <- get+ return (psnames p)+ saveState :: Elab' aux () saveState = do e@(ES p s _) <- get put (ES p s (Just e))@@ -90,15 +104,25 @@ maxName m (_ : xs) = maxName m xs maxName m [] = m + 1 ++-- | Transform the error returned by an elaboration script, preserving+-- location information and proof search failure messages.+transformErr :: (Err -> Err) -> Elab' aux a -> Elab' aux a+transformErr f elab = do s <- get+ case runStateT elab s of+ OK (a, s') -> do put s'+ return $! a+ Error e -> lift $ Error (rewriteErr e)++ where+ rewriteErr (At f e) = At f (rewriteErr e)+ rewriteErr (ProofSearchFail e) = ProofSearchFail (rewriteErr e)+ rewriteErr e = f e+ errAt :: String -> Name -> Elab' aux a -> Elab' aux a-errAt thing n elab = do s <- get- case runStateT elab s of- OK (a, s') -> do put s'- return $! a- Error (At f e) ->- lift $ Error (At f (Elaborating thing n e))- Error e -> lift $ Error (Elaborating thing n e)+errAt thing n = transformErr (Elaborating thing n) + erun :: FC -> Elab' aux a -> Elab' aux a erun f elab = do s <- get case runStateT elab s of@@ -210,6 +234,13 @@ get_holes = do ES p _ _ <- get return $! (holes (fst p)) +get_usedns :: Elab' aux [Name]+get_usedns = do ES p _ _ <- get+ let bs = bound_in (pterm (fst p)) +++ bound_in_term (ptype (fst p))+ let nouse = holes (fst p) ++ bs ++ dontunify (fst p) ++ usedns (fst p)+ return $! nouse+ get_probs :: Elab' aux Fails get_probs = do ES p _ _ <- get return $! (problems (fst p))@@ -398,9 +429,10 @@ equiv :: Raw -> Elab' aux () equiv tm = processTactic' (Equiv tm) --- | Turn the current hole into a pattern variable with the provided name, made unique if MN+-- | Turn the current hole into a pattern variable with the provided+-- name, made unique if MN patvar :: Name -> Elab' aux ()-patvar n@(SN _) = do apply (Var n) []; solve +patvar n@(SN _) = do apply (Var n) []; solve patvar n = do env <- get_env hs <- get_holes if (n `elem` map fst env) then do apply (Var n) []; solve@@ -411,6 +443,15 @@ x -> return $! n processTactic' (PatVar n') +-- | Turn the current hole into a pattern variable with the provided+-- name, but don't make MNs unique.+patvar' :: Name -> Elab' aux ()+patvar' n@(SN _) = do apply (Var n) [] ; solve+patvar' n = do env <- get_env+ hs <- get_holes+ if (n `elem` map fst env) then do apply (Var n) [] ; solve+ else processTactic' (PatVar n)+ patbind :: Name -> Elab' aux () patbind n = processTactic' (PatBind n) @@ -553,7 +594,12 @@ rebind hs (App s f a) = App s (rebind hs f) (rebind hs a) rebind hs t = t -apply, match_apply :: Raw -> [(Bool, Int)] -> Elab' aux [(Name, Name)]+-- | Apply an operator, solving some arguments by unification or matching.+apply, match_apply :: Raw -- ^ The operator to apply+ -> [(Bool, Int)] -- ^ For each argument, whether to+ -- attempt to solve it and the+ -- priority in which to do so+ -> Elab' aux [(Name, Name)] apply = apply' fill match_apply = apply' match_fill @@ -564,7 +610,7 @@ -- (remove from unified list before calling end_unify) hs <- get_holes ES (p, a) s prev <- get- let dont = if null imps + let dont = if null imps then head hs : dontunify p else getNonUnify (head hs : dontunify p) imps args let (n, hunis) = -- trace ("AVOID UNIFY: " ++ show (fn, dont)) $@@ -684,7 +730,7 @@ s <- getNameFrom (sMN 0 "s") claim a RType claim b RType- claim f (RBind (sMN 0 "aX") (Pi Nothing (Var a) RType) (Var b))+ claim f (RBind (sMN 0 "_aX") (Pi Nothing (Var a) RType) (Var b)) tm <- get_term start_unify s -- if 'infer' is set, we're assuming it's a simply typed application@@ -758,9 +804,7 @@ Error e1 -> if p e1 then do case runStateT t2 s of OK (v, s') -> do put s'; return $! v- Error e2 -> if score e1 >= score e2- then lift (tfail e1)- else lift (tfail e2)+ Error e2 -> lift (tfail e2) else lift (tfail e1) try' :: Elab' aux a -> Elab' aux a -> Bool -> Elab' aux a@@ -776,15 +820,13 @@ if recoverableErr e1 then do case runStateT t2 s of OK (v, s') -> do put s'; return $! v- Error e2 -> if score e1 >= score e2- then lift (tfail e1)- else lift (tfail e2)+ Error e2 -> lift (tfail e2) else lift (tfail e1) where recoverableErr err@(CantUnify r x y _ _ _) = -- traceWhen r (show err) $ r || proofSearch recoverableErr (CantSolveGoal _ _) = False- recoverableErr (CantResolveAlts _) = False+ recoverableErr (CantResolveAlts _) = proofSearch recoverableErr (ProofSearchFail (Msg _)) = True recoverableErr (ProofSearchFail _) = False recoverableErr (ElaboratingArg _ _ _ e) = recoverableErr e@@ -797,16 +839,15 @@ = do s <- get ps <- get_probs ulog <- getUnifyLog- case prunStateT 999999 False ps t1 s of- OK ((v, _, _), s') -> do put s'- return $! v+-- case prunStateT 999999 False ps t1 s of+ case runStateT t1 s of+ OK (v, s') -> do put s'+ return $! v Error e1 -> traceWhen ulog ("tryCatch failed " ++ show e1) $ case runStateT (t2 e1) s of OK (v, s') -> do put s' return $! v- Error e2 -> if score e1 >= score e2- then lift (tfail e1)- else lift (tfail e2)+ Error e2 -> lift (tfail e2) tryWhen :: Bool -> Elab' aux a -> Elab' aux a -> Elab' aux a tryWhen True a b = try a b@@ -816,20 +857,22 @@ -- to False, then the whole tactic fails if there are any new problems tryAll :: [(Elab' aux a, Name)] -> Elab' aux a tryAll [(x, _)] = x-tryAll xs = tryAll' [] 999999 (cantResolve, 0) xs+tryAll xs = tryAll' [] 999999 xs where cantResolve :: Elab' aux a cantResolve = lift $ tfail $ CantResolveAlts (map snd xs) + noneValid :: Elab' aux a+ noneValid = lift $ tfail $ NoValidAlts (map snd xs)+ tryAll' :: [Elab' aux a] -> -- successes Int -> -- most problems- (Elab' aux a, Int) -> -- smallest failure [(Elab' aux a, Name)] -> -- still to try Elab' aux a- tryAll' [res] pmax _ [] = res- tryAll' (_:_) pmax _ [] = cantResolve- tryAll' [] pmax (f, _) [] = f- tryAll' cs pmax f ((x, msg):xs)+ tryAll' [res] pmax [] = res+ tryAll' (_:_) pmax [] = cantResolve+ tryAll' [] pmax [] = noneValid+ tryAll' cs pmax ((x, msg):xs) = do s <- get ps <- get_probs case prunStateT pmax True ps x s of@@ -837,17 +880,11 @@ do let cs' = if (newps < pmax) then [do put s'; return $! v] else (do put s'; return $! v) : cs- tryAll' cs' newps f xs+ tryAll' cs' newps xs Error err -> do put s--- if (score err) < 100- tryAll' cs pmax (better err f) xs--- else tryAll' [] pmax (better err f) xs -- give up--- better err (f, i) = let s = score err in- if (s >= i) then (lift (tfail err), s)- else (f, i)+ tryAll' cs pmax xs +-- Run an elaborator, and fail if any problems are introduced prunStateT :: Int -> Bool@@ -867,7 +904,7 @@ else OK ((v, newpmax, problems p), s') Error e -> Error e -debugElaborator :: Maybe String -> Elab' aux a+debugElaborator :: [ErrorReportPart] -> Elab' aux a debugElaborator msg = do ps <- fmap proof get saveState -- so we don't need to remember the hole order hs <- get_holes
src/Idris/Core/Evaluate.hs view
@@ -1,7 +1,8 @@ {-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, PatternGuards #-}+{-# OPTIONS_GHC -fwarn-incomplete-patterns #-} -module Idris.Core.Evaluate(normalise, normaliseTrace, normaliseC, normaliseAll,+module Idris.Core.Evaluate(normalise, normaliseTrace, normaliseC, normaliseAll, toValue, quoteTerm, rt_simplify, simplify, specialise, hnf, convEq, convEq', Def(..), CaseInfo(..), CaseDefs(..), Accessibility(..), Totality(..), PReason(..), MetaInformation(..),@@ -91,6 +92,13 @@ = evalState (do val <- eval tr ctxt [] (map finalEntry env) (finalise t) [] quote 0 val) initEval +toValue :: Context -> Env -> TT Name -> Value+toValue ctxt env t + = evalState (eval False ctxt [] (map finalEntry env) t []) initEval++quoteTerm :: Value -> TT Name+quoteTerm val = evalState (quote 0 val) initEval+ -- Return a specialised name, and an updated list of reductions available, -- so that the caller can tell how much specialisation was achieved. specialise :: Context -> Env -> [(Name, Int)] -> TT Name ->@@ -157,6 +165,7 @@ unbindEnv :: EnvTT n -> TT n -> TT n unbindEnv [] tm = tm unbindEnv (_:bs) (Bind n b sc) = unbindEnv bs sc+unbindEnv env tm = error $ "Impossible case occurred: couldn't unbind env." usable :: Bool -- specialising -> Name -> [(Name, Int)] -> Eval (Bool, [(Name, Int)])@@ -738,6 +747,7 @@ | Productive -- ^ productive | Partial PReason | Unchecked+ | Generated deriving Eq {-! deriving instance NFData Totality@@ -764,6 +774,8 @@ show (Partial (Other ns)) = "possibly not total due to: " ++ showSep ", " (map show ns) show (Partial (Mutual ns)) = "possibly not total due to recursive path " ++ showSep " --> " (map show ns)+ show (Partial (UseUndef n)) = "possibly not total because it uses the undefined name " ++ show n+ show Generated = "auto-generated" {-! deriving instance Binary Accessibility@@ -866,22 +878,23 @@ [([Name], Term, Term)] -> -- compile time [([Name], Term, Term)] -> -- inlined [([Name], Term, Term)] -> -- run time- Type -> Context -> Context+ Type -> Context -> TC Context addCasedef n ei ci@(CaseInfo inline alwaysInline tcdict) tcase covering reflect asserted argtys inacc ps_in ps_tot ps_inl ps_ct ps_rt ty uctxt- = let ctxt = definitions uctxt- access = case lookupDefAcc n False uctxt of- [(_, acc)] -> acc- _ -> Public- ctxt' = case (simpleCase tcase covering reflect CompileTime emptyFC inacc argtys ps_tot ei,- simpleCase tcase covering reflect CompileTime emptyFC inacc argtys ps_ct ei,- simpleCase tcase covering reflect CompileTime emptyFC inacc argtys ps_inl ei,- simpleCase tcase covering reflect RunTime emptyFC inacc argtys ps_rt ei) of- (OK (CaseDef args_tot sc_tot _),- OK (CaseDef args_ct sc_ct _),- OK (CaseDef args_inl sc_inl _),- OK (CaseDef args_rt sc_rt _)) ->+ = do let ctxt = definitions uctxt+ access = case lookupDefAcc n False uctxt of+ [(_, acc)] -> acc+ _ -> Public+ totalityTime <- simpleCase tcase covering reflect CompileTime emptyFC inacc argtys ps_tot ei+ compileTime <- simpleCase tcase covering reflect CompileTime emptyFC inacc argtys ps_ct ei+ inlined <- simpleCase tcase covering reflect CompileTime emptyFC inacc argtys ps_inl ei+ runtime <- simpleCase tcase covering reflect RunTime emptyFC inacc argtys ps_rt ei+ ctxt' <- case (totalityTime, compileTime, inlined, runtime) of+ (CaseDef args_tot sc_tot _,+ CaseDef args_ct sc_ct _,+ CaseDef args_inl sc_inl _,+ CaseDef args_rt sc_rt _) -> let inl = alwaysInline -- tcdict inlc = (inl || small n args_ct sc_ct) && (not asserted) inlr = inl || small n args_rt sc_rt@@ -892,28 +905,27 @@ op = (CaseOp (ci { case_inlinable = inlc }) ty argtys ps_in ps_tot cdef, access, Unchecked, EmptyMI)- in addDef n op ctxt- other -> error ("Error adding case def: " ++ show other)- in uctxt { definitions = ctxt' }+ in return $ addDef n op ctxt+-- other -> tfail (Msg $ "Error adding case def: " ++ show other)+ return uctxt { definitions = ctxt' } -- simplify a definition for totality checking-simplifyCasedef :: Name -> ErasureInfo -> Context -> Context+simplifyCasedef :: Name -> ErasureInfo -> Context -> TC Context simplifyCasedef n ei uctxt- = let ctxt = definitions uctxt- ctxt' = case lookupCtxt n ctxt of- [(CaseOp ci ty atys [] ps _, acc, tot, metainf)] ->- ctxt -- nothing to simplify (or already done...)- [(CaseOp ci ty atys ps_in ps cd, acc, tot, metainf)] ->- let ps_in' = map simpl ps_in- pdef = map debind ps_in' in- case simpleCase False (STerm Erased) False CompileTime emptyFC [] atys pdef ei of- OK (CaseDef args sc _) ->- addDef n (CaseOp ci- ty atys ps_in' ps (cd { cases_totcheck = (args, sc) }),- acc, tot, metainf) ctxt- Error err -> error (show err)- _ -> ctxt in- uctxt { definitions = ctxt' }+ = do let ctxt = definitions uctxt+ ctxt' <- case lookupCtxt n ctxt of+ [(CaseOp ci ty atys [] ps _, acc, tot, metainf)] ->+ return ctxt -- nothing to simplify (or already done...)+ [(CaseOp ci ty atys ps_in ps cd, acc, tot, metainf)] ->+ do let ps_in' = map simpl ps_in+ pdef = map debind ps_in'+ CaseDef args sc _ <- simpleCase False (STerm Erased) False CompileTime emptyFC [] atys pdef ei+ return $ addDef n (CaseOp ci+ ty atys ps_in' ps (cd { cases_totcheck = (args, sc) }),+ acc, tot, metainf) ctxt++ _ -> return ctxt+ return uctxt { definitions = ctxt' } where depat acc (Bind n (PVar t) sc) = depat (n : acc) (instantiate (P Bound n t) sc)@@ -1068,6 +1080,7 @@ case tfst def of (Function _ htm) -> return (veval ctxt [] htm) (TyDecl nt ty) -> return (VP nt n (veval ctxt [] ty))+ _ -> [] lookupTyEnv :: Name -> Env -> Maybe (Int, Type) lookupTyEnv n env = li n 0 env where
src/Idris/Core/Execute.hs view
@@ -93,7 +93,7 @@ fixBinder (Let t1 t2) = Let <$> toTT t1 <*> toTT t2 fixBinder (NLet t1 t2) = NLet <$> toTT t1 <*> toTT t2 fixBinder (Hole t) = Hole <$> toTT t- fixBinder (GHole i t) = GHole i <$> toTT t+ fixBinder (GHole i ns t) = GHole i ns <$> toTT t fixBinder (Guess t1 t2) = Guess <$> toTT t1 <*> toTT t2 fixBinder (PVar t) = PVar <$> toTT t fixBinder (PVTy t) = PVTy <$> toTT t
src/Idris/Core/ProofState.hs view
@@ -39,6 +39,7 @@ deferred :: [Name], -- ^ names we'll need to define instances :: [Name], -- ^ instance arguments (for type classes) autos :: [(Name, [Name])], -- ^ unsolved 'auto' implicits with their holes+ psnames :: [Name], -- ^ Local names okay to use in proof search previous :: Maybe ProofState, -- ^ for undo context :: Context, datatypes :: Ctxt TypeInfo,@@ -244,7 +245,8 @@ let (notu', probs_notu) = mergeNotunified env (holes ps) (notu ++ notunified ps) traceWhen (unifylog ps) ("Now solved: " ++ show ns' ++- "\nNow problems: " ++ qshow (probs' ++ probs_notu)) $+ "\nNow problems: " ++ qshow (probs' ++ probs_notu) +++ "\nNow injective: " ++ show (updateInj u (injective ps))) $ put (ps { problems = probs' ++ probs_notu, unified = (h, ns'), injective = updateInj u (injective ps),@@ -300,7 +302,7 @@ in PS n [h] [] 1 (mkProofTerm (Bind h (Hole ty') (P Bound h ty'))) ty [] (h, []) [] [] Nothing [] []- [] [] []+ [] [] [] [] Nothing ctxt datatypes "" False False [] [] type TState = ProofState -- [TacticAction])@@ -428,7 +430,8 @@ do let env' = filter (\(n, t) -> n `notElem` dropped) env action (\ps -> let hs = holes ps in ps { holes = hs \\ [x] })- return (Bind n (GHole (length env') (mkTy (reverse env') t))+ ps <- get+ return (Bind n (GHole (length env') (psnames ps) (mkTy (reverse env') t)) (mkApp (P Ref n ty) (map getP (reverse env')))) where mkTy [] t = t@@ -444,7 +447,7 @@ ds = deferred ps in ps { holes = hs \\ [x], deferred = n : ds })- return (Bind n (GHole 0 fty)+ return (Bind n (GHole 0 [] fty) (mkApp (P Ref n ty) (map getP args))) where getP n = case lookup n env of@@ -624,8 +627,11 @@ x@(Bind y (Pi _ s _) _) -> x _ -> hnf ctxt env t case t' of- Bind y (Pi _ s _) t -> -- trace ("in type " ++ show t') $- let t' = updsubst y (P Bound n s) t in+ Bind y (Pi _ s _) t ->+ -- It's important that this be subst and not updsubst,+ -- because we want to substitute even in portions of+ -- terms that we know do not contain holes.+ let t' = subst y (P Bound n s) t in return $ Bind n (Lam s) (Bind x (Hole t') (P Bound x t')) _ -> lift $ tfail $ CantIntroduce t' intro n ctxt env _ = fail "Can't introduce here."@@ -759,7 +765,7 @@ replaceIndicies idnms idxs prop = foldM (\t (idnm, idx) -> do (idxv, idxt) <- lift $ check ctxt env (forget idx) let var = P Bound idnm idxt return $ Bind idnm (Lam idxt) (mkP var idxv var t)) prop $ zip idnms idxs-induction tm induction ctxt env _ = do fail "Can't do induction here"+casetac tm induction ctxt env _ = fail $ "Can't do " ++ (if induction then "induction" else "case analysis") ++ " here" equiv :: Raw -> RunTactic@@ -1025,7 +1031,10 @@ holes = holes ps \\ (map fst ns'') }, plog ps) processTactic t ps = case holes ps of- [] -> fail "Nothing to fill in."+ [] -> case t of+ Focus _ -> return (ps, "") -- harmless to refocus when done, since+ -- 'focus' doesn't fail+ _ -> fail $ "Nothing to fill in." (h:_) -> do ps' <- execStateT (process t h) ps let (ns_in, probs') = case solved ps' of
src/Idris/Core/TT.hs view
@@ -1,4 +1,5 @@-{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, DeriveFunctor, DeriveDataTypeable #-}+{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, DeriveFunctor, + DeriveDataTypeable, PatternGuards #-} {-# OPTIONS_GHC -fwarn-incomplete-patterns #-} {-| TT is the core language of Idris. The language has: @@ -18,8 +19,36 @@ programs with implicit syntax into fully explicit terms. -} -module Idris.Core.TT where+module Idris.Core.TT(AppStatus(..), ArithTy(..), Binder(..), Const(..), Ctxt(..),+ ConstraintFC(..), DataOpt(..), DataOpts(..), Datatype(..),+ Env(..), EnvTT(..), Err(..), Err'(..), ErrorReportPart(..),+ FC(..), FC'(..), ImplicitInfo(..), IntTy(..), Name(..),+ NameOutput(..), NameType(..), NativeTy(..), OutputAnnotation(..),+ Provenance(..), Raw(..), SpecialName(..), TC(..), Term(..),+ TermSize(..), TextFormatting(..), TT(..),Type(..), TypeInfo(..),+ UConstraint(..), UCs(..), UExp(..), Universe(..),+ addAlist, addBinder, addDef, allTTNames, arity, bindAll,+ bindingOf, bindTyArgs, constDocs, constIsType, deleteDefExact,+ discard, emptyContext, emptyFC, explicitNames, fc_end, fc_fname,+ fc_start, fcIn, fileFC, finalise, fmapMB, forget, forgetEnv,+ freeNames, getArgTys, getRetTy, implicitable, instantiate,+ intTyName, isInjective, isTypeConst, liftPats, lookupCtxt,+ lookupCtxtExact, lookupCtxtName, mapCtxt, mkApp, nativeTyWidth,+ nextName, noOccurrence, nsroot, occurrences, orderPats,+ pEraseType, pmap, pprintRaw, pprintTT, prettyEnv, psubst, pToV,+ pToVs, pureTerm, raw_apply, raw_unapply, refsIn, safeForget,+ safeForgetEnv, showCG, showEnv, showEnvDbg, showSep,+ sInstanceN, sMN, sNS, spanFC, str, subst, substNames, substTerm,+ substV, sUN, tcname, termSmallerThan, tfail, thead, tnull,+ toAlist, traceWhen, txt, unApply, uniqueBinders, uniqueName,+ uniqueNameFrom, uniqueNameSet, unList, updateDef, vToP, weakenTm) where +-- Work around AMP without CPP+import Prelude (Eq(..), Show(..), Ord(..), Functor(..), Monad(..), String, Int,+ Integer, Ordering(..), Maybe(..), Num(..), Bool(..), Enum(..),+ Read(..), FilePath, Double, (&&), (||), ($), (.), div, error, fst,+ snd, not, mod, read, otherwise)+ import Control.Applicative (Applicative (..), Alternative) import qualified Control.Applicative as A (Alternative (..)) import Control.Monad.State.Strict@@ -102,6 +131,16 @@ spanFC NoFC fc = fc spanFC fc NoFC = fc +-- | Determine whether the first argument is completely contained in the second+fcIn :: FC -> FC -> Bool+fcIn NoFC _ = False+fcIn (FileFC _) _ = False+fcIn (FC {}) NoFC = False+fcIn (FC {}) (FileFC _) = False+fcIn (FC fn1 (sl1, sc1) (el1, ec1)) (FC fn2 (sl2, sc2) (el2, ec2)) =+ fn1 == fn2 &&+ (sl1 == sl2 && sc1 > sc2 || sl1 > sl2) &&+ (el1 == el2 && ec1 < ec2 || el1 < el2) -- | Ignore source location equality (so deriving classes do not compare FCs) instance Eq FC where@@ -144,10 +183,10 @@ show (FileFC f) = f -- | Output annotation for pretty-printed name - decides colour-data NameOutput = TypeOutput | FunOutput | DataOutput | MetavarOutput | PostulateOutput deriving Show+data NameOutput = TypeOutput | FunOutput | DataOutput | MetavarOutput | PostulateOutput deriving (Show, Eq) -- | Text formatting output-data TextFormatting = BoldText | ItalicText | UnderlineText deriving Show+data TextFormatting = BoldText | ItalicText | UnderlineText deriving (Show, Eq) -- | Output annotations for pretty-printing data OutputAnnotation = AnnName Name (Maybe NameOutput) (Maybe String) (Maybe String)@@ -160,6 +199,7 @@ | AnnKeyword | AnnFC FC | AnnTextFmt TextFormatting+ | AnnLink String -- ^ A link to this URL | AnnTerm [(Name, Bool)] (TT Name) -- ^ pprint bound vars, original term | AnnSearchResult Ordering -- ^ more general, isomorphic, or more specific | AnnErr Err@@ -170,12 +210,15 @@ -- resolved. If a file path is present, then -- the namespace represents a module imported -- from that file.- deriving Show+ | AnnQuasiquote+ | AnnAntiquote+ deriving (Show, Eq) -- | Used for error reflection data ErrorReportPart = TextPart String | NamePart Name | TermPart Term+ | RawPart Raw | SubReport [ErrorReportPart] deriving (Show, Eq, Data, Typeable) @@ -223,6 +266,7 @@ t | InvalidTCArg Name t | CantResolveAlts [Name]+ | NoValidAlts [Name] | IncompleteTerm t | NoEliminator String t | UniverseError FC UExp (Int, Int) (Int, Int) [ConstraintFC]@@ -244,9 +288,10 @@ | LoadingFailed String (Err' t) | ReflectionError [[ErrorReportPart]] (Err' t) | ReflectionFailed String (Err' t)- | ElabScriptDebug (Maybe String) t [(Name, t, [(Name, Binder t)])]+ | ElabScriptDebug [ErrorReportPart] t [(Name, t, [(Name, Binder t)])] -- ^ User-specified message, proof term, goals with context (first goal is focused) | ElabScriptStuck t+ | RunningElabScript (Err' t) -- ^ The error occurred during a top-level elaboration script deriving (Eq, Functor, Data, Typeable) type Err = Err' Term@@ -288,6 +333,7 @@ instance Sized ErrorReportPart where size (TextPart msg) = 1 + length msg size (TermPart t) = 1 + size t+ size (RawPart r) = 1 + size r size (NamePart n) = 1 + size n size (SubReport rs) = 1 + size rs @@ -313,18 +359,6 @@ size (LoadingFailed fn e) = 1 + length fn + size e size _ = 1 -score :: Err -> Int-score (CantUnify _ _ _ m _ s) = s + score m-score (CantResolve _ _) = 20-score (NoSuchVariable _) = 1000-score (ProofSearchFail e) = score e-score (CantSolveGoal _ _) = 100000-score (InternalMsg _) = -1-score (At _ e) = score e-score (ElaboratingArg _ _ _ e) = score e-score (Elaborating _ _ e) = score e-score _ = 0- instance Show Err where show (Msg s) = s show (InternalMsg s) = "Internal error: " ++ show s@@ -776,6 +810,7 @@ binderVal :: b } | Hole { binderTy :: !b} | GHole { envlen :: Int,+ localnames :: [Name], binderTy :: !b} | Guess { binderTy :: !b, binderVal :: b }@@ -794,7 +829,7 @@ size (Let ty val) = 1 + size ty + size val size (NLet ty val) = 1 + size ty + size val size (Hole ty) = 1 + size ty- size (GHole _ ty) = 1 + size ty+ size (GHole _ _ ty) = 1 + size ty size (Guess ty val) = 1 + size ty + size val size (PVar ty) = 1 + size ty size (PVTy ty) = 1 + size ty@@ -806,7 +841,7 @@ fmapMB f (Lam t) = liftM Lam (f t) fmapMB f (Pi i t k) = liftM2 (Pi i) (f t) (f k) fmapMB f (Hole t) = liftM Hole (f t)-fmapMB f (GHole i t) = liftM (GHole i) (f t)+fmapMB f (GHole i ns t) = liftM (GHole i ns) (f t) fmapMB f (PVar t) = liftM PVar (f t) fmapMB f (PVTy t) = liftM PVTy (f t) @@ -1247,6 +1282,22 @@ return $ x:rest (f, args) -> Nothing +-- | Hard-code a heuristic maximum term size, to prevent attempts to+-- serialize or force infinite or just gigantic terms+termSmallerThan :: Int -> Term -> Bool+termSmallerThan x tm | x <= 0 = False+termSmallerThan x (P _ _ ty) = termSmallerThan (x-1) ty+termSmallerThan x (Bind _ _ tm) = termSmallerThan (x-1) tm+termSmallerThan x (App _ f a) = termSmallerThan (x-1) f && termSmallerThan (x-1) a+termSmallerThan x (Proj tm _) = termSmallerThan (x-1) tm+termSmallerThan x (V i) = True+termSmallerThan x (Constant c) = True+termSmallerThan x Erased = True+termSmallerThan x Impossible = True+termSmallerThan x (TType u) = True+termSmallerThan x (UType u) = True++ -- | Cast a 'TT' term to a 'Raw' value, discarding universe information and -- the types of named references and replacing all de Bruijn indices -- with the corresponding name. It is an error if there are free de@@ -1325,7 +1376,7 @@ uniqueNameSet :: Name -> Set Name -> Name uniqueNameSet n hs | n `member` hs = uniqueNameSet (nextName n) hs- | otherwise = n+ | otherwise = n uniqueBinders :: [Name] -> TT Name -> TT Name uniqueBinders ns = ubSet (fromList ns) where@@ -1445,7 +1496,7 @@ -- Render a `Binder` and its name prettySb env n (Lam t) = prettyB env "λ" "=>" n t prettySb env n (Hole t) = prettyB env "?defer" "." n t- prettySb env n (GHole _ t) = prettyB env "?gdefer" "." n t+ prettySb env n (GHole _ _ t) = prettyB env "?gdefer" "." n t prettySb env n (Pi _ t _) = prettyB env "(" ") ->" n t prettySb env n (PVar t) = prettyB env "pat" "." n t prettySb env n (PVTy t) = prettyB env "pty" "." n t@@ -1490,7 +1541,7 @@ sb env n (Lam t) = showb env "\\ " " => " n t sb env n (Hole t) = showb env "? " ". " n t- sb env n (GHole i t) = showb env "?defer " ". " n t+ sb env n (GHole i ns t) = showb env "?defer " ". " n t sb env n (Pi (Just _) t _) = showb env "{" "} -> " n t sb env n (Pi _ t _) = showb env "(" ") -> " n t sb env n (PVar t) = showb env "pat " ". " n t@@ -1690,7 +1741,7 @@ ppb p bound n (Hole ty) sc = bracket p startPrec . group . align . hang 2 $ text "?" <+> bindingOf n False <+> text "." <> line <> sc- ppb p bound n (GHole _ ty) sc =+ ppb p bound n (GHole _ _ ty) sc = bracket p startPrec . group . align . hang 2 $ text "¿" <+> bindingOf n False <+> text "." <> line <> sc ppb p bound n (Guess ty val) sc =@@ -1715,6 +1766,53 @@ | outer > inner = lparen <> doc <> rparen | otherwise = doc +-- | Pretty-print a raw term.+pprintRaw :: [Name] -- ^ Bound names, for highlighting+ -> Raw -- ^ The term to pretty-print+ -> Doc OutputAnnotation+pprintRaw bound (Var n) =+ enclose lparen rparen . group . align . hang 2 $+ (text "Var") <$> annotate (if n `elem` bound+ then AnnBoundName n False+ else AnnName n Nothing Nothing Nothing)+ (text $ show n)+pprintRaw bound (RBind n b body) =+ enclose lparen rparen . group . align . hang 2 $+ vsep [ text "RBind"+ , annotate (AnnBoundName n False) (text $ show n)+ , ppb b+ , pprintRaw (n:bound) body]+ where+ ppb (Lam ty) = enclose lparen rparen . group . align . hang 2 $+ text "Lam" <$> pprintRaw bound ty+ ppb (Pi _ ty k) = enclose lparen rparen . group . align . hang 2 $+ vsep [text "Pi", pprintRaw bound ty, pprintRaw bound k]+ ppb (Let ty v) = enclose lparen rparen . group . align . hang 2 $+ vsep [text "Let", pprintRaw bound ty, pprintRaw bound v]+ ppb (NLet ty v) = enclose lparen rparen . group . align . hang 2 $+ vsep [text "NLet", pprintRaw bound ty, pprintRaw bound v]+ ppb (Hole ty) = enclose lparen rparen . group . align . hang 2 $+ text "Hole" <$> pprintRaw bound ty+ ppb (GHole _ _ ty) = enclose lparen rparen . group . align . hang 2 $+ text "GHole" <$> pprintRaw bound ty+ ppb (Guess ty v) = enclose lparen rparen . group . align . hang 2 $+ vsep [text "Guess", pprintRaw bound ty, pprintRaw bound v]+ ppb (PVar ty) = enclose lparen rparen . group . align . hang 2 $+ text "PVar" <$> pprintRaw bound ty+ ppb (PVTy ty) = enclose lparen rparen . group . align . hang 2 $+ text "PVTy" <$> pprintRaw bound ty+pprintRaw bound (RApp f x) =+ enclose lparen rparen . group . align . hang 2 . vsep $+ [text "RApp", pprintRaw bound f, pprintRaw bound x]+pprintRaw bound RType = text "RType"+pprintRaw bound (RUType u) = enclose lparen rparen . group . align . hang 2 $+ text "RUType" <$> text (show u)+pprintRaw bound (RForce r) =+ enclose lparen rparen . group . align . hang 2 $+ vsep [text "RForce", pprintRaw bound r]+pprintRaw bound (RConstant c) =+ enclose lparen rparen . group . align . hang 2 $+ vsep [text "RConstant", annotate (AnnConst c) (text (show c))] -- | Pretty-printer helper for the binding site of a name bindingOf :: Name -- ^^ the bound name
src/Idris/Core/Typecheck.hs view
@@ -232,12 +232,12 @@ let tt' = normalise ctxt env tt lift $ isType ctxt env tt' return (Hole tv, tt')- checkBinder (GHole i t)+ checkBinder (GHole i ns t) = do (tv, tt) <- chk u env t let tv' = normalise ctxt env tv let tt' = normalise ctxt env tt lift $ isType ctxt env tt'- return (GHole i tv, tt')+ return (GHole i ns tv, tt') checkBinder (Guess t v) | not holes = lift $ tfail (IncompleteTerm undefined) | otherwise@@ -273,8 +273,8 @@ = return (Bind n (NLet t v) scv, Bind n (Let t v) sct) discharge n (Hole t) bt scv sct = return (Bind n (Hole t) scv, sct)- discharge n (GHole i t) bt scv sct- = return (Bind n (GHole i t) scv, sct)+ discharge n (GHole i ns t) bt scv sct+ = return (Bind n (GHole i ns t) scv, sct) discharge n (Guess t v) bt scv sct = return (Bind n (Guess t v) scv, sct) discharge n (PVar t) bt scv sct
src/Idris/Core/Unify.hs view
@@ -688,14 +688,26 @@ | (P _ (UN l) _, _) <- unApply t, l == txt "Lazy'" = False recoverable (P (DCon _ _ _) x _) (P (DCon _ _ _) y _) = x == y recoverable (P (TCon _ _) x _) (P (TCon _ _) y _) = x == y+recoverable (TType _) (P (DCon _ _ _) y _) = False+recoverable (UType _) (P (DCon _ _ _) y _) = False recoverable (Constant _) (P (DCon _ _ _) y _) = False recoverable (Constant x) (Constant y) = x == y+recoverable (P (DCon _ _ _) x _) (TType _) = False+recoverable (P (DCon _ _ _) x _) (UType _) = False recoverable (P (DCon _ _ _) x _) (Constant _) = False+recoverable (TType _) (P (TCon _ _) y _) = False+recoverable (UType _) (P (TCon _ _) y _) = False recoverable (Constant _) (P (TCon _ _) y _) = False+recoverable (P (TCon _ _) x _) (TType _) = False+recoverable (P (TCon _ _) x _) (UType _) = False recoverable (P (TCon _ _) x _) (Constant _) = False recoverable (P (DCon _ _ _) x _) (P (TCon _ _) y _) = False recoverable (P (TCon _ _) x _) (P (DCon _ _ _) y _) = False+recoverable p@(TType _) (App _ f a) = recoverable p f+recoverable p@(UType _) (App _ f a) = recoverable p f recoverable p@(Constant _) (App _ f a) = recoverable p f+recoverable (App _ f a) p@(TType _) = recoverable f p+recoverable (App _ f a) p@(UType _) = recoverable f p recoverable (App _ f a) p@(Constant _) = recoverable f p recoverable p@(P _ n _) (App _ f a) = recoverable p f recoverable (App _ f a) p@(P _ _ _) = recoverable f p
+ src/Idris/Core/WHNF.hs view
@@ -0,0 +1,208 @@+{-# LANGUAGE PatternGuards #-}+{-# OPTIONS_GHC -fwarn-incomplete-patterns #-}++-- Reduction to Weak Head Normal Form+module Idris.Core.WHNF(whnf, WEnv) where++import Idris.Core.TT+import Idris.Core.CaseTree+import Idris.Core.Evaluate hiding (quote)+import qualified Idris.Core.Evaluate as Evaluate ++import Debug.Trace++-- A stack entry consists of a term and the environment it is to be+-- evaluated in (i.e. it's a thunk)+type StackEntry = (Term, WEnv)+data WEnv = WEnv Int -- number of free variables+ [(Term, WEnv)] + deriving Show++type Stack = [StackEntry]++-- A WHNF is a top level term evaluated in the empty environment. It is+-- always headed by either an irreducible expression, i.e. a constructor,+-- a lambda, a constant, or a postulate++-- Every 'Term' or 'Type' in this structure is associated with the+-- environment it was encountered in, so that when we quote back to a term+-- we get the substitutions right.++data WHNF = WDCon Int Int Bool Name (Type, WEnv) -- data constructor+ | WTCon Int Int Name (Type, WEnv) -- type constructor+ | WPRef Name (Type, WEnv) -- irreducible global (e.g. a postulate)+ | WBind Name (Binder Term) (Term, WEnv)+ | WApp WHNF (Term, WEnv)+ | WConstant Const+ | WProj WHNF Int+ | WType UExp+ | WUType Universe+ | WErased+ | WImpossible++-- Reduce a *closed* term to weak head normal form.+whnf :: Context -> Term -> Term+whnf ctxt tm = quote (do_whnf ctxt (WEnv 0 []) tm)++do_whnf :: Context -> WEnv -> Term -> WHNF+do_whnf ctxt env tm = eval env [] tm+ where+ eval :: WEnv -> Stack -> Term -> WHNF+ eval wenv@(WEnv d env) stk (V i) + | i < length env = let (tm, env') = env !! i in+ eval env' stk tm+ | otherwise = error "Can't happen: WHNF scope error"+ eval wenv@(WEnv d env) stk (Bind n (Let t v) sc) + = eval (WEnv d ((v, wenv) : env)) stk sc+ eval (WEnv d env) [] (Bind n b sc) = WBind n b (sc, WEnv (d + 1) env)+ eval (WEnv d env) ((tm, tenv) : stk) (Bind n b sc) + = eval (WEnv d ((tm, tenv) : env)) stk sc++ eval env stk (P nt n ty) = apply env nt n ty stk+ eval env stk (App _ f a) = eval env ((a, env) : stk) f+ eval env stk (Constant c) = unload (WConstant c) stk++ -- Should never happen in compile time code (for now...)+ eval env stk (Proj tm i) = unload (WProj (eval env [] tm) i) stk++ eval env stk Erased = unload WErased stk+ eval env stk Impossible = unload WImpossible stk+ eval env stk (TType u) = unload (WType u) stk+ eval env stk (UType u) = unload (WUType u) stk++ apply :: WEnv -> NameType -> Name -> Type -> Stack -> WHNF+ apply env nt n ty stk + = let wp = case nt of+ DCon t a u -> WDCon t a u n (ty, env)+ TCon t a -> WTCon t a n (ty, env)+ _ -> WPRef n (ty, env)+ in+ case lookupDefExact n ctxt of+ Just (CaseOp ci _ _ _ _ cd) -> + let (ns, tree) = cases_compiletime cd in+ case evalCase env ns tree stk of+ Just w -> w+ Nothing -> unload wp stk+ Just (Operator _ i op) -> + if i <= length stk+ then case runOp env op (take i stk) (drop i stk) of+ Just v -> v+ Nothing -> unload wp stk+ else unload wp stk+ _ -> unload wp stk++ unload :: WHNF -> Stack -> WHNF+ unload f [] = f+ unload f (a : as) = unload (WApp f a) as++ runOp :: WEnv -> ([Value] -> Maybe Value) -> Stack -> Stack -> Maybe WHNF+ runOp env op stk rest + = do vals <- mapM tmtoValue stk+ case op vals of+ Just (VConstant c) -> Just $ unload (WConstant c) rest+ -- Operators run on values, so we have to convert back+ -- and forth. This is pretty ugly, but operators that+ -- aren't run on constants are themselves pretty ugly+ -- (it's prim__believe_me and prim__syntacticEq, for+ -- example) so let's not worry too much...+ Just val -> Just $ eval env rest (quoteTerm val)+ _ -> Nothing++ tmtoValue :: (Term, WEnv) -> Maybe Value+ tmtoValue (tm, tenv) + = case eval tenv [] tm of+ WConstant c -> Just (VConstant c)+ _ -> let tm' = quoteEnv tenv tm in+ Just (toValue ctxt [] tm')++ evalCase :: WEnv -> [Name] -> SC -> Stack -> Maybe WHNF+ evalCase wenv@(WEnv d env) ns tree args + | length ns > length args = Nothing+ | otherwise = let args' = take (length ns) args+ rest = drop (length ns) args in+ do (tm, amap) <- evalTree wenv (zip ns args') tree+ let wtm = pToVs (map fst amap) tm+ Just $ eval (WEnv d (map snd amap)) rest wtm++ evalTree :: WEnv -> [(Name, (Term, WEnv))] -> SC -> + Maybe (Term, [(Name, (Term, WEnv))])+ evalTree env amap (STerm tm) = Just (tm, amap)+ evalTree env amap (Case _ n alts)+ = case lookup n amap of+ Just (tm, tenv) -> findAlt env amap + (deconstruct (eval tenv [] tm) []) alts+ _ -> Nothing+ evalTree _ _ _ = Nothing++ deconstruct :: WHNF -> Stack -> (WHNF, Stack)+ deconstruct (WApp f arg) stk = deconstruct f (arg : stk)+ deconstruct t stk = (t, stk) ++ findAlt :: WEnv -> [(Name, (Term, WEnv))] -> (WHNF, Stack) -> + [CaseAlt] ->+ Maybe (Term, [(Name, (Term, WEnv))])+ findAlt env amap (WDCon tag _ _ _ _, args) alts + | Just (ns, sc) <- findTag tag alts + = let amap' = updateAmap (zip ns args) amap in+ evalTree env amap' sc+ | Just sc <- findDefault alts+ = evalTree env amap sc+ findAlt env amap (WConstant c, []) alts+ | Just sc <- findConst c alts+ = evalTree env amap sc+ | Just sc <- findDefault alts+ = evalTree env amap sc+ findAlt _ _ _ _ = Nothing++ findTag :: Int -> [CaseAlt] -> Maybe ([Name], SC)+ findTag i [] = Nothing+ findTag i (ConCase n j ns sc : xs) | i == j = Just (ns, sc)+ findTag i (_ : xs) = findTag i xs+ + findDefault :: [CaseAlt] -> Maybe SC+ findDefault [] = Nothing+ findDefault (DefaultCase sc : xs) = Just sc+ findDefault (_ : xs) = findDefault xs++ findConst c [] = Nothing+ findConst c (ConstCase c' v : xs) | c == c' = Just v+ findConst (AType (ATInt ITNative)) (ConCase n 1 [] v : xs) = Just v+ findConst (AType ATFloat) (ConCase n 2 [] v : xs) = Just v+ findConst (AType (ATInt ITChar)) (ConCase n 3 [] v : xs) = Just v+ findConst StrType (ConCase n 4 [] v : xs) = Just v+ findConst (AType (ATInt ITBig)) (ConCase n 6 [] v : xs) = Just v+ findConst (AType (ATInt (ITFixed ity))) (ConCase n tag [] v : xs)+ | tag == 7 + fromEnum ity = Just v+ findConst c (_ : xs) = findConst c xs++ updateAmap newm amap+ = newm ++ filter (\ (x, _) -> not (elem x (map fst newm))) amap++quote :: WHNF -> Term+quote (WDCon t a u n (ty, env)) = P (DCon t a u) n (quoteEnv env ty)+quote (WTCon t a n (ty, env)) = P (TCon t a) n (quoteEnv env ty)+quote (WPRef n (ty, env)) = P Ref n (quoteEnv env ty) +quote (WBind n ty (sc, env)) = Bind n ty (quoteEnv env sc)+quote (WApp f (a, env)) = App Complete (quote f) (quoteEnv env a)+quote (WConstant c) = Constant c+quote (WProj t i) = Proj (quote t) i+quote (WType u) = TType u+quote (WUType u) = UType u+quote WErased = Erased+quote WImpossible = Impossible++quoteEnv :: WEnv -> Term -> Term+quoteEnv (WEnv d ws) tm = qe' d ws tm+ where+ qe' d ts (V i) + | i < d = V i+ | otherwise = let (tm, env) = ts !! (i - d) in+ quoteEnv env tm+ qe' d ts (Bind n b sc)+ = Bind n (fmap (qe' d ts) b) (qe' (d + 1) ts sc)+ qe' d ts (App c f a)+ = App c (qe' d ts f) (qe' d ts a)+ qe' d ts (P nt n ty) = P nt n (qe' d ts ty)+ qe' d ts (Proj tm i) = Proj (qe' d ts tm) i+ qe' d ts tm = tm+
src/Idris/Coverage.hs view
@@ -28,21 +28,21 @@ let timp = addImpl' True [] [] [] i t evalStateT (toTT (mapPT deNS timp)) 0 where- toTT (PRef _ n) = do i <- lift getIState- case lookupNameDef n (tt_ctxt i) of- [(n', TyDecl nt _)] -> return $ P nt n' Erased- _ -> return $ P Ref n Erased+ toTT (PRef _ _ n) = do i <- lift getIState+ case lookupNameDef n (tt_ctxt i) of+ [(n', TyDecl nt _)] -> return $ P nt n' Erased+ _ -> return $ P Ref n Erased toTT (PApp _ t args) = do t' <- toTT t args' <- mapM (toTT . getTm) args return $ mkApp t' args' -- For alternatives, pick the first and drop the namespaces. It doesn't -- really matter which is taken since matching will ignore the namespace.- toTT (PAlternative _ (a : as)) = toTT a+ toTT (PAlternative _ _ (a : as)) = toTT a toTT _ = do v <- get put (v + 1) return (P Bound (sMN v "imp") Erased) - deNS (PRef f (NS n _)) = PRef f n+ deNS (PRef f hl (NS n _)) = PRef f hl n deNS t = t -- | Given a list of LHSs, generate a extra clauses which cover the remaining@@ -112,7 +112,7 @@ | all (== [Placeholder]) args = [] mkClauses parg args = do args' <- mkArg args- let tm = PApp fc (PRef fc n) (zipWith upd args' parg)+ let tm = PApp fc (PRef fc [] n) (zipWith upd args' parg) return tm where mkArg :: [[PTerm]] -> [[PTerm]]@@ -214,15 +214,15 @@ nubMap f acc (x : xs) = nubMap f (fnub' acc (f x)) xs otherPats :: PTerm -> [PTerm]- otherPats o@(PRef fc n) = ops fc n [] o- otherPats o@(PApp _ (PRef fc n) xs) = ops fc n xs o- otherPats o@(PPair fc _ l r)+ otherPats o@(PRef fc hl n) = ops fc n [] o+ otherPats o@(PApp _ (PRef fc hl n) xs) = ops fc n xs o+ otherPats o@(PPair fc hls _ l r) = ops fc pairCon ([pimp (sUN "A") Placeholder True, pimp (sUN "B") Placeholder True] ++ [pexp l, pexp r]) o- otherPats o@(PDPair fc p t _ v)- = ops fc (sUN "Ex_intro")+ otherPats o@(PDPair fc hls p t _ v)+ = ops fc sigmaCon ([pimp (sUN "a") Placeholder True, pimp (sUN "P") Placeholder True] ++ [pexp t,pexp v]) o@@ -232,7 +232,7 @@ ops fc n xs o | (TyDecl c@(DCon _ arity _) ty : _) <- lookupDef n (tt_ctxt i) = do xs' <- mapM otherPats (map getExpTm xs)- let p = resugar (PApp fc (PRef fc n) (zipWith upd xs' xs))+ let p = resugar (PApp fc (PRef fc [] n) (zipWith upd xs' xs)) let tyn = getTy n (tt_ctxt i) case lookupCtxt tyn (idris_datatypes i) of (TI ns _ _ _ _ : _) -> p : map (mkPat fc) (ns \\ [n])@@ -243,12 +243,12 @@ getExpTm t = getTm t -- put it back to its original form- resugar (PApp _ (PRef fc (UN ei)) [_,_,t,v])- | ei == txt "Ex_intro"- = PDPair fc TypeOrTerm (getTm t) Placeholder (getTm v)- resugar (PApp _ (PRef fc n) [_,_,l,r])+ resugar (PApp _ (PRef fc hl n) [_,_,t,v])+ | n == sigmaCon + = PDPair fc [] TypeOrTerm (getTm t) Placeholder (getTm v)+ resugar (PApp _ (PRef fc hl n) [_,_,l,r]) | n == pairCon- = PPair fc IsTerm (getTm l) (getTm r)+ = PPair fc [] IsTerm (getTm l) (getTm r) resugar t = t dropForce force (x : xs) i | i `elem` force@@ -265,7 +265,7 @@ mkPat fc x = case lookupCtxt x (idris_implicits i) of (pargs : _)- -> PApp fc (PRef fc x) (map (upd Placeholder) pargs)+ -> PApp fc (PRef fc [] x) (map (upd Placeholder) pargs) _ -> error "Can't happen - genAll" fnub :: [PTerm] -> [PTerm]@@ -279,7 +279,7 @@ -- quick check for constructor equality quickEq :: PTerm -> PTerm -> Bool quickEq (PConstant _ n) (PConstant _ n') = n == n'- quickEq (PRef _ n) (PRef _ n') = n == n'+ quickEq (PRef _ _ n) (PRef _ _ n') = n == n' quickEq (PApp _ t as) (PApp _ t' as') | length as == length as' = quickEq t t' && and (zipWith quickEq (map getTm as) (map getTm as'))@@ -423,7 +423,9 @@ | otherwise = do t <- getTotality n i <- getIState- updateContext (simplifyCasedef n $ getErasureInfo i)+ ctxt' <- do ctxt <- getContext+ tclift $ simplifyCasedef n (getErasureInfo i) ctxt+ setContext ctxt' ctxt <- getContext i <- getIState let opts = case lookupCtxt n (idris_flags i) of
src/Idris/DSL.hs view
@@ -18,7 +18,7 @@ dslify :: SyntaxInfo -> IState -> PTerm -> PTerm dslify syn i = transform dslifyApp where- dslifyApp (PApp fc (PRef _ f) [a])+ dslifyApp (PApp fc (PRef _ _ f) [a]) | [d] <- lookupCtxt f (idris_dsls i) = desugar (syn { dsl_info = d }) i (getTm a) dslifyApp t = t@@ -29,20 +29,20 @@ mkTTName :: FC -> Name -> PTerm mkTTName fc n =- let mkList fc [] = PRef fc (sNS (sUN "Nil") ["List", "Prelude"])- mkList fc (x:xs) = PApp fc (PRef fc (sNS (sUN "::") ["List", "Prelude"]))+ let mkList fc [] = PRef fc [] (sNS (sUN "Nil") ["List", "Prelude"])+ mkList fc (x:xs) = PApp fc (PRef fc [] (sNS (sUN "::") ["List", "Prelude"])) [ pexp (stringC x) , pexp (mkList fc xs)] stringC = PConstant fc . Str . str intC = PConstant fc . I reflm n = sNS (sUN n) ["Reflection", "Language"] in case n of- UN nm -> PApp fc (PRef fc (reflm "UN")) [ pexp (stringC nm)]- NS nm ns -> PApp fc (PRef fc (reflm "NS")) [ pexp (mkTTName fc nm)- , pexp (mkList fc ns)]- MN i nm -> PApp fc (PRef fc (reflm "MN")) [ pexp (intC i)- , pexp (stringC nm)]- otherwise -> PRef fc $ reflm "NErased"+ UN nm -> PApp fc (PRef fc [] (reflm "UN")) [ pexp (stringC nm)]+ NS nm ns -> PApp fc (PRef fc [] (reflm "NS")) [ pexp (mkTTName fc nm)+ , pexp (mkList fc ns)]+ MN i nm -> PApp fc (PRef fc [] (reflm "MN")) [ pexp (intC i)+ , pexp (stringC nm)]+ otherwise -> PRef fc [] $ reflm "NErased" expandSugar :: DSL -> PTerm -> PTerm expandSugar dsl (PLam fc n nfc ty tm)@@ -72,15 +72,15 @@ expandSugar dsl (PCase fc s opts) = PCase fc (expandSugar dsl s) (map (pmap (expandSugar dsl)) opts) expandSugar dsl (PIfThenElse fc c t f) =- PApp fc (PRef NoFC (sUN "ifThenElse"))+ PApp fc (PRef NoFC [] (sUN "ifThenElse")) [ PExp 0 [] (sMN 0 "condition") $ expandSugar dsl c , PExp 0 [] (sMN 0 "whenTrue") $ expandSugar dsl t , PExp 0 [] (sMN 0 "whenFalse") $ expandSugar dsl f ]-expandSugar dsl (PPair fc p l r) = PPair fc p (expandSugar dsl l) (expandSugar dsl r)-expandSugar dsl (PDPair fc p l t r) = PDPair fc p (expandSugar dsl l) (expandSugar dsl t)- (expandSugar dsl r)-expandSugar dsl (PAlternative a as) = PAlternative a (map (expandSugar dsl) as)+expandSugar dsl (PPair fc hls p l r) = PPair fc hls p (expandSugar dsl l) (expandSugar dsl r)+expandSugar dsl (PDPair fc hls p l t r) = PDPair fc hls p (expandSugar dsl l) (expandSugar dsl t)+ (expandSugar dsl r)+expandSugar dsl (PAlternative ms a as) = PAlternative ms a (map (expandSugar dsl) as) expandSugar dsl (PHidden t) = PHidden (expandSugar dsl t) expandSugar dsl (PNoImplicits t) = PNoImplicits (expandSugar dsl t) expandSugar dsl (PUnifyLog t) = PUnifyLog (expandSugar dsl t)@@ -99,7 +99,7 @@ = PApp fc b [pexp tm, pexp (PLam fc n nfc Placeholder (block b rest))] block b (DoBindP fc p tm alts : rest) = PApp fc b [pexp tm, pexp (PLam fc (sMN 0 "bpat") NoFC Placeholder- (PCase fc (PRef fc (sMN 0 "bpat"))+ (PCase fc (PRef fc [] (sMN 0 "bpat")) ((p, block b rest) : alts)))] block b (DoLet fc n nfc ty tm : rest) = PLet fc n nfc ty tm (block b rest)@@ -112,13 +112,14 @@ block b _ = PElabError (Msg "Invalid statement in do block") expandSugar dsl (PIdiom fc e) = expandSugar dsl $ unIdiom (dsl_apply dsl) (dsl_pure dsl) fc e-expandSugar dsl (PRunElab fc tm) = PRunElab fc $ expandSugar dsl tm+expandSugar dsl (PRunElab fc tm ns) = PRunElab fc (expandSugar dsl tm) ns+expandSugar dsl (PConstSugar fc tm) = PConstSugar fc (expandSugar dsl tm) expandSugar dsl t = t -- | Replace DSL-bound variable in a term var :: DSL -> Name -> PTerm -> Int -> PTerm var dsl n t i = v' i t where- v' i (PRef fc x) | x == n =+ v' i (PRef fc hl x) | x == n = case dsl_var dsl of Nothing -> PElabError (Msg "No 'variable' defined in dsl") Just v -> PApp fc v [pexp (mkVar fc i)]@@ -137,9 +138,9 @@ v' i (PTyped l r) = PTyped (v' i l) (v' i r) v' i (PApp f x as) = PApp f (v' i x) (fmap (fmap (v' i)) as) v' i (PCase f t as) = PCase f (v' i t) (fmap (pmap (v' i)) as)- v' i (PPair f p l r) = PPair f p (v' i l) (v' i r)- v' i (PDPair f p l t r) = PDPair f p (v' i l) (v' i t) (v' i r)- v' i (PAlternative a as) = PAlternative a $ map (v' i) as+ v' i (PPair f hls p l r) = PPair f hls p (v' i l) (v' i r)+ v' i (PDPair f hls p l t r) = PDPair f hls p (v' i l) (v' i t) (v' i r)+ v' i (PAlternative ms a as) = PAlternative ms a $ map (v' i) as v' i (PHidden t) = PHidden (v' i t) v' i (PIdiom f t) = PIdiom f (v' i t) v' i (PDoBlock ds) = PDoBlock (map (fmap (v' i)) ds)@@ -153,7 +154,7 @@ Nothing -> PElabError (Msg "No index_next defined") Just f -> PApp fc f [pexp (mkVar fc (n-1))] - setFC fc (PRef _ n) = PRef fc n+ setFC fc (PRef _ _ n) = PRef fc [] n setFC fc (PApp _ f xs) = PApp fc (setFC fc f) (map (fmap (setFC fc)) xs) setFC fc t = t @@ -182,7 +183,7 @@ (bs, n) <- get let nm = sUN ("_bindApp" ++ show n) put ((nm, fc, PApp fc t args') : bs, n+1)- return (PRef fc nm)+ return (PRef fc [] nm) db' (PApp fc t args) = do t' <- db' t args' <- mapM dbArg args@@ -192,13 +193,14 @@ return (PLet fc n nfc ty v' (debind b sc)) db' (PCase fc s opts) = do s' <- db' s return (PCase fc s' (map (pmap (debind b)) opts))- db' (PPair fc p l r) = do l' <- db' l- r' <- db' r- return (PPair fc p l' r')- db' (PDPair fc p l t r) = do l' <- db' l- r' <- db' r- return (PDPair fc p l' t r')- db' (PRunElab fc t) = fmap (PRunElab fc) (db' t)+ db' (PPair fc hls p l r) = do l' <- db' l+ r' <- db' r+ return (PPair fc hls p l' r')+ db' (PDPair fc hls p l t r) = do l' <- db' l+ r' <- db' r+ return (PDPair fc hls p l' t r')+ db' (PRunElab fc t ns) = fmap (\tm -> PRunElab fc tm ns) (db' t)+ db' (PConstSugar fc tm) = liftM (PConstSugar fc) (db' tm) db' t = return t dbArg a = do t' <- db' (getTm a)
src/Idris/DataOpts.hs view
@@ -1,6 +1,6 @@ {-# LANGUAGE PatternGuards #-} -module Idris.DataOpts where+module Idris.DataOpts(applyOpts) where -- Forcing, detagging and collapsing
src/Idris/DeepSeq.hs view
@@ -120,6 +120,7 @@ rnf (Specialise x1) = rnf x1 `seq` () rnf Constructor = () rnf AutoHint = ()+ rnf PEGenerated = () instance NFData DataOpt where rnf Codata = ()@@ -135,9 +136,12 @@ rnf x3 `seq` rnf x4 `seq` rnf x5 `seq` rnf x6 `seq` rnf x7 `seq` rnf x8 `seq` ()- rnf (PPostulate x1 x2 x3 x4 x5 x6 x7)+ rnf (PPostulate x1 x2 x3 x4 x5 x6 x7 x8) = rnf x1 `seq`- rnf x2 `seq` rnf x3 `seq` rnf x4 `seq` rnf x5 `seq` rnf x6 `seq` rnf x7 `seq` ()+ rnf x2 `seq`+ rnf x3 `seq`+ rnf x4 `seq`+ rnf x5 `seq` rnf x6 `seq` rnf x7 `seq` rnf x8 `seq` () rnf (PClauses x1 x2 x3 x4) = rnf x1 `seq` rnf x2 `seq` rnf x3 `seq` rnf x4 `seq` () rnf (PCAF x1 x2 x3) = rnf x1 `seq` rnf x2 `seq` rnf x3 `seq` ()@@ -184,10 +188,16 @@ rnf (PSyntax x1 x2) = rnf x1 `seq` rnf x2 `seq` () rnf (PMutual x1 x2) = rnf x1 `seq` rnf x2 `seq` () rnf (PDirective x1) = ()- rnf (PProvider x1 x2 x3 x4 x5)- = rnf x1 `seq` rnf x2 `seq` rnf x3 `seq` rnf x4 `seq` rnf x5 `seq` ()+ rnf (PProvider x1 x2 x3 x4 x5 x6)+ = rnf x1 `seq`+ rnf x2 `seq`+ rnf x3 `seq`+ rnf x4 `seq`+ rnf x5 `seq` rnf x6 `seq` () rnf (PTransform x1 x2 x3 x4) = rnf x1 `seq` rnf x2 `seq` rnf x3 `seq` rnf x4 `seq` ()+ rnf (PRunElabDecl x1 x2 x3)+ = rnf x1 `seq` rnf x2 `seq` x3 `seq` () instance NFData t => NFData (ProvideWhat' t) where rnf (ProvTerm ty tm) = rnf ty `seq` rnf tm `seq` ()@@ -215,8 +225,8 @@ instance NFData PTerm where rnf (PQuote x1) = rnf x1 `seq` ()- rnf (PRef x1 x2) = rnf x1 `seq` rnf x2 `seq` ()- rnf (PInferRef x1 x2) = rnf x1 `seq` rnf x2 `seq` ()+ rnf (PRef x1 x2 x3) = rnf x1 `seq` rnf x2 `seq` x3 `seq` ()+ rnf (PInferRef x1 x2 x3) = rnf x1 `seq` rnf x2 `seq` x3 `seq` () rnf (PPatvar x1 x2) = rnf x1 `seq` rnf x2 `seq` () rnf (PLam _ x1 x2 x3 x4) = rnf x1 `seq` rnf x2 `seq` rnf x3 `seq` rnf x4 `seq` () rnf (PPi x1 x2 x3 x4 x5)@@ -234,11 +244,11 @@ rnf (PResolveTC x1) = rnf x1 `seq` () rnf (PRewrite x1 x2 x3 x4) = rnf x1 `seq` rnf x2 `seq` rnf x3 `seq` rnf x4 `seq` ()- rnf (PPair x1 x2 x3 x4) = rnf x1 `seq` rnf x2 `seq` rnf x3 `seq` rnf x4 `seq` ()- rnf (PDPair x1 x2 x3 x4 x5)- = rnf x1 `seq` rnf x2 `seq` rnf x3 `seq` rnf x4 `seq` rnf x5 `seq` ()+ rnf (PPair x1 x2 x3 x4 x5) = rnf x1 `seq` rnf x2 `seq` rnf x3 `seq` rnf x4 `seq` x5 `seq` ()+ rnf (PDPair x1 x2 x3 x4 x5 x6)+ = rnf x1 `seq` rnf x2 `seq` rnf x3 `seq` rnf x4 `seq` rnf x5 `seq` x6 `seq` () rnf (PAs x1 x2 x3) = rnf x1 `seq` rnf x2 `seq` rnf x3 `seq` ()- rnf (PAlternative x1 x2) = rnf x1 `seq` rnf x2 `seq` ()+ rnf (PAlternative x1 x2 x3) = rnf x1 `seq` rnf x2 `seq` rnf x3 `seq` () rnf (PHidden x1) = rnf x1 `seq` () rnf (PType fc) = rnf fc `seq` () rnf (PUniverse _) = ()@@ -260,12 +270,14 @@ rnf (PNoImplicits x1) = rnf x1 `seq` () rnf (PQuasiquote x1 x2) = rnf x1 `seq` rnf x2 `seq` () rnf (PUnquote x1) = rnf x1 `seq` ()- rnf (PQuoteName x1) = rnf x1 `seq` ()- rnf (PRunElab x1 x2) = rnf x1 `seq` rnf x2 `seq` ()+ rnf (PQuoteName x1 x2) = rnf x1 `seq` rnf x2 `seq` ()+ rnf (PRunElab x1 x2 x3) = rnf x1 `seq` rnf x2 `seq` rnf x3 `seq` ()+ rnf (PConstSugar x1 x2) = rnf x1 `seq` rnf x2 `seq` () instance NFData PAltType where rnf (ExactlyOne x1) = rnf x1 `seq` () rnf FirstSuccess = ()+ rnf TryImplicit = () instance (NFData t) => NFData (PTactic' t) where rnf (Intro x1) = rnf x1 `seq` ()@@ -285,8 +297,8 @@ rnf Compute = () rnf Trivial = () rnf TCInstance = ()- rnf (ProofSearch r r1 r2 x1 x2)- = rnf x1 `seq` rnf x2 `seq` ()+ rnf (ProofSearch r r1 r2 x1 x2 x3)+ = rnf x1 `seq` rnf x2 `seq` rnf x3 `seq` () rnf Solve = () rnf Attack = () rnf ProofState = ()@@ -310,12 +322,6 @@ rnf SourceFC = () rnf Unfocus = () -instance NFData ErrorReportPart where- rnf (TermPart x1) = rnf x1 `seq` ()- rnf (TextPart x1) = rnf x1 `seq` ()- rnf (NamePart x1) = rnf x1 `seq` ()- rnf (SubReport x1) = rnf x1 `seq` ()- instance (NFData t) => NFData (PDo' t) where rnf (DoExp x1 x2) = rnf x1 `seq` rnf x2 `seq` () rnf (DoBind x1 x2 x3 x4) = rnf x1 `seq` rnf x2 `seq` rnf x3 `seq` rnf x4 `seq` ()@@ -363,6 +369,7 @@ instance NFData Syntax where rnf (Rule x1 x2 x3) = rnf x1 `seq` rnf x2 `seq` rnf x3 `seq` ()+ rnf (DeclRule x1 x2) = rnf x1 `seq` rnf x2 `seq` () instance NFData SSymbol where rnf (Keyword x1) = rnf x1 `seq` ()
src/Idris/Delaborate.hs view
@@ -1,6 +1,6 @@ {-# LANGUAGE PatternGuards #-} {-# OPTIONS_GHC -fwarn-incomplete-patterns #-}-module Idris.Delaborate (annName, bugaddr, delab, delab', delabMV, delabTy, delabTy', fancifyAnnots, pprintDelab, pprintDelabTy, pprintErr) where+module Idris.Delaborate (annName, bugaddr, delab, delab', delabMV, delabSugared, delabTy, delabTy', fancifyAnnots, pprintDelab, pprintDelabTy, pprintErr, resugar) where -- Convert core TT back into high level syntax, primarily for display -- purposes.@@ -15,15 +15,63 @@ import Prelude hiding ((<$>)) +import Data.Generics.Uniplate.Data (transform) import Data.Maybe (mapMaybe) import Data.List (intersperse, nub) import qualified Data.Text as T+import Control.Applicative (Alternative((<|>))) import Control.Monad.State import Debug.Trace bugaddr = "https://github.com/idris-lang/Idris-dev/issues" +-- | Re-add syntactic sugar in a term+resugar :: IState -> PTerm -> PTerm+resugar ist = transform flattenDoLet . transform resugarApp+ where+ resugarApp (PApp fc (PRef _ _ n) args)+ | [c, t, f] <- mapMaybe explicitTerm args+ , basename n == sUN "ifThenElse"+ = PIfThenElse fc c (dedelay t) (dedelay f)+ resugarApp (PApp fc (PRef _ _ n) args)+ | [v, PLam _ bn _ _ next] <- mapMaybe explicitTerm args+ , basename n == sUN ">>="+ = let step = if bn `elem` namesIn [] ist next+ then DoBind fc bn NoFC v+ else DoExp NoFC v+ in case resugarApp next of+ PDoBlock dos -> PDoBlock (step : dos)+ expr -> PDoBlock [step, DoExp NoFC expr]+ resugarApp (PApp fc (PRef _ _ n) args)+ | [PConstant fc (BI i)] <- mapMaybe explicitTerm args+ , basename n == sUN "fromInteger"+ = PConstant fc (BI i)+ resugarApp tm = tm++ flattenDoLet (PLet _ ln _ ty v bdy)+ | PDoBlock dos <- flattenDoLet bdy+ = PDoBlock (DoLet NoFC ln NoFC ty v : dos)+ flattenDoLet (PDoBlock dos) =+ PDoBlock $ concatMap fixExp dos+ where fixExp (DoExp _ (PLet _ ln _ ty v bdy)) =+ DoLet NoFC ln NoFC ty v : fixExp (DoExp NoFC bdy)+ fixExp d = [d]+ flattenDoLet tm = tm++ dedelay (PApp _ (PRef _ _ delay) [_, _, obj])+ | delay == sUN "Delay" = getTm obj+ dedelay x = x++ explicitTerm (PExp {getTm = tm}) = Just tm+ explicitTerm _ = Nothing+++-- | Delaborate and resugar a term+delabSugared :: IState -> Term -> PTerm+delabSugared ist tm = resugar ist $ delab ist tm++-- | Delaborate a term without resugaring delab :: IState -> Term -> PTerm delab i tm = delab' i tm False False @@ -50,16 +98,16 @@ where un = fileFC "(val)" - de env _ (App _ f a) = resugarApp env $ deFn env f [a]- de env _ (V i) | i < length env = PRef un (snd (env!!i))- | otherwise = PRef un (sUN ("v" ++ show i ++ ""))+ de env _ (App _ f a) = deFn env f [a]+ de env _ (V i) | i < length env = PRef un [] (snd (env!!i))+ | otherwise = PRef un [] (sUN ("v" ++ show i ++ "")) de env _ (P _ n _) | n == unitTy = PTrue un IsType | n == unitCon = PTrue un IsTerm- | Just n' <- lookup n env = PRef un n'+ | Just n' <- lookup n env = PRef un [] n' | otherwise = case lookup n (idris_metavars ist) of- Just (Just _, mi, _) -> mkMVApp n []- _ -> PRef un n+ Just (Just _, mi, _, _) -> mkMVApp n []+ _ -> PRef un [] n de env _ (Bind n (Lam ty) sc) = PLam un n NoFC (de env [] ty) (de ((n,n):env) [] sc) de env is (Bind n (Pi (Just impl) ty _) sc)@@ -106,22 +154,22 @@ deFn env (App _ f a) args = deFn env f (a:args) deFn env (P _ n _) [l,r]- | n == pairTy = PPair un IsType (de env [] l) (de env [] r)+ | n == pairTy = PPair un [] IsType (de env [] l) (de env [] r) | n == sUN "lazy" = de env [] r -- TODO: Fix string based matching deFn env (P _ n _) [ty, Bind x (Lam _) r] | n == sigmaTy- = PDPair un IsType (PRef un x) (de env [] ty)+ = PDPair un [] IsType (PRef un [] x) (de env [] ty) (de ((x,x):env) [] (instantiate (P Bound x ty) r)) deFn env (P _ n _) [lt,rt,l,r]- | n == pairCon = PPair un IsTerm (de env [] l) (de env [] r)- | n == sigmaCon = PDPair un IsTerm (de env [] l) Placeholder- (de env [] r)+ | n == pairCon = PPair un [] IsTerm (de env [] l) (de env [] r)+ | n == sigmaCon = PDPair un [] IsTerm (de env [] l) Placeholder+ (de env [] r) deFn env f@(P _ n _) args | n `elem` map snd env = PApp un (de env [] f) (map pexp (map (de env []) args)) deFn env (P _ n _) args | not mvs = case lookup n (idris_metavars ist) of- Just (Just _, mi, _) ->+ Just (Just _, mi, _, _) -> mkMVApp n (drop mi (map (de env []) args)) _ -> mkPApp n (map (de env []) args) | otherwise = mkPApp n (map (de env []) args)@@ -133,8 +181,8 @@ = PApp un (PMetavar NoFC n) (map pexp args) mkPApp n args | Just imps <- lookupCtxtExact n (idris_implicits ist)- = PApp un (PRef un n) (zipWith imp (imps ++ repeat (pexp undefined)) args)- | otherwise = PApp un (PRef un n) (map pexp args)+ = PApp un (PRef un [] n) (zipWith imp (imps ++ repeat (pexp undefined)) args)+ | otherwise = PApp un (PRef un [] n) (map pexp args) imp (PImp p m l n _) arg = PImp p m l n arg imp (PExp p l n _) arg = PExp p l n arg@@ -147,17 +195,6 @@ isCN (SN (CaseN _)) = True isCN _ = False - resugarApp env (PApp _ (PRef _ n) args)- | [c, t, f] <- mapMaybe explicitTerm args- , basename n == sUN "ifThenElse"- = PIfThenElse un c (dedelay t) (dedelay f)- where dedelay (PApp _ (PRef _ delay) [_, _, obj])- | delay == sUN "Delay" = getTm obj- dedelay x = x- explicitTerm (PExp {getTm = tm}) = Just tm- explicitTerm _ = Nothing- resugarApp env tm = tm- delabCase :: [(Name, Name)] -> [PArg] -> Name -> Term -> Name -> [Term] -> Maybe PTerm delabCase env imps scvar scrutinee caseName caseArgs = do cases <- case lookupCtxt caseName (idris_patdefs ist) of@@ -187,7 +224,7 @@ -- | Pretty-print a core term using delaboration pprintDelab :: IState -> Term -> Doc OutputAnnotation pprintDelab ist tm = annotate (AnnTerm [] tm)- (prettyIst ist (delab ist tm))+ (prettyIst ist (delabSugared ist tm)) -- | Pretty-print the type of some name pprintDelabTy :: IState -> Name -> Doc OutputAnnotation@@ -195,8 +232,8 @@ = case lookupTy n (tt_ctxt i) of (ty:_) -> annotate (AnnTerm [] ty) . prettyIst i $ case lookupCtxt n (idris_implicits i) of- (imps:_) -> delabTy' i imps ty False False- _ -> delabTy' i [] ty False False+ (imps:_) -> resugar i $ delabTy' i imps ty False False+ _ -> resugar i $ delabTy' i [] ty False False [] -> error "pprintDelabTy got a name that doesn't exist" pprintTerm :: IState -> PTerm -> Doc OutputAnnotation@@ -212,11 +249,11 @@ pprintProv i e (SourceTerm tm) = text "Type of " <> annotate (AnnTerm (zip (map fst e) (repeat False)) tm)- (pprintTerm' i (zip (map fst e) (repeat False)) (delab i tm))+ (pprintTerm' i (zip (map fst e) (repeat False)) (delabSugared i tm)) pprintProv i e (TooManyArgs tm) = text "Is " <> annotate (AnnTerm (zip (map fst e) (repeat False)) tm)- (pprintTerm' i (zip (map fst e) (repeat False)) (delab i tm))+ (pprintTerm' i (zip (map fst e) (repeat False)) (delabSugared i tm)) <> text " applied to too many arguments?" pprintErr :: IState -> Err -> Doc OutputAnnotation@@ -230,15 +267,15 @@ ] pprintErr' i (CantUnify _ (x_in, xprov) (y_in, yprov) e sc s) = let (x_ns, y_ns, nms) = renameMNs x_in y_in- (x, y) = addImplicitDiffs (delab i x_ns) (delab i y_ns) in- text "Can't unify" <> indented (annTm x_ns+ (x, y) = addImplicitDiffs (delabSugared i x_ns) (delabSugared i y_ns) in+ text "Type mismatch between" <> indented (annTm x_ns (pprintTerm' i (map (\ (n, b) -> (n, False)) sc ++ zip nms (repeat False)) x)) <> case xprov of Nothing -> empty Just t -> text " (" <> pprintProv i sc t <> text ")" <$>- text "with" <> indented (annTm y_ns+ text "and" <> indented (annTm y_ns (pprintTerm' i (map (\ (n, b) -> (n, False)) sc ++ zip nms (repeat False)) y)) <> case yprov of@@ -252,18 +289,20 @@ CantUnify _ (x_in', _) (y_in',_) _ _ _ | x_in == x_in' && y_in == y_in' -> empty _ -> line <> line <> text "Specifically:" <> indented (pprintErr' i e) <>- if (opt_errContext (idris_options i)) then showSc i sc else empty+ if (opt_errContext (idris_options i))+ then text "Unification failure" <$> showSc i sc+ else empty pprintErr' i (CantConvert x_in y_in env) = let (x_ns, y_ns, nms) = renameMNs x_in y_in- (x, y) = addImplicitDiffs (delab i (flagUnique x_ns)) - (delab i (flagUnique y_ns)) in- text "Can't convert" <>+ (x, y) = addImplicitDiffs (delabSugared i (flagUnique x_ns)) + (delabSugared i (flagUnique y_ns)) in+ text "Type mismatch between" <> indented (annTm x_ns (pprintTerm' i (map (\ (n, b) -> (n, False)) env) x)) <$>- text "with" <>+ text "and" <> indented (annTm y_ns (pprintTerm' i (map (\ (n, b) -> (n, False)) env) y)) <>- if (opt_errContext (idris_options i)) then line <> showSc i env else empty+ if (opt_errContext (idris_options i)) then line <> text "Conversion failure" <$> showSc i env else empty where flagUnique (Bind n (Pi i t k@(UType u)) sc) = App Complete (P Ref (sUN (show u)) Erased) (Bind n (Pi i (flagUnique t) k) (flagUnique sc))@@ -272,51 +311,96 @@ flagUnique t = t pprintErr' i (CantSolveGoal x env) = text "Can't solve goal " <>- indented (annTm x (pprintTerm' i (map (\ (n, b) -> (n, False)) env) (delab i x))) <>+ indented (annTm x (pprintTerm' i (map (\ (n, b) -> (n, False)) env) (delabSugared i x))) <> if (opt_errContext (idris_options i)) then line <> showSc i env else empty pprintErr' i (UnifyScope n out tm env) = text "Can't unify" <> indented (annName n) <+>- text "with" <> indented (annTm tm (pprintTerm' i (map (\ (n, b) -> (n, False)) env) (delab i tm))) <+>+ text "with" <> indented (annTm tm (pprintTerm' i (map (\ (n, b) -> (n, False)) env) (delabSugared i tm))) <+> text "as" <> indented (annName out) <> text "is not in scope" <> if (opt_errContext (idris_options i)) then line <> showSc i env else empty pprintErr' i (CantInferType t) = text "Can't infer type for" <+> text t pprintErr' i (NonFunctionType f ty) =- annTm f (pprintTerm i (delab i f)) <+>+ annTm f (pprintTerm i (delabSugared i f)) <+> text "does not have a function type" <+>- parens (pprintTerm i (delab i ty))+ parens (pprintTerm i (delabSugared i ty)) pprintErr' i (NotEquality tm ty) =- annTm tm (pprintTerm i (delab i tm)) <+>+ annTm tm (pprintTerm i (delabSugared i tm)) <+> text "does not have an equality type" <+>- annTm ty (parens (pprintTerm i (delab i ty)))+ annTm ty (parens (pprintTerm i (delabSugared i ty))) pprintErr' i (TooManyArguments f) = text "Too many arguments for" <+> annName f pprintErr' i (CantIntroduce ty) =- text "Can't use lambda here: type is" <+> annTm ty (pprintTerm i (delab i ty))+ text "Can't use lambda here: type is" <+> annTm ty (pprintTerm i (delabSugared i ty)) pprintErr' i (InfiniteUnify x tm env) = text "Unifying" <+> annName' x (showbasic x) <+> text "and" <+>- annTm tm (pprintTerm' i (map (\ (n, b) -> (n, False)) env) (delab i tm)) <+>+ annTm tm (pprintTerm' i (map (\ (n, b) -> (n, False)) env) (delabSugared i tm)) <+> text "would lead to infinite value" <> if (opt_errContext (idris_options i)) then line <> showSc i env else empty pprintErr' i (NotInjective p x y) =- text "Can't verify injectivity of" <+> annTm p (pprintTerm i (delab i p)) <+>- text " when unifying" <+> annTm x (pprintTerm i (delab i x)) <+> text "and" <+>- annTm y (pprintTerm i (delab i y))-pprintErr' i (CantResolve _ c) = text "Can't resolve type class" <+> pprintTerm i (delab i c)+ text "Can't verify injectivity of" <+> annTm p (pprintTerm i (delabSugared i p)) <+>+ text " when unifying" <+> annTm x (pprintTerm i (delabSugared i x)) <+> text "and" <+>+ annTm y (pprintTerm i (delabSugared i y))+pprintErr' i (CantResolve _ c) = text "Can't resolve type class" <+> pprintTerm i (delabSugared i c) pprintErr' i (InvalidTCArg n t) - = annTm t (pprintTerm i (delab i t)) <+> text " cannot be a parameter of "+ = annTm t (pprintTerm i (delabSugared i t)) <+> text " cannot be a parameter of " <> annName n <$> text "(Type class arguments must be injective)" pprintErr' i (CantResolveAlts as) = text "Can't disambiguate name:" <+> align (cat (punctuate (comma <> space) (map (fmap (fancifyAnnots i True) . annName) as)))+pprintErr' i (NoValidAlts as) = text "Can't disambiguate since no name has a suitable type:" <+>+ indented (align (cat (punctuate (comma <> space) (map (fmap (fancifyAnnots i True) . annName) as)))) pprintErr' i (NoTypeDecl n) = text "No type declaration for" <+> annName n pprintErr' i (NoSuchVariable n) = text "No such variable" <+> annName n pprintErr' i (WithFnType ty) =- text "Can't match on a function: type is" <+> annTm ty (pprintTerm i (delab i ty))+ text "Can't match on a function: type is" <+> annTm ty (pprintTerm i (delabSugared i ty)) pprintErr' i (CantMatch t) =- text "Can't match on" <+> annTm t (pprintTerm i (delab i t))-pprintErr' i (IncompleteTerm t) = text "Incomplete term" <+> annTm t (pprintTerm i (delab i t))+ text "Can't match on" <+> annTm t (pprintTerm i (delabSugared i t))+pprintErr' i (IncompleteTerm t) + = align (cat (punctuate (comma <> space) + (map pprintIncomplete (nub $ getMissing [] [] t))))+ where + pprintIncomplete (tm, arg)+ | expname arg+ = text "Can't infer explicit argument to" <+>+ annTm tm (pprintTerm i (delabSugared i tm))+ | otherwise+ = text "Can't infer argument" <+> annName arg <+> text "to" <+>+ annTm tm (pprintTerm i (delabSugared i tm))++ expname (UN n) = case str n of+ ('_':_) -> True+ _ -> False+ expname (MN _ n) = case str n of+ ('_':_) -> True+ _ -> False+ expname _ = False++ getMissing :: [Name] -> [Name] -> Term -> [(Term, Name)]+ getMissing hs env (Bind n (Hole ty) sc)+ = getMissing (n : hs) (n : env) sc+ getMissing hs env (Bind n (Guess _ _) sc)+ = getMissing (n : hs) (n : env) sc+ getMissing hs env (Bind n (Let t v) sc)+ = getMissing hs env t ++ + getMissing hs env v +++ getMissing hs (n : env) sc+ getMissing hs env (Bind n b sc)+ = getMissing hs env (binderTy b) +++ getMissing hs (n : env) sc+ getMissing hs env ap@(App _ _ _)+ | (fn@(P _ n _), args) <- unApply ap = getMissingArgs fn args+ where+ getMissingArgs n [] = []+ getMissingArgs n (V i : as)+ | env!!i `elem` hs = (n, env!!i) : getMissingArgs n as+ getMissingArgs n (P _ a _ : as) + | a `elem` hs = (n, a) : getMissingArgs n as+ getMissingArgs n (a : as) = getMissing hs env a ++ getMissingArgs n as+ getMissing hs env (App _ f a)+ = getMissing hs env f ++ getMissing hs env a+ getMissing hs env _ = [] pprintErr' i (NoEliminator s t) = text "No " <> text s <> text " for type " <+>- annTm t (pprintTerm i (delab i t)) <$>+ annTm t (pprintTerm i (delabSugared i t)) <$> text "Please note that 'induction' is experimental." <$> text "Only types declared with '%elim' can be used." <$> text "Consider writing a pattern matching definition instead."@@ -344,21 +428,21 @@ pprintErr' i (AlreadyDefined n) = annName n<+> text "is already defined" pprintErr' i (ProofSearchFail e) = pprintErr' i e-pprintErr' i (NoRewriting tm) = text "rewrite did not change type" <+> annTm tm (pprintTerm i (delab i tm))+pprintErr' i (NoRewriting tm) = text "rewrite did not change type" <+> annTm tm (pprintTerm i (delabSugared i tm)) pprintErr' i (At f e) = annotate (AnnFC f) (text (show f)) <> colon <> pprintErr' i e-pprintErr' i (Elaborating s n e) = text "When elaborating" <+> text s <>+pprintErr' i (Elaborating s n e) = text "When checking" <+> text s <> annName' n (showqual i n) <> colon <$> pprintErr' i e pprintErr' i (ElaboratingArg f x _ e) | isInternal f = pprintErr' i e | isUN x =- text "When elaborating argument" <+>+ text "When checking argument" <+> annotate (AnnBoundName x False) (text (showbasic x)) <+> -- TODO check plicity -- Issue #1591 on the issue tracker: https://github.com/idris-lang/Idris-dev/issues/1591 text "to" <+> whatIsName <> annName f <> colon <> indented (pprintErr' i e) | otherwise =- text "When elaborating an application of" <+> whatIsName <>+ text "When checking an application of" <+> whatIsName <> annName f <> colon <> indented (pprintErr' i e) where whatIsName = let ctxt = tt_ctxt i in if isTConName f ctxt@@ -376,23 +460,18 @@ pprintErr' i (ProviderError msg) = text ("Type provider error: " ++ msg) pprintErr' i (LoadingFailed fn e) = text "Loading" <+> text fn <+> text "failed:" <+> pprintErr' i e pprintErr' i (ReflectionError parts orig) =- let parts' = map (fillSep . map showPart) parts in+ let parts' = map (fillSep . map (showPart i)) parts in align (fillSep parts') <> if (opt_origerr (idris_options i)) then line <> line <> text "Original error:" <$> indented (pprintErr' i orig) else empty- where showPart :: ErrorReportPart -> Doc OutputAnnotation- showPart (TextPart str) = fillSep . map text . words $ str- showPart (NamePart n) = annName n- showPart (TermPart tm) = pprintTerm i (delab i tm)- showPart (SubReport rs) = indented . hsep . map showPart $ rs pprintErr' i (ReflectionFailed msg err) = text "When attempting to perform error reflection, the following internal error occurred:" <> indented (pprintErr' i err) <> text ("This is probably a bug. Please consider reporting it at " ++ bugaddr) pprintErr' i (ElabScriptDebug msg tm holes) = text "Elaboration halted." <>- maybe empty (indented . text) msg <>+ indented (align . hsep $ map (showPart i) msg) <> line <> line <> text "Holes:" <> indented (vsep (map ppHole holes)) <> line <> line <>@@ -415,7 +494,16 @@ pprintErr' i (ElabScriptStuck tm) = text "Can't run" <+> pprintTT [] tm <+> text "as an elaborator script." <$> text "Is it a stuck term?"+pprintErr' i (RunningElabScript e) =+ text "While running an elaboration script, the following error occurred" <> colon <$> pprintErr' i e +showPart :: IState -> ErrorReportPart -> Doc OutputAnnotation+showPart ist (TextPart str) = fillSep . map text . words $ str+showPart ist (NamePart n) = annName n+showPart ist (TermPart tm) = pprintTerm ist (delabSugared ist tm)+showPart ist (RawPart tm) = pprintRaw [] tm+showPart ist (SubReport rs) = indented . hsep . map (showPart ist) $ rs+ -- | Make sure the machine invented names are shown helpfully to the user, so -- that any names which differ internally also differ visibly renameMNs :: Term -> Term -> (Term, Term, [Name])@@ -483,19 +571,19 @@ = let (a', c') = addI a c (b', d') = addI b d in (PPi p n fc a' b', PPi p' n' fc' c' d')- addI (PPair fc pi a b) (PPair fc' pi' c d)+ addI (PPair fc hls pi a b) (PPair fc' hls' pi' c d) = let (a', c') = addI a c (b', d') = addI b d in- (PPair fc pi a' b', PPair fc' pi' c' d')- addI (PDPair fc pi a t b) (PDPair fc' pi' c u d)+ (PPair fc hls pi a' b', PPair fc' hls' pi' c' d')+ addI (PDPair fc hls pi a t b) (PDPair fc' hls' pi' c u d) = let (a', c') = addI a c (t', u') = addI t u (b', d') = addI b d in- (PDPair fc pi a' t' b', PDPair fc' pi' c' u' d')+ (PDPair fc hls pi a' t' b', PDPair fc' hls' pi' c' u' d') addI x y = (x, y) -- Just the ones which appear desugared in errors- expLike (PRef _ n) (PRef _ n') = n == n'+ expLike (PRef _ _ n) (PRef _ _ n') = n == n' expLike (PApp _ f as) (PApp _ f' as') = expLike f f' && length as == length as' && and (zipWith expLike (getExps as) (getExps as'))@@ -503,8 +591,8 @@ = n == n' && expLike s s' && expLike t t' expLike (PLam _ n _ s t) (PLam _ n' _ s' t') = n == n' && expLike s s' && expLike t t'- expLike (PPair _ _ x y) (PPair _ _ x' y') = expLike x x' && expLike y y'- expLike (PDPair _ _ x _ y) (PDPair _ _ x' _ y') = expLike x x' && expLike y y'+ expLike (PPair _ _ _ x y) (PPair _ _ _ x' y') = expLike x x' && expLike y y'+ expLike (PDPair _ _ _ x _ y) (PDPair _ _ _ x' _ y') = expLike x x' && expLike y y' expLike x y = x == y -- Issue #1589 on the issue tracker@@ -528,18 +616,18 @@ -- | Add extra metadata to an output annotation, optionally marking metavariables. fancifyAnnots :: IState -> Bool -> OutputAnnotation -> OutputAnnotation-fancifyAnnots ist meta annot@(AnnName n _ _ _) =+fancifyAnnots ist meta annot@(AnnName n nt _ _) = do let ctxt = tt_ctxt ist docs = docOverview ist n ty = Just (getTy ist n) case () of- _ | isDConName n ctxt -> AnnName n (Just DataOutput) docs ty- _ | isFnName n ctxt -> AnnName n (Just FunOutput) docs ty- _ | isTConName n ctxt -> AnnName n (Just TypeOutput) docs ty+ _ | isDConName n ctxt -> AnnName n (nt <|> Just DataOutput) docs ty+ _ | isFnName n ctxt -> AnnName n (nt <|> Just FunOutput) docs ty+ _ | isTConName n ctxt -> AnnName n (nt <|> Just TypeOutput) docs ty _ | isMetavarName n ist -> if meta- then AnnName n (Just MetavarOutput) docs ty- else AnnName n (Just FunOutput) docs ty- _ | isPostulateName n ist -> AnnName n (Just PostulateOutput) docs ty+ then AnnName n (nt <|> Just MetavarOutput) docs ty+ else AnnName n (nt <|> Just FunOutput) docs ty+ _ | isPostulateName n ist -> AnnName n (nt <|> Just PostulateOutput) docs ty _ | otherwise -> annot where docOverview :: IState -> Name -> Maybe String -- pretty-print first paragraph of docs docOverview ist n = do docs <- lookupCtxtExact n (idris_docstrings ist)@@ -554,7 +642,7 @@ return (out "") getTy :: IState -> Name -> String -- fails if name not already extant! getTy ist n = let theTy = pprintPTerm (ppOptionIst ist) [] [] (idris_infixes ist) $- delabTy ist n+ resugar ist $ delabTy ist n in (displayS . renderPretty 1.0 50 $ theTy) "" fancifyAnnots _ _ annot = annot @@ -564,7 +652,7 @@ indented (vsep (reverse (showSc' [] xs))) where showSc' bnd [] = [] showSc' bnd ((n, ty):ctxt) =- let this = bindingOf n False <+> colon <+> pprintTerm' i bnd (delab i ty)+ let this = bindingOf n False <+> colon <+> pprintTerm' i bnd (delabSugared i ty) in this : showSc' ((n,False):bnd) ctxt
src/Idris/Directives.hs view
@@ -1,9 +1,10 @@ -module Idris.Directives where+module Idris.Directives(directiveAction) where import Idris.AbsSyntax import Idris.ASTUtils import Idris.Imports+import Idris.Output (sendHighlighting) import Idris.Core.Evaluate import Idris.Core.TT@@ -43,15 +44,24 @@ Left lib -> addIBC (IBCDyLib (lib_name lib)) Right msg -> fail $ msg -directiveAction (DNameHint ty ns) = do ty' <- disambiguate ty- mapM_ (addNameHint ty') ns- mapM_ (\n -> addIBC (IBCNameHint (ty', n))) ns+directiveAction (DNameHint ty tyFC ns) = do ty' <- disambiguate ty+ mapM_ (addNameHint ty' . fst) ns+ mapM_ (\n -> addIBC (IBCNameHint (ty', fst n))) ns+ sendHighlighting $+ [(tyFC, AnnName ty' Nothing Nothing Nothing)] +++ map (\(n, fc) -> (fc, AnnBoundName n False)) ns -directiveAction (DErrorHandlers fn arg ns) = do fn' <- disambiguate fn- ns' <- mapM disambiguate ns- addFunctionErrorHandlers fn' arg ns'- mapM_ (addIBC .- IBCFunctionErrorHandler fn' arg) ns'+directiveAction (DErrorHandlers fn nfc arg afc ns) =+ do fn' <- disambiguate fn+ ns' <- mapM (\(n, fc) -> do n' <- disambiguate n+ return (n', fc)) ns+ addFunctionErrorHandlers fn' arg (map fst ns')+ mapM_ (addIBC .+ IBCFunctionErrorHandler fn' arg . fst) ns'+ sendHighlighting $+ [(nfc, AnnName fn' Nothing Nothing Nothing),+ (afc, AnnBoundName arg False)] +++ map (\(n, fc) -> (fc, AnnName n Nothing Nothing Nothing)) ns' directiveAction (DLanguage ext) = addLangExt ext
src/Idris/Docs.hs view
@@ -1,6 +1,6 @@ {-# LANGUAGE DeriveFunctor, PatternGuards, MultiWayIf #-} {-# OPTIONS_GHC -fwarn-incomplete-patterns #-}-module Idris.Docs (pprintDocs, getDocs, pprintConstDocs, FunDoc, FunDoc'(..), Docs, Docs'(..)) where+module Idris.Docs (pprintDocs, getDocs, pprintConstDocs, pprintTypeDoc, FunDoc, FunDoc'(..), Docs, Docs'(..)) where import Idris.AbsSyntax import Idris.AbsSyntaxTree@@ -53,17 +53,26 @@ | otherwise = text " -- " <> renderDocstring (renderDocTerm (pprintDelab ist) (normaliseAll (tt_ctxt ist) [])) d -pprintFD :: IState -> FunDoc -> Doc OutputAnnotation-pprintFD ist (FD n doc args ty f)- = nest 4 (prettyName True (ppopt_impl ppo) [] n <+> colon <+>+pprintFD :: IState -> Bool -> Bool -> FunDoc -> Doc OutputAnnotation+pprintFD ist totalityFlag nsFlag (FD n doc args ty f)+ = nest 4 (prettyName True nsFlag [] n <+> colon <+> pprintPTerm ppo [] [ n | (n@(UN n'),_,_,_) <- args , not (T.isPrefixOf (T.pack "__") n') ] infixes ty <$>+ -- show doc renderDocstring (renderDocTerm (pprintDelab ist) (normaliseAll (tt_ctxt ist) [])) doc <$>+ -- show fixity maybe empty (\f -> text (show f) <> line) f <>+ -- show arguments doc let argshow = showArgs args [] in- if not (null argshow)+ (if not (null argshow) then nest 4 $ text "Arguments:" <$> vsep argshow- else empty)+ else empty) <>+ -- show totality status+ let totality = getTotality in+ (if totalityFlag && not (null totality) then+ line <> (vsep . map (\t -> text "The function is" <+> t) $ totality)+ else+ empty)) where ppo = ppOptionIst ist infixes = idris_infixes ist@@ -87,15 +96,21 @@ showArgs args ((n, True):bnd) showArgs ((n, _, _, _):args) bnd = showArgs args ((n, True):bnd) showArgs [] _ = []+ getTotality = map (text . show) $ lookupTotal n (tt_ctxt ist) +pprintFDWithTotality :: IState -> Bool -> FunDoc -> Doc OutputAnnotation+pprintFDWithTotality ist = pprintFD ist True +pprintFDWithoutTotality :: IState -> Bool -> FunDoc -> Doc OutputAnnotation+pprintFDWithoutTotality ist = pprintFD ist False+ pprintDocs :: IState -> Docs -> Doc OutputAnnotation-pprintDocs ist (FunDoc d) = pprintFD ist d+pprintDocs ist (FunDoc d) = pprintFDWithTotality ist True d pprintDocs ist (DataDoc t args)- = text "Data type" <+> pprintFD ist t <$>+ = text "Data type" <+> pprintFDWithoutTotality ist True t <$> if null args then text "No constructors." else nest 4 (text "Constructors:" <> line <>- vsep (map (pprintFD ist) args))+ vsep (map (pprintFDWithoutTotality ist False) args)) pprintDocs ist (ClassDoc n doc meths params instances subclasses superclasses ctor) = nest 4 (text "Type class" <+> prettyName True (ppopt_impl ppo) [] n <> if nullDocstring doc@@ -105,12 +120,12 @@ nest 4 (text "Parameters:" <$> prettyParameters) <> line <$> nest 4 (text "Methods:" <$>- vsep (map (pprintFD ist) meths))+ vsep (map (pprintFDWithTotality ist False) meths)) <$> maybe empty ((<> line) . nest 4 . (text "Instance constructor:" <$>) .- pprintFD ist)+ pprintFDWithoutTotality ist False) ctor <> nest 4 (text "Instances:" <$>@@ -182,12 +197,12 @@ updateArgs ps (a:as) = a : updateArgs ps as updateArgs _ _ = [] - updateRef nm (PRef fc _) = PRef fc nm+ updateRef nm (PRef fc _ _) = PRef fc [] nm updateRef _ pt = pt - isSubclass (PPi (Constraint _ _) _ _ (PApp _ _ args) (PApp _ (PRef _ nm) args')) = nm == n && map getTm args == map getTm args'- isSubclass (PPi _ _ _ _ pt) = isSubclass pt- isSubclass _ = False+ isSubclass (PPi (Constraint _ _) _ _ (PApp _ _ args) (PApp _ (PRef _ _ nm) args')) = nm == n && map getTm args == map getTm args'+ isSubclass (PPi _ _ _ _ pt) = isSubclass pt+ isSubclass _ = False prettyParameters = if any (isJust . snd) params@@ -195,7 +210,7 @@ else hsep (punctuate comma (map (prettyName True False params' . fst) params)) pprintDocs ist (NamedInstanceDoc _cls doc)- = nest 4 (text "Named instance:" <$> pprintFD ist doc)+ = nest 4 (text "Named instance:" <$> pprintFDWithoutTotality ist True doc) pprintDocs ist (ModDoc mod docs) = nest 4 $ text "Module" <+> text (concat (intersperse "." mod)) <> colon <$>@@ -274,7 +289,7 @@ getDInst (PInstance _ _ _ _ _ _ _ _ t _ _) = Just t getDInst _ = Nothing - isSubclass (PPi (Constraint _ _) _ _ (PApp _ _ args) (PApp _ (PRef _ nm) args'))+ isSubclass (PPi (Constraint _ _) _ _ (PApp _ _ args) (PApp _ (PRef _ _ nm) args')) = nm == n && map getTm args == map getTm args' isSubclass (PPi _ _ _ _ pt) = isSubclass pt@@ -317,3 +332,8 @@ t (Str _) = PConstant NoFC StrType t (Ch c) = PConstant NoFC $ AType (ATInt ITChar) t _ = PType NoFC+++pprintTypeDoc :: IState -> Doc OutputAnnotation+pprintTypeDoc ist = prettyIst ist (PType emptyFC) <+> colon <+> type1Doc <+>+ nest 4 (line <> text typeDescription)
src/Idris/Docstrings.hs view
@@ -190,8 +190,7 @@ renderInline pp (Emph txt) = annotate (AnnTextFmt ItalicText) $ renderInlines pp txt renderInline pp (Strong txt) = annotate (AnnTextFmt BoldText) $ renderInlines pp txt renderInline pp (Code txt tm) = pp tm $ T.unpack txt-renderInline pp (Link body url title) = annotate (AnnTextFmt UnderlineText) (renderInlines pp body) <+>- parens (text $ T.unpack url)+renderInline pp (Link body url title) = annotate (AnnLink (T.unpack url)) (renderInlines pp body) renderInline pp (Image body url title) = text "<image>" -- TODO renderInline pp (Entity a) = text $ "<entity " ++ T.unpack a ++ ">" -- TODO renderInline pp (RawHtml txt) = text "<html content>" --TODO
src/Idris/Elab/AsPat.hs view
@@ -44,5 +44,5 @@ replaceUnderscore' :: PTerm -> State Int PTerm- replaceUnderscore' Placeholder = PRef emptyFC <$> fresh+ replaceUnderscore' Placeholder = PRef emptyFC [] <$> fresh replaceUnderscore' tm = return tm
src/Idris/Elab/Class.hs view
@@ -65,8 +65,8 @@ elabClass info syn_in doc fc constraints tn tnfc ps pDocs fds ds mcn cd = do let cn = fromMaybe (SN (InstanceCtorN tn)) (fst <$> mcn) let tty = pibind (map (\(n, _, ty) -> (n, ty)) ps) (PType fc)- let constraint = PApp fc (PRef fc tn)- (map (pexp . PRef fc) (map (\(n, _, _) -> n) ps))+ let constraint = PApp fc (PRef fc [] tn)+ (map (pexp . PRef fc []) (map (\(n, _, _) -> n) ps)) let syn = syn_in { using = addToUsing (using syn_in)@@ -142,7 +142,7 @@ = do when (not $ null cs) . tclift $ tfail (At fc (Msg $ "Default superclass instances can't have constraints.")) i <- getIState- let t = PApp fc (PRef fc n) (map pexp ps)+ let t = PApp fc (PRef fc [] n) (map pexp ps) let isConstrained = any (== t) (map snd constraints) when (not isConstrained) . tclift $ tfail (At fc (Msg $ "Default instances must be for a superclass constraint on the containing class."))@@ -174,7 +174,7 @@ let ds = map (decorateid defaultdec) [PTy emptyDocstring [] syn fc [] n nfc ty', PClauses fc (o ++ opts) n cs]- iLOG (show ds)+ logLvl 1 (show ds) return (n, ((defaultdec n, ds!!1), ds)) _ -> ifail $ show n ++ " is not a method" defdecl _ _ _ = ifail "Can't happen (defdecl)"@@ -195,16 +195,16 @@ = do let cfn = sUN ('@':'@':show cn ++ "#" ++ show con) -- SN (ParentN cn (show con)) let mnames = take (length all) $ map (\x -> sMN x "meth") [0..]- let capp = PApp fc (PRef fc cn) (map (pexp . PRef fc) mnames)- let lhs = PApp fc (PRef fc cfn) [pconst capp]+ let capp = PApp fc (PRef fc [] cn) (map (pexp . PRef fc []) mnames)+ let lhs = PApp fc (PRef fc [] cfn) [pconst capp] let rhs = PResolveTC (fileFC "HACK") let ty = PPi constraint cnm NoFC c con logLvl 2 ("Dictionary constraint: " ++ showTmImpls ty) logLvl 2 (showTmImpls lhs ++ " = " ++ showTmImpls rhs) i <- getIState let conn = case con of- PRef _ n -> n- PApp _ (PRef _ n) _ -> n+ PRef _ _ n -> n+ PApp _ (PRef _ _ n) _ -> n let conn' = case lookupCtxtName conn (idris_classes i) of [(n, _)] -> n _ -> conn@@ -225,13 +225,13 @@ tfun cn c syn all (m, (mfc, doc, o, ty)) = do let ty' = expandMethNS syn (insertConstraint c all ty) let mnames = take (length all) $ map (\x -> sMN x "meth") [0..]- let capp = PApp fc (PRef fc cn) (map (pexp . PRef fc) mnames)+ let capp = PApp fc (PRef fc [] cn) (map (pexp . PRef fc []) mnames) let margs = getMArgs ty let anames = map (\x -> sMN x "arg") [0..]- let lhs = PApp fc (PRef fc m) (pconst capp : lhsArgs margs anames)+ let lhs = PApp fc (PRef fc [] m) (pconst capp : lhsArgs margs anames) let rhs = PApp fc (getMeth mnames all m) (rhsArgs margs anames) logLvl 2 ("Top level type: " ++ showTmImpls ty')- iLOG (show (m, ty', capp, margs))+ logLvl 1 (show (m, ty', capp, margs)) logLvl 2 ("Definition: " ++ showTmImpls lhs ++ " = " ++ showTmImpls rhs) return [PTy doc [] syn fc o m mfc ty', PClauses fc [Inlinable] m [PClause fc m lhs [] rhs []]]@@ -242,16 +242,16 @@ getMArgs _ = [] getMeth :: [Name] -> [Name] -> Name -> PTerm- getMeth (m:ms) (a:as) x | x == a = PRef fc m+ getMeth (m:ms) (a:as) x | x == a = PRef fc [] m | otherwise = getMeth ms as x lhsArgs (EA _ : xs) (n : ns) = [] -- pexp (PRef fc n) : lhsArgs xs ns- lhsArgs (IA n : xs) ns = pimp n (PRef fc n) False : lhsArgs xs ns+ lhsArgs (IA n : xs) ns = pimp n (PRef fc [] n) False : lhsArgs xs ns lhsArgs (CA : xs) ns = lhsArgs xs ns lhsArgs [] _ = [] rhsArgs (EA _ : xs) (n : ns) = [] -- pexp (PRef fc n) : rhsArgs xs ns- rhsArgs (IA n : xs) ns = pexp (PRef fc n) : rhsArgs xs ns+ rhsArgs (IA n : xs) ns = pexp (PRef fc [] n) : rhsArgs xs ns rhsArgs (CA : xs) ns = pconst (PResolveTC fc) : rhsArgs xs ns rhsArgs [] _ = [] @@ -269,8 +269,8 @@ -- to the other methods in the class constrainMeths :: [Name] -> Name -> PTerm -> PTerm constrainMeths allM dictN tm = transform (addC allM dictN) tm- addC allM dictN m@(PRef fc n)- | n `elem` allM = PApp NoFC m [pconst (PRef NoFC dictN)]+ addC allM dictN m@(PRef fc hls n)+ | n `elem` allM = PApp NoFC m [pconst (PRef NoFC hls dictN)] | otherwise = m addC _ _ tm = tm @@ -290,7 +290,7 @@ -- | Get the docstring corresponding to a member, if one exists memberDocs :: PDecl -> Maybe (Name, Docstring (Either Err PTerm)) memberDocs (PTy d _ _ _ _ n _ _) = Just (basename n, d)-memberDocs (PPostulate _ d _ _ _ n _) = Just (basename n, d)+memberDocs (PPostulate _ d _ _ _ _ n _) = Just (basename n, d) memberDocs (PData d _ _ _ _ pdata) = Just (basename $ d_name pdata, d) memberDocs (PRecord d _ _ _ n _ _ _ _ _ _ _ ) = Just (basename n, d) memberDocs (PClass d _ _ _ n _ _ _ _ _ _ _) = Just (basename n, d)@@ -303,7 +303,7 @@ -> PTerm -> PTerm expandMethNS syn = mapPT expand where- expand (PRef fc n) | n `elem` imp_methods syn = PRef fc $ expandNS syn n+ expand (PRef fc hls n) | n `elem` imp_methods syn = PRef fc hls $ expandNS syn n expand t = t -- | Find the determining parameter locations
src/Idris/Elab/Clause.hs view
@@ -189,9 +189,9 @@ ist <- getIState -- let wf = wellFounded ist n sc- let tot = if pcover || AssertTotal `elem` opts- then Unchecked -- finish checking later- else Partial NotCovering -- already know it's not total+ let tot | pcover || AssertTotal `elem` opts = Unchecked -- finish later+ | PEGenerated `elem` opts = Generated + | otherwise = Partial NotCovering -- already know it's not total -- case lookupCtxt (namespace info) n (idris_flags ist) of -- [fs] -> if TotalFn `elem` fs@@ -224,20 +224,25 @@ (idris_patdefs ist) }) let caseInfo = CaseInfo (inlinable opts) (inlinable opts) (dictionary opts) case lookupTy n ctxt of- [ty] -> do updateContext (addCasedef n erInfo caseInfo+ [ty] -> do ctxt' <- do ctxt <- getContext+ tclift $+ addCasedef n erInfo caseInfo tcase defaultcase reflect (AssertTotal `elem` opts) atys inacc pats_pe- pdef - pdef -- compile time + pdef+ pdef -- compile time pdef_inl -- inlined- pdef' ty)+ pdef' ty+ ctxt+ setContext ctxt' addIBC (IBCDef n) setTotality n tot- when (not reflect) $ do totcheck (fc, n)+ when (not reflect && PEGenerated `notElem` opts) $ + do totcheck (fc, n) defer_totcheck (fc, n) when (tot /= Unchecked) $ addIBC (IBCTotal n tot) i <- getIState@@ -263,9 +268,14 @@ -- 'Partial NotCovering' when (CoveringFn `elem` opts) $ checkAllCovering fc [] n n where- noMatch i cs tm = all (\x -> case matchClause i (delab' i x True True) tm of+ noMatch i cs tm = all (\x -> case trim_matchClause i (delab' i x True True) tm of Right _ -> False Left miss -> True) cs+ where+ trim_matchClause i (PApp fcl fl ls) (PApp fcr fr rs)+ = let args = min (length ls) (length rs) in+ matchClause i (PApp fcl fl (take args ls))+ (PApp fcr fr (take args rs)) checkUndefined n ctxt = case lookupDef n ctxt of [] -> return ()@@ -368,18 +378,19 @@ logLvl 3 $ "PE definition " ++ show newnm ++ ":\n" ++ showSep "\n" (map (\ (lhs, rhs) ->- (show lhs ++ " = " +++ (showTmImpls lhs ++ " = " ++ showTmImpls rhs)) (pe_clauses specdecl)) logLvl 2 $ show n ++ " transformation rule: " ++- show rhs ++ " ==> " ++ show lhs+ showTmImpls rhs ++ " ==> " ++ showTmImpls lhs elabType info defaultSyntax emptyDocstring [] fc opts newnm NoFC specTy let def = map (\(lhs, rhs) ->- PClause fc newnm lhs [] rhs []) + let lhs' = mapPT hiddenToPH $ stripUnmatchable ist lhs in+ PClause fc newnm lhs' [] rhs []) (pe_clauses specdecl) trans <- elabTransform info fc False rhs lhs- elabClauses info fc opts newnm def+ elabClauses info fc (PEGenerated:opts) newnm def return [trans] else return []) -- if it doesn't work, just don't specialise. Could happen for lots@@ -388,6 +399,9 @@ (\e -> do logLvl 3 $ "Couldn't specialise: " ++ (pshow ist e) return []) + hiddenToPH (PHidden _) = Placeholder+ hiddenToPH x = x+ specName simpl (ImplicitS, tm) | (P Ref n _, _) <- unApply tm = Just (n, Just (if simpl then 1 else 0)) specName simpl (ExplicitS, tm)@@ -468,20 +482,20 @@ propagateParams :: IState -> [Name] -> Type -> PTerm -> PTerm-propagateParams i ps t tm@(PApp _ (PRef fc n) args)- = PApp fc (PRef fc n) (addP t args)+propagateParams i ps t tm@(PApp _ (PRef fc hls n) args)+ = PApp fc (PRef fc hls n) (addP t args) where addP (Bind n _ sc) (t : ts) | Placeholder <- getTm t, n `elem` ps, not (n `elem` allNamesIn tm)- = t { getTm = PRef fc n } : addP sc ts+ = t { getTm = PRef NoFC [] n } : addP sc ts addP (Bind n _ sc) (t : ts) = t : addP sc ts addP _ ts = ts-propagateParams i ps t (PRef fc n)+propagateParams i ps t (PRef fc hls n) = case lookupCtxt n (idris_implicits i) of [is] -> let ps' = filter (isImplicit is) ps in- PApp fc (PRef fc n) (map (\x -> pimp x (PRef fc x) True) ps')- _ -> PRef fc n+ PApp fc (PRef fc hls n) (map (\x -> pimp x (PRef fc [] x) True) ps')+ _ -> PRef fc hls n where isImplicit [] n = False isImplicit (PImp _ _ _ x _ : is) n | x == n = True isImplicit (_ : is) n = isImplicit is n@@ -529,7 +543,7 @@ let fn_is = case lookupCtxt fname (idris_implicits i) of [t] -> t _ -> []- let params = getParamsInType i [] fn_is fn_ty+ let params = getParamsInType i [] fn_is (normalise ctxt [] fn_ty) let lhs = mkLHSapp $ stripLinear i $ stripUnmatchable i $ propagateParams i params fn_ty (addImplPat i lhs_in) -- let lhs = mkLHSapp $ @@ -580,7 +594,7 @@ rep <- useREPL when rep $ do addInternalApp (fc_fname fc) (fst . fc_start $ fc) (delabMV i clhs) -- TODO: Should use span instead of line and filename?- addIBC (IBCLineApp (fc_fname fc) (fst . fc_start $ fc) (delabMV i clhs))+ addIBC (IBCLineApp (fc_fname fc) (fst . fc_start $ fc) (delabMV i clhs)) logLvl 5 ("Checked " ++ show clhs ++ "\n" ++ show clhsty) -- Elaborate where block@@ -618,6 +632,8 @@ ((rhs', defer, is, probs, ctxt', newDecls, highlights), _) <- tclift $ elaborate ctxt (idris_datatypes i) (sMN 0 "patRHS") clhsty initEState (do pbinds ist lhs_tm+ -- proof search can use explicitly written names+ mapM_ addPSname (allNamesIn lhs_in) mapM_ setinj (nub (params ++ inj)) setNextName (ElabResult _ _ is ctxt' newDecls highlights) <-@@ -641,10 +657,10 @@ logLvl 5 "DONE CHECK" logLvl 4 $ "---> " ++ show rhs'- when (not (null defer)) $ iLOG $ "DEFERRED " ++- show (map (\ (n, (_,_,t)) -> (n, t)) defer)+ when (not (null defer)) $ logLvl 1 $ "DEFERRED " +++ show (map (\ (n, (_,_,t,_)) -> (n, t)) defer) def' <- checkDef fc (Elaborating "deferred type of ") defer- let def'' = map (\(n, (i, top, t)) -> (n, (i, top, t, False))) def'+ let def'' = map (\(n, (i, top, t, ns)) -> (n, (i, top, t, ns, False))) def' addDeferred def'' mapM_ (\(n, _) -> addIBC (IBCDef n)) def'' @@ -720,7 +736,7 @@ borrowedB b = borrowedNames env (binderTy b) borrowedNames _ _ = [] - mkLHSapp t@(PRef _ _) = PApp fc t []+ mkLHSapp t@(PRef _ _ _) = PApp fc t [] mkLHSapp t = t decorate (NS x ns)@@ -758,7 +774,7 @@ where isArg' (PClause _ _ (PApp _ _ args) _ _ _) = any (\x -> case x of- PRef _ n' -> n == n'+ PRef _ _ n' -> n == n' _ -> False) (map getTm args) isArg' _ = False isArg _ _ = False@@ -776,7 +792,7 @@ let fn_is = case lookupCtxt fname (idris_implicits i) of [t] -> t _ -> []- let params = getParamsInType i [] fn_is fn_ty+ let params = getParamsInType i [] fn_is (normalise ctxt [] fn_ty) let lhs = stripLinear i $ stripUnmatchable i $ propagateParams i params fn_ty (addImplPat i lhs_in) logLvl 2 ("LHS: " ++ show lhs) (ElabResult lhs' dlhs [] ctxt' newDecls highlights, _) <-@@ -802,6 +818,8 @@ tclift $ elaborate ctxt (idris_datatypes i) (sMN 0 "withRHS") (bindTyArgs PVTy bargs infP) initEState (do pbinds i lhs_tm+ -- proof search can use explicitly written names+ mapM_ addPSname (allNamesIn lhs_in) setNextName -- TODO: may want where here - see winfo abpve (ElabResult _ d is ctxt' newDecls highlights) <- errAt "with value in " fname@@ -814,7 +832,7 @@ sendHighlighting highlights def' <- checkDef fc iderr defer- let def'' = map (\(n, (i, top, t)) -> (n, (i, top, t, False))) def'+ let def'' = map (\(n, (i, top, t, ns)) -> (n, (i, top, t, ns, False))) def' addDeferred def'' mapM_ (elabCaseBlock info opts) is logLvl 5 ("Checked wval " ++ show wval')@@ -876,8 +894,8 @@ addIBC (IBCImp wname) addIBC (IBCStatic wname) - def' <- checkDef fc iderr [(wname, (-1, Nothing, wtype))]- let def'' = map (\(n, (i, top, t)) -> (n, (i, top, t, False))) def'+ def' <- checkDef fc iderr [(wname, (-1, Nothing, wtype, []))]+ let def'' = map (\(n, (i, top, t, ns)) -> (n, (i, top, t, ns, False))) def' addDeferred def'' -- in the subdecls, lhs becomes:@@ -891,13 +909,13 @@ mapM_ (rec_elabDecl info EAll info) wb -- rhs becomes: fname' ps_pre wval ps_post Refl- let rhs = PApp fc (PRef fc wname)- (map (pexp . (PRef fc) . fst) bargs_pre +++ let rhs = PApp fc (PRef fc [] wname)+ (map (pexp . (PRef fc []) . fst) bargs_pre ++ pexp wval :- (map (pexp . (PRef fc) . fst) bargs_post) +++ (map (pexp . (PRef fc []) . fst) bargs_post) ++ case mpn of Nothing -> []- Just _ -> [pexp (PApp NoFC (PRef NoFC eqCon)+ Just _ -> [pexp (PApp NoFC (PRef NoFC [] eqCon) [ pimp (sUN "A") Placeholder False , pimp (sUN "x") Placeholder False ])])@@ -918,7 +936,7 @@ sendHighlighting highlights def' <- checkDef fc iderr defer- let def'' = map (\(n, (i, top, t)) -> (n, (i, top, t, False))) def'+ let def'' = map (\(n, (i, top, t, ns)) -> (n, (i, top, t, ns, False))) def' addDeferred def'' mapM_ (elabCaseBlock info opts) is logLvl 5 ("Checked RHS " ++ show rhs')@@ -960,21 +978,21 @@ = ifail $ show fc ++ ":badly formed with clause" addArg (PApp fc f args) w = PApp fc f (args ++ [pexp w])- addArg (PRef fc f) w = PApp fc (PRef fc f) [pexp w]+ addArg (PRef fc hls f) w = PApp fc (PRef fc hls f) [pexp w] - updateLHS n pn wname mvars ns_in ns_in' (PApp fc (PRef fc' n') args) w+ updateLHS n pn wname mvars ns_in ns_in' (PApp fc (PRef fc' hls' n') args) w = let ns = map (keepMvar (map fst mvars) fc') ns_in ns' = map (keepMvar (map fst mvars) fc') ns_in' in return $ substMatches mvars $- PApp fc (PRef fc' wname)+ PApp fc (PRef fc' [] wname) (map pexp ns ++ pexp w : (map pexp ns') ++ case pn of Nothing -> []- Just pnm -> [pexp (PRef fc pnm)])+ Just pnm -> [pexp (PRef fc [] pnm)]) updateLHS n pn wname mvars ns_in ns_in' tm w = updateLHS n pn wname mvars ns_in ns_in' (PApp fc tm []) w - keepMvar mvs fc v | v `elem` mvs = PRef fc v+ keepMvar mvs fc v | v `elem` mvs = PRef fc [] v | otherwise = Placeholder fullApp (PApp _ (PApp fc f args) xs) = fullApp (PApp fc f (args ++ xs))
src/Idris/Elab/Data.hs view
@@ -53,7 +53,7 @@ elabData :: ElabInfo -> SyntaxInfo -> Docstring (Either Err PTerm)-> [(Name, Docstring (Either Err PTerm))] -> FC -> DataOpts -> PData -> Idris () elabData info syn doc argDocs fc opts (PLaterdecl n nfc t_in) = do let codata = Codata `elem` opts- iLOG (show (fc, doc))+ logLvl 1 (show (fc, doc)) checkUndefined fc n (cty, _, t, inacc) <- buildType info syn fc [] n t_in @@ -63,7 +63,7 @@ elabData info syn doc argDocs fc opts (PDatadecl n nfc t_in dcons) = do let codata = Codata `elem` opts- iLOG (show fc)+ logLvl 1 (show fc) undef <- isUndefined fc n (cty, ckind, t, inacc) <- buildType info syn fc [] n t_in -- if n is defined already, make sure it is just a type declaration@@ -259,15 +259,15 @@ mkLazy (PPi pl n nfc ty sc) = let ty' = if getTyName ty- then PApp fc (PRef fc (sUN "Lazy'"))- [pexp (PRef fc (sUN "LazyCodata")),+ then PApp fc (PRef fc [] (sUN "Lazy'"))+ [pexp (PRef fc [] (sUN "LazyCodata")), pexp ty] else ty in PPi pl n nfc ty' (mkLazy sc) mkLazy t = t - getTyName (PApp _ (PRef _ n) _) = n == nsroot tn- getTyName (PRef _ n) = n == nsroot tn+ getTyName (PApp _ (PRef _ _ n) _) = n == nsroot tn+ getTyName (PRef _ _ n) = n == nsroot tn getTyName _ = False @@ -326,11 +326,11 @@ scrutineeIdxs <- namePis False idxs let motiveConstr = [(motiveName, expl, motive)] let scrutinee = (scrutineeName, expl, applyCons n (interlievePos paramPos generalParams scrutineeIdxs 0))- let eliminatorTy = piConstr (generalParams ++ motiveConstr ++ consTerms ++ scrutineeIdxs ++ [scrutinee]) (applyMotive (map (\(n,_,_) -> PRef elimFC n) scrutineeIdxs) (PRef elimFC scrutineeName))+ let eliminatorTy = piConstr (generalParams ++ motiveConstr ++ consTerms ++ scrutineeIdxs ++ [scrutinee]) (applyMotive (map (\(n,_,_) -> PRef elimFC [] n) scrutineeIdxs) (PRef elimFC [] scrutineeName)) let eliminatorTyDecl = PTy (fmap (const (Left $ Msg "")) . parseDocstring . T.pack $ show n) [] defaultSyntax elimFC [TotalFn] elimDeclName NoFC eliminatorTy let clauseConsElimArgs = map getPiName consTerms let clauseGeneralArgs' = map getPiName generalParams ++ [motiveName] ++ clauseConsElimArgs- let clauseGeneralArgs = map (\arg -> pexp (PRef elimFC arg)) clauseGeneralArgs'+ let clauseGeneralArgs = map (\arg -> pexp (PRef elimFC [] arg)) clauseGeneralArgs' let elimSig = "-- case function signature: " ++ showTmImpls eliminatorTy elimLog elimSig eliminatorClauses <- mapM (\(cns, cnsElim) -> generateEliminatorClauses cns cnsElim clauseGeneralArgs generalParams) (zip cons clauseConsElimArgs)@@ -381,7 +381,7 @@ mkPiName _ (oldName, pl, piarg) = do name <- freshName $ keyOf piarg return (oldName, (name, pl, piarg)) where keyOf :: PTerm -> String- keyOf (PRef _ name) | isLetter (nameStart name) = (toLower $ nameStart name):"__"+ keyOf (PRef _ _ name) | isLetter (nameStart name) = (toLower $ nameStart name):"__" keyOf (PApp _ tyf _) = keyOf tyf keyOf (PType _) = "ty__" keyOf _ = "carg__"@@ -446,10 +446,10 @@ case findIndex (== n) oldParams of Nothing -> (PPi pl n fc (removeParamPis oldParams params tyb) (removeParamPis oldParams params tyr)) Just i -> (removeParamPis oldParams params tyr)- removeParamPis oldParams params (PRef _ n) =+ removeParamPis oldParams params (PRef _ _ n) = case findIndex (== n) oldParams of- Nothing -> (PRef elimFC n)- Just i -> let (newname,_,_) = params !! i in (PRef elimFC (newname))+ Nothing -> (PRef elimFC [] n)+ Just i -> let (newname,_,_) = params !! i in (PRef elimFC [] (newname)) removeParamPis oldParams params (PApp _ cns args) = PApp elimFC (removeParamPis oldParams params cns) $ replaceParamArgs args where replaceParamArgs :: [PArg] -> [PArg]@@ -460,7 +460,7 @@ [n] -> case findIndex (== n) oldParams of Nothing -> arg:replaceParamArgs args- Just i -> let (newname,_,_) = params !! i in arg {getTm = PRef elimFC newname}:replaceParamArgs args+ Just i -> let (newname,_,_) = params !! i in arg {getTm = PRef elimFC [] newname}:replaceParamArgs args removeParamPis oldParams params t = t paramNamesOf :: Int -> [Int] -> [PArg] -> [Name]@@ -468,8 +468,8 @@ paramNamesOf i paramPos (arg:args) = (if i `elem` paramPos then extractName (getTm arg) else []) ++ paramNamesOf (i+1) paramPos args extractName :: PTerm -> [Name]- extractName (PRef _ n) = [n]- extractName _ = []+ extractName (PRef _ _ n) = [n]+ extractName _ = [] splitArgPms :: PTerm -> ([PTerm], [PTerm]) splitArgPms (PApp _ f args) = splitArgPms' args@@ -505,23 +505,23 @@ let (_, consIdxs) = splitArgPms resTy return $ piConstr (implidxs ++ consArgs ++ recMotives) (applyMotive consIdxs (applyCons cnm consArgs)) where applyRecMotive :: (Name, Plicity, PTerm) -> (Name, Plicity, PTerm)- applyRecMotive (n,_,ty) = (sUN $ "ih" ++ simpleName n, expl, applyMotive idxs (PRef elimFC n))+ applyRecMotive (n,_,ty) = (sUN $ "ih" ++ simpleName n, expl, applyMotive idxs (PRef elimFC [] n)) where (_, idxs) = splitArgPms ty findRecArgs :: [(Name, Plicity, PTerm)] -> [(Name, Plicity, PTerm)] findRecArgs [] = []- findRecArgs (ty@(_,_,PRef _ tn):rs) | simpleName tn == simpleName n = ty:findRecArgs rs- findRecArgs (ty@(_,_,PApp _ (PRef _ tn) _):rs) | simpleName tn == simpleName n = ty:findRecArgs rs- findRecArgs (ty:rs) = findRecArgs rs+ findRecArgs (ty@(_,_,PRef _ _ tn):rs) | simpleName tn == simpleName n = ty:findRecArgs rs+ findRecArgs (ty@(_,_,PApp _ (PRef _ _ tn) _):rs) | simpleName tn == simpleName n = ty:findRecArgs rs+ findRecArgs (ty:rs) = findRecArgs rs applyCons :: Name -> [(Name, Plicity, PTerm)] -> PTerm- applyCons tn targs = PApp elimFC (PRef elimFC tn) (map convertArg targs)+ applyCons tn targs = PApp elimFC (PRef elimFC [] tn) (map convertArg targs) convertArg :: (Name, Plicity, PTerm) -> PArg- convertArg (n, _, _) = pexp (PRef elimFC n)+ convertArg (n, _, _) = pexp (PRef elimFC [] n) applyMotive :: [PTerm] -> PTerm -> PTerm- applyMotive idxs t = PApp elimFC (PRef elimFC motiveName) (map pexp idxs ++ [pexp t])+ applyMotive idxs t = PApp elimFC (PRef elimFC [] motiveName) (map pexp idxs ++ [pexp t]) getPiName :: (Name, Plicity, PTerm) -> Name getPiName (name,_,_) = name@@ -539,11 +539,11 @@ let (_, generalIdxs') = splitArgPms resTy let generalIdxs = map pexp generalIdxs' consArgs <- namePis False args- let lhsPattern = PApp elimFC (PRef elimFC elimDeclName) (generalArgs ++ generalIdxs ++ [pexp $ applyCons cnm consArgs])+ let lhsPattern = PApp elimFC (PRef elimFC [] elimDeclName) (generalArgs ++ generalIdxs ++ [pexp $ applyCons cnm consArgs]) let recArgs = findRecArgs consArgs let recElims = if ind then map applyRecElim recArgs else []- let rhsExpr = PApp elimFC (PRef elimFC cnsElim) (map convertArg implidxs ++ map convertArg consArgs ++ recElims)+ let rhsExpr = PApp elimFC (PRef elimFC [] cnsElim) (map convertArg implidxs ++ map convertArg consArgs ++ recElims) return $ PClause elimFC elimDeclName lhsPattern [] rhsExpr [] where applyRecElim :: (Name, Plicity, PTerm) -> PArg- applyRecElim (constr@(recCnm,_,recTy)) = pexp $ PApp elimFC (PRef elimFC elimDeclName) (generalArgs ++ map pexp idxs ++ [pexp $ PRef elimFC recCnm])+ applyRecElim (constr@(recCnm,_,recTy)) = pexp $ PApp elimFC (PRef elimFC [] elimDeclName) (generalArgs ++ map pexp idxs ++ [pexp $ PRef elimFC [] recCnm]) where (_, idxs) = splitArgPms recTy
src/Idris/Elab/Instance.hs view
@@ -68,10 +68,10 @@ [] -> ifail $ show fc ++ ":" ++ show n ++ " is not a type class" cs -> tclift $ tfail $ At fc (CantResolveAlts (map fst cs))- let constraint = PApp fc (PRef fc n) (map pexp ps)+ let constraint = PApp fc (PRef fc [] n) (map pexp ps) let iname = mkiname n (namespace info) ps expn let emptyclass = null (class_methods ci)- when (what /= EDefns || (null ds && not emptyclass)) $ do+ when (what /= EDefns) $ do nty <- elabType' True info syn doc argDocs fc [] iname NoFC t -- if the instance type matches any of the instances we have already, -- and it's not a named instance, then it's overlapping, so report an error@@ -89,7 +89,7 @@ -- where block wparams <- mapM (\p -> case p of PApp _ _ args -> getWParams (map getTm args)- a@(PRef fc f) -> getWParams [a]+ a@(PRef fc _ f) -> getWParams [a] _ -> return []) ps ist <- getIState let pnames = nub $ map pname (concat (nub wparams)) ++@@ -100,7 +100,7 @@ let all_meths = map (nsroot . fst) (class_methods ci) let mtys = map (\ (n, (op, t)) -> let t_in = substMatchesShadow ips pnames t- mnamemap = map (\n -> (n, PRef fc (decorate ns iname n)))+ mnamemap = map (\n -> (n, PRef fc [] (decorate ns iname n))) all_meths t' = substMatchesShadow mnamemap pnames t_in in (decorate ns iname n,@@ -111,7 +111,7 @@ let ds_defs = insertDefaults i iname (class_defaults ci) ns ds logLvl 3 ("After defaults: " ++ show ds_defs ++ "\n") let ds' = reorderDefs (map fst (class_methods ci)) $ ds_defs- iLOG ("Reordered: " ++ show ds' ++ "\n")+ logLvl 1 ("Reordered: " ++ show ds' ++ "\n") mapM_ (warnMissing ds' ns iname) (map fst (class_methods ci)) mapM_ (checkInClass (map fst (class_methods ci))) (concatMap defined ds') let wbTys = map mkTyDecl mtys@@ -123,15 +123,15 @@ -- Bring variables in instance head into scope let headVars = nub $ mapMaybe (\p -> case p of- PRef _ n ->+ PRef _ _ n -> case lookupTy n (tt_ctxt ist) of [] -> Just n _ -> Nothing _ -> Nothing) ps -- let lhs = PRef fc iname- let lhs = PApp fc (PRef fc iname)- (map (\n -> pimp n (PRef fc n) True) headVars)- let rhs = PApp fc (PRef fc (instanceCtorName ci))+ let lhs = PApp fc (PRef fc [] iname)+ (map (\n -> pimp n (PRef fc [] n) True) headVars)+ let rhs = PApp fc (PRef fc [] (instanceCtorName ci)) (map (pexp . mkMethApp) mtys) logLvl 5 $ "Instance LHS " ++ show lhs ++ " " ++ show headVars@@ -139,7 +139,7 @@ let idecls = [PClauses fc [Dictionary] iname [PClause fc iname lhs [] rhs wb]]- iLOG (show idecls)+ logLvl 1 (show idecls) push_estack iname True mapM_ (rec_elabDecl info EAll info) idecls pop_estack@@ -218,16 +218,16 @@ keepDets dets t = t mkMethApp (n, _, _, ty)- = lamBind 0 ty (papp fc (PRef fc n) (methArgs 0 ty))+ = lamBind 0 ty (papp fc (PRef fc [] n) (methArgs 0 ty)) lamBind i (PPi (Constraint _ _) _ _ _ sc) sc' = PLam fc (sMN i "meth") NoFC Placeholder (lamBind (i+1) sc sc') lamBind i (PPi _ n _ ty sc) sc' = PLam fc (sMN i "meth") NoFC Placeholder (lamBind (i+1) sc sc') lamBind i _ sc = sc methArgs i (PPi (Imp _ _ _ _) n _ ty sc)- = PImp 0 True [] n (PRef fc (sMN i "meth")) : methArgs (i+1) sc+ = PImp 0 True [] n (PRef fc [] (sMN i "meth")) : methArgs (i+1) sc methArgs i (PPi (Exp _ _ _) n _ ty sc)- = PExp 0 [] (sMN 0 "marg") (PRef fc (sMN i "meth")) : methArgs (i+1) sc+ = PExp 0 [] (sMN 0 "marg") (PRef fc [] (sMN i "meth")) : methArgs (i+1) sc methArgs i (PPi (Constraint _ _) n _ ty sc) = PConstraint 0 [] (sMN 0 "marg") (PResolveTC fc) : methArgs (i+1) sc methArgs i _ = []@@ -237,11 +237,11 @@ getWParams [] = return [] getWParams (p : ps)- | PRef _ n <- p+ | PRef _ _ n <- p = do ps' <- getWParams ps ctxt <- getContext case lookupP n ctxt of- [] -> return (pimp n (PRef fc n) True : ps')+ [] -> return (pimp n (PRef fc [] n) True : ps') _ -> return ps' getWParams (_ : ps) = getWParams ps @@ -250,7 +250,7 @@ mkTyDecl (n, op, t, _) = PTy emptyDocstring [] syn fc op n NoFC- (mkUniqueNames [] t)+ (mkUniqueNames [] [] t) conbind :: [(Name, PTerm)] -> PTerm -> PTerm conbind ((c,ty) : ns) x = PPi constraint c NoFC ty (conbind ns x)
src/Idris/Elab/Provider.hs view
@@ -52,8 +52,8 @@ import Util.Pretty(pretty, text) -- | Elaborate a type provider-elabProvider :: Docstring (Either Err PTerm) -> ElabInfo -> SyntaxInfo -> FC -> ProvideWhat -> Name -> Idris ()-elabProvider doc info syn fc what n+elabProvider :: Docstring (Either Err PTerm) -> ElabInfo -> SyntaxInfo -> FC -> FC -> ProvideWhat -> Name -> Idris ()+elabProvider doc info syn fc nfc what n = do i <- getIState -- Ensure that the experimental extension is enabled unless (TypeProviders `elem` idris_language_extensions i) $@@ -94,11 +94,11 @@ | ProvTerm ty _ <- what -> do -- Finally add a top-level definition of the provided term elabType info syn doc [] fc [] n NoFC ty- elabClauses info fc [] n [PClause fc n (PApp fc (PRef fc n) []) [] (delab i tm) []]+ elabClauses info fc [] n [PClause fc n (PApp fc (PRef fc [] n) []) [] (delab i tm) []] logLvl 3 $ "Elaborated provider " ++ show n ++ " as: " ++ show tm | ProvPostulate _ <- what -> do -- Add the postulate- elabPostulate info syn doc fc [] n (delab i tm)+ elabPostulate info syn doc fc nfc [] n (delab i tm) logLvl 3 $ "Elaborated provided postulate " ++ show n | otherwise -> ierror . Msg $ "Attempted to provide a postulate where a term was expected."
src/Idris/Elab/Record.hs view
@@ -34,6 +34,7 @@ -- | Elaborate a record declaration elabRecord :: ElabInfo+ -> ElabWhat -> (Docstring (Either Err PTerm)) -- ^ The documentation for the whole declaration -> SyntaxInfo -> FC -> DataOpts -> Name -- ^ The name of the type being defined@@ -45,7 +46,7 @@ -> (Docstring (Either Err PTerm)) -- ^ Constructor Doc -> SyntaxInfo -- ^ Constructor SyntaxInfo -> Idris ()-elabRecord info doc rsyn fc opts tyn nfc params paramDocs fields cname cdoc csyn+elabRecord info what doc rsyn fc opts tyn nfc params paramDocs fields cname cdoc csyn = do logLvl 1 $ "Building data declaration for " ++ show tyn -- Type constructor let tycon = generateTyConType params@@ -57,18 +58,21 @@ logLvl 1 $ "Data constructor: " ++ showTmImpls dconTy -- Build data declaration for elaboration- iLOG $ foldr (++) "" $ intersperse "\n" (map show dconsArgDocs)- let datadecl = PDatadecl tyn NoFC tycon [(cdoc, dconsArgDocs, dconName, NoFC, dconTy, fc, [])]+ logLvl 1 $ foldr (++) "" $ intersperse "\n" (map show dconsArgDocs)+ let datadecl = case what of+ ETypes -> PLaterdecl tyn NoFC tycon+ _ -> PDatadecl tyn NoFC tycon [(cdoc, dconsArgDocs, dconName, NoFC, dconTy, fc, [])] elabData info rsyn doc paramDocs fc opts datadecl - iLOG $ "fieldsWithName " ++ show fieldsWithName- iLOG $ "fieldsWIthNameAndDoc " ++ show fieldsWithNameAndDoc- elabRecordFunctions info rsyn fc tyn paramsAndDoc fieldsWithNameAndDoc dconName target+ when (what /= ETypes) $ do+ logLvl 1 $ "fieldsWithName " ++ show fieldsWithName+ logLvl 1 $ "fieldsWIthNameAndDoc " ++ show fieldsWithNameAndDoc+ elabRecordFunctions info rsyn fc tyn paramsAndDoc fieldsWithNameAndDoc dconName target - sendHighlighting $- [(nfc, AnnName tyn Nothing Nothing Nothing)] ++- maybe [] (\(_, cnfc) -> [(cnfc, AnnName dconName Nothing Nothing Nothing)]) cname ++- [(ffc, AnnBoundName fn False) | (fn, ffc, _, _, _) <- fieldsWithName]+ sendHighlighting $+ [(nfc, AnnName tyn Nothing Nothing Nothing)] +++ maybe [] (\(_, cnfc) -> [(cnfc, AnnName dconName Nothing Nothing Nothing)]) cname +++ [(ffc, AnnBoundName fn False) | (fn, ffc, _, _, _) <- fieldsWithName] where -- | Generates a type constructor.@@ -95,7 +99,7 @@ -- | The target for the constructor and projection functions. Also the source of the update functions. target :: PTerm- target = PApp fc (PRef fc tyn) $ map (uncurry asPRefArg) [(p, n) | (n, _, p, _) <- params]+ target = PApp fc (PRef fc [] tyn) $ map (uncurry asPRefArg) [(p, n) | (n, _, p, _) <- params] paramsAndDoc :: [(Name, FC, Plicity, PTerm, Docstring (Either Err PTerm))] paramsAndDoc = pad params paramDocs@@ -154,8 +158,8 @@ elabRecordFunctions info rsyn fc tyn params fields dconName target = do logLvl 1 $ "Elaborating helper functions for record " ++ show tyn - iLOG $ "Fields: " ++ show fieldNames- iLOG $ "Params: " ++ show paramNames+ logLvl 1 $ "Fields: " ++ show fieldNames+ logLvl 1 $ "Params: " ++ show paramNames -- The elaborated constructor type for the data declaration i <- getIState ttConsTy <-@@ -165,8 +169,8 @@ -- The arguments to the constructor let constructorArgs = getArgTys ttConsTy- iLOG $ "Cons args: " ++ show constructorArgs- iLOG $ "Free fields: " ++ show (filter (not . isFieldOrParam') constructorArgs)+ logLvl 1 $ "Cons args: " ++ show constructorArgs+ logLvl 1 $ "Free fields: " ++ show (filter (not . isFieldOrParam') constructorArgs) -- If elaborating the constructor has resulted in some new implicit fields we make projection functions for them. let freeFieldsForElab = map (freeField i) (filter (not . isFieldOrParam') constructorArgs) @@ -327,10 +331,10 @@ -- | The left hand side of the projection function. generateLhs :: PTerm generateLhs = let args = lhsArgs index phArgs- in PApp fc (PRef fc pname) [pexp (PApp fc (PRef fc cn) args)]+ in PApp fc (PRef fc [] pname) [pexp (PApp fc (PRef fc [] cn) args)] where lhsArgs :: Int -> [PArg] -> [PArg]- lhsArgs 0 (_ : rest) = (asArg plicity (nsroot cname) (PRef fc pname_in)) : rest+ lhsArgs 0 (_ : rest) = (asArg plicity (nsroot cname) (PRef fc [] pname_in)) : rest lhsArgs i (x : rest) = x : (lhsArgs (i-1) rest) lhsArgs _ [] = [] @@ -343,7 +347,7 @@ -- | The right hand side of the projection function. generateRhs :: PTerm- generateRhs = PRef fc pname_in+ generateRhs = PRef fc [] pname_in -- | Creates and elaborates an update function. -- If 'optional' is true, we will not fail if we can't elaborate the update function.@@ -387,7 +391,7 @@ generateTy = PTy pdoc [] psyn fc [] set_pname NoFC $ PPi expl (nsroot pname) NoFC pty $ PPi expl recName NoFC sty (substInput sty)- where substInput = substMatches [(cname, PRef fc (nsroot pname))]+ where substInput = substMatches [(cname, PRef fc [] (nsroot pname))] -- | The "_set" name. set_pname :: Name@@ -401,10 +405,10 @@ -- | The left-hand side of the update function. generateLhs :: PTerm- generateLhs = PApp fc (PRef fc set_pname) [pexp $ PRef fc pname_in, pexp constructorPattern]+ generateLhs = PApp fc (PRef fc [] set_pname) [pexp $ PRef fc [] pname_in, pexp constructorPattern] where constructorPattern :: PTerm- constructorPattern = PApp fc (PRef fc cn) args+ constructorPattern = PApp fc (PRef fc [] cn) args -- | The "_in" name. pname_in :: Name@@ -415,10 +419,10 @@ -- | The right-hand side of the update function. generateRhs :: PTerm- generateRhs = PApp fc (PRef fc cn) (newArgs i args)+ generateRhs = PApp fc (PRef fc [] cn) (newArgs i args) where newArgs :: Int -> [PArg] -> [PArg]- newArgs 0 (_ : rest) = (asArg plicity (nsroot cname) (PRef fc pname_in)) : rest+ newArgs 0 (_ : rest) = (asArg plicity (nsroot cname) (PRef fc [] pname_in)) : rest newArgs i (x : rest) = x : (newArgs (i-1) rest) newArgs _ [] = [] @@ -440,17 +444,17 @@ recName :: Name recName = sMN 0 "rec" -recRef = PRef emptyFC recName+recRef = PRef emptyFC [] recName projectInType :: [(Name, Name)] -> PTerm -> PTerm projectInType xs = mapPT st where st :: PTerm -> PTerm- st (PRef fc n)- | Just pn <- lookup n xs = PApp fc (PRef fc pn) [pexp recRef]+ st (PRef fc hls n)+ | Just pn <- lookup n xs = PApp fc (PRef fc hls pn) [pexp recRef] st t = t -- | Creates an PArg from a plicity and a name where the term is a PRef. asPRefArg :: Plicity -> Name -> PArg-asPRefArg p n = asArg p (nsroot n) $ PRef emptyFC (nsroot n)+asPRefArg p n = asArg p (nsroot n) $ PRef emptyFC [] (nsroot n)
+ src/Idris/Elab/RunElab.hs view
@@ -0,0 +1,49 @@+module Idris.Elab.RunElab (elabRunElab) where++import Idris.Elab.Term+import Idris.Elab.Value (elabVal)++import Idris.AbsSyntax+import Idris.Error++import Idris.Core.Elaborate hiding (Tactic (..))+import Idris.Core.Evaluate+import Idris.Core.Execute+import Idris.Core.TT+import Idris.Core.Typecheck++import Idris.Output (iputStrLn, pshow, iWarn, sendHighlighting)++elabScriptTy :: Type+elabScriptTy = App Complete (P Ref (sNS (sUN "Elab") ["Elab", "Reflection", "Language"]) Erased)+ (P Ref unitTy Erased)++mustBeElabScript :: Type -> Idris ()+mustBeElabScript ty =+ do ctxt <- getContext+ case converts ctxt [] ty elabScriptTy of+ OK _ -> return ()+ Error e -> ierror e++elabRunElab :: ElabInfo -> FC -> PTerm -> [String] -> Idris ()+elabRunElab info fc script' ns =+ do -- First elaborate the script itself+ (script, scriptTy) <- elabVal info ERHS script'+ mustBeElabScript scriptTy+ ist <- getIState+ ctxt <- getContext+ (ElabResult tyT' defer is ctxt' newDecls highlights, log) <-+ tclift $ elaborate ctxt (idris_datatypes ist) (sMN 0 "toplLevelElab") elabScriptTy initEState+ (transformErr RunningElabScript+ (erun fc (do tm <- runElabAction ist fc [] script ns+ EState is _ impls highlights <- getAux+ ctxt <- get_context+ let ds = [] -- todo+ log <- getLog+ return (ElabResult tm ds (map snd is) ctxt impls highlights))))++++ setContext ctxt'+ processTacticDecls info newDecls+ sendHighlighting highlights
src/Idris/Elab/Term.hs view
@@ -16,7 +16,8 @@ import Idris.Core.Evaluate import Idris.Core.Unify import Idris.Core.ProofTerm (getProofTerm)-import Idris.Core.Typecheck (check, recheck, isType)+import Idris.Core.Typecheck (check, recheck, converts, isType)+import Idris.Core.WHNF (whnf) import Idris.Coverage (buildSCG, checkDeclTotality, genClauses, recoverableCoverage, validCoverageCase) import Idris.ErrReverse (errReverse) import Idris.ElabQuasiquote (extractUnquotes)@@ -35,13 +36,13 @@ import Debug.Trace -data ElabMode = ETyDecl | ELHS | ERHS+data ElabMode = ETyDecl | ETransLHS | ELHS | ERHS deriving Eq data ElabResult = ElabResult { resultTerm :: Term -- ^ The term resulting from elaboration- , resultMetavars :: [(Name, (Int, Maybe Name, Type))]+ , resultMetavars :: [(Name, (Int, Maybe Name, Type, [Name]))] -- ^ Information about new metavariables , resultCaseDecls :: [PDecl] -- ^ Deferred declarations as the meaning of case blocks@@ -70,8 +71,6 @@ [TIPartial] -> True _ -> False - when (not pattern) $ solveAutos ist fn True- hs <- get_holes ivs <- get_instances ptm <- get_term@@ -81,7 +80,7 @@ mapM_ (\n -> when (n `elem` hs) $ do focus n g <- goal- try (resolveTC True False 10 g fn ist)+ try (resolveTC' True False 10 g fn ist) (movelast n)) ivs ivs <- get_instances hs <- get_holes@@ -90,7 +89,10 @@ do focus n g <- goal ptm <- get_term- resolveTC True True 10 g fn ist) ivs+ resolveTC' True True 10 g fn ist) ivs+ + when (not pattern) $ solveAutos ist fn True+ tm <- get_term ctxt <- get_context probs <- get_probs@@ -220,7 +222,7 @@ sequence_ (get_delayed_elab est) end_unify ptm <- get_term- when pattern -- convert remaining holes to pattern vars+ when (pattern || intransform) -- convert remaining holes to pattern vars (do update_term orderPats unify_all matchProblems False -- only the ones we matched earlier@@ -228,7 +230,8 @@ mkPat) where pattern = emode == ELHS- bindfree = emode == ETyDecl || emode == ELHS+ intransform = emode == ETransLHS+ bindfree = emode == ETyDecl || emode == ELHS || emode == ETransLHS get_delayed_elab est = let ds = delayed_elab est in@@ -288,7 +291,7 @@ env <- get_env handleError (forceErr t' env) (elab' ina fc' t')- (elab' ina fc' (PApp fc (PRef fc (sUN "Force"))+ (elab' ina fc' (PApp fc (PRef fc [] (sUN "Force")) [pimp (sUN "t") Placeholder True, pimp (sUN "a") Placeholder True, pexp ct]))@@ -307,7 +310,7 @@ forceErr orig env (At _ t) = forceErr orig env t forceErr orig env t = False - notDelay t@(PApp _ (PRef _ (UN l)) _) | l == txt "Delay" = False+ notDelay t@(PApp _ (PRef _ _ (UN l)) _) | l == txt "Delay" = False notDelay _ = True local f = do e <- get_env@@ -349,24 +352,24 @@ do hnf_compute g <- goal case g of- TType _ -> elab' ina (Just fc) (PRef fc unitTy)- UType _ -> elab' ina (Just fc) (PRef fc unitTy)- _ -> elab' ina (Just fc) (PRef fc unitCon)+ TType _ -> elab' ina (Just fc) (PRef fc [] unitTy)+ UType _ -> elab' ina (Just fc) (PRef fc [] unitTy)+ _ -> elab' ina (Just fc) (PRef fc [] unitCon) elab' ina fc (PResolveTC (FC "HACK" _ _)) -- for chasing parent classes- = do g <- goal; resolveTC False False 5 g fn ist+ = do g <- goal; resolveTC' False False 5 g fn ist elab' ina fc (PResolveTC fc') = do c <- getNameFrom (sMN 0 "class") instanceArg c -- Elaborate the equality type first homogeneously, then -- heterogeneously as a fallback- elab' ina _ (PApp fc (PRef _ n) args)+ elab' ina _ (PApp fc (PRef _ _ n) args) | n == eqTy, [Placeholder, Placeholder, l, r] <- map getTm args = try (do tyn <- getNameFrom (sMN 0 "aqty") claim tyn RType movelast tyn- elab' ina (Just fc) (PApp fc (PRef fc eqTy)- [pimp (sUN "A") (PRef NoFC tyn) True,- pimp (sUN "B") (PRef NoFC tyn) False,+ elab' ina (Just fc) (PApp fc (PRef fc [] eqTy)+ [pimp (sUN "A") (PRef NoFC [] tyn) True,+ pimp (sUN "B") (PRef NoFC [] tyn) False, pexp l, pexp r])) (do atyn <- getNameFrom (sMN 0 "aqty") btyn <- getNameFrom (sMN 0 "bqty")@@ -374,27 +377,27 @@ movelast atyn claim btyn RType movelast btyn- elab' ina (Just fc) (PApp fc (PRef fc eqTy)- [pimp (sUN "A") (PRef NoFC atyn) True,- pimp (sUN "B") (PRef NoFC btyn) False,+ elab' ina (Just fc) (PApp fc (PRef fc [] eqTy)+ [pimp (sUN "A") (PRef NoFC [] atyn) True,+ pimp (sUN "B") (PRef NoFC [] btyn) False, pexp l, pexp r])) - elab' ina _ (PPair fc _ l r)+ elab' ina _ (PPair fc hls _ l r) = do hnf_compute g <- goal let (tc, _) = unApply g case g of- TType _ -> elab' ina (Just fc) (PApp fc (PRef fc pairTy)+ TType _ -> elab' ina (Just fc) (PApp fc (PRef fc hls pairTy) [pexp l,pexp r])- UType _ -> elab' ina (Just fc) (PApp fc (PRef fc upairTy)+ UType _ -> elab' ina (Just fc) (PApp fc (PRef fc hls upairTy) [pexp l,pexp r]) _ -> case tc of P _ n _ | n == upairTy - -> elab' ina (Just fc) (PApp fc (PRef fc upairCon)+ -> elab' ina (Just fc) (PApp fc (PRef fc hls upairCon) [pimp (sUN "A") Placeholder False, pimp (sUN "B") Placeholder False, pexp l, pexp r])- _ -> elab' ina (Just fc) (PApp fc (PRef fc pairCon)+ _ -> elab' ina (Just fc) (PApp fc (PRef fc hls pairCon) [pimp (sUN "A") Placeholder False, pimp (sUN "B") Placeholder False, pexp l, pexp r])@@ -408,7 +411,7 @@ -- pexp l, pexp r])) -- True - elab' ina _ (PDPair fc p l@(PRef _ n) t r)+ elab' ina _ (PDPair fc hls p l@(PRef nfc hl n) t r) = case t of Placeholder -> do hnf_compute@@ -417,32 +420,27 @@ TType _ -> asType _ -> asValue _ -> asType- where asType = elab' ina (Just fc) (PApp fc (PRef fc sigmaTy)+ where asType = elab' ina (Just fc) (PApp fc (PRef NoFC hls sigmaTy) [pexp t,-- -- TODO: save the FC from the dependent pair- -- syntax and put it on this lambda for interactive- -- semantic highlighting support. NoFC for now.- pexp (PLam fc n NoFC Placeholder r)])- asValue = elab' ina (Just fc) (PApp fc (PRef fc sigmaCon)+ pexp (PLam fc n nfc Placeholder r)])+ asValue = elab' ina (Just fc) (PApp fc (PRef fc hls sigmaCon) [pimp (sMN 0 "a") t False, pimp (sMN 0 "P") Placeholder True, pexp l, pexp r])- elab' ina _ (PDPair fc p l t r) = elab' ina (Just fc) (PApp fc (PRef fc sigmaCon)- [pimp (sMN 0 "a") t False,- pimp (sMN 0 "P") Placeholder True,- pexp l, pexp r])- elab' ina fc (PAlternative (ExactlyOne delayok) as)- = do hnf_compute- ty <- goal- ctxt <- get_context- let (tc, _) = unApply ty- env <- get_env- let as' = pruneByType (map fst env) tc ctxt as--- trace (-- show tc ++ " " ++ show as ++ "\n ==> " ++ --- show (length as') ++ "\n" ++--- showSep ", " (map showTmImpls as') ++ "\nEND") $++ elab' ina _ (PDPair fc hls p l t r) = elab' ina (Just fc) (PApp fc (PRef fc hls sigmaCon)+ [pimp (sMN 0 "a") t False,+ pimp (sMN 0 "P") Placeholder True,+ pexp l, pexp r])+ elab' ina fc (PAlternative ms (ExactlyOne delayok) as)+ = do as_pruned <- doPrune as+ -- Finish the mkUniqueNames job with the pruned set, rather than+ -- the full set.+ uns <- get_usedns+ let as' = map (mkUniqueNames (uns ++ map snd ms) ms) as_pruned (h : hs) <- get_holes+-- trace (show (map showHd as')) $ + ty <- goal case as' of [x] -> elab' ina fc x -- If there's options, try now, and if that fails, postpone@@ -452,22 +450,38 @@ (map showHd as'))) (do movelast h delayElab 5 $ do- focus h- tryAll (zip (map (elab' ina fc) as') - (map showHd as')))- where showHd (PApp _ (PRef _ n) _) = n- showHd (PRef _ n) = n+ hs <- get_holes+ when (not (null hs)) $ do+ focus h+ as'' <- doPrune as'+ case as'' of+ [x] -> elab' ina fc x+ _ -> tryAll (zip (map (elab' ina fc) as'') + (map showHd as'')))+ where showHd (PApp _ (PRef _ _ n) _) = n+ showHd (PRef _ _ n) = n showHd (PApp _ h _) = showHd h showHd x = NErased -- We probably should do something better than this here + doPrune as = + do hnf_compute+ ty <- goal+ let (tc, _) = unApply ty+ env <- get_env+ return $ pruneByType env tc ist as++ isAmbiguous (CantResolveAlts _) = delayok isAmbiguous (Elaborating _ _ e) = isAmbiguous e isAmbiguous (ElaboratingArg _ _ _ e) = isAmbiguous e isAmbiguous (At _ e) = isAmbiguous e isAmbiguous _ = False - elab' ina fc (PAlternative FirstSuccess as)- = trySeq as+ elab' ina fc (PAlternative ms FirstSuccess as_in)+ = do -- finish the mkUniqueNames job+ uns <- get_usedns+ let as = map (mkUniqueNames (uns ++ map snd ms) ms) as_in+ trySeq as where -- if none work, take the error from the first trySeq (x : xs) = let e1 = elab' ina fc x in try' e1 (trySeq' e1 xs) True@@ -476,6 +490,70 @@ trySeq' deferr (x : xs) = try' (do elab' ina fc x solveAutos ist fn False) (trySeq' deferr xs) True+ elab' ina fc (PAlternative ms TryImplicit (orig : alts)) = do+ env <- get_env+ ty <- goal+ let doelab = elab' ina fc orig+ tryCatch doelab+ (\err -> + if recoverableErr err+ then -- trace ("NEED IMPLICIT! " ++ show orig ++ "\n" +++ -- show alts ++ "\n" +++ -- showQuick err) $+ -- Prune the coercions so that only the ones+ -- with the right type to fix the error will be tried!+ case pruneAlts err alts env of+ [] -> lift $ tfail err+ alts' -> + try' (elab' ina fc (PAlternative [] (ExactlyOne False) alts'))+ (lift $ tfail err) -- take error from original if all fail+ True+ else lift $ tfail err)+ where+ recoverableErr (CantUnify _ _ _ _ _ _) = True+ recoverableErr (TooManyArguments _) = False+ recoverableErr (CantSolveGoal _ _) = False+ recoverableErr (CantResolveAlts _) = False+ recoverableErr (NoValidAlts _) = True+ recoverableErr (ProofSearchFail (Msg _)) = True+ recoverableErr (ProofSearchFail _) = False+ recoverableErr (ElaboratingArg _ _ _ e) = recoverableErr e+ recoverableErr (At _ e) = recoverableErr e+ recoverableErr (ElabScriptDebug _ _ _) = False+ recoverableErr _ = True++ pruneAlts (CantUnify _ (inc, _) (outc, _) _ _ _) alts env+ = case unApply (normalise (tt_ctxt ist) env inc) of+ (P (TCon _ _) n _, _) -> filter (hasArg n env) alts+ (Constant _, _) -> alts+ _ -> filter isLend alts -- special case hack for 'Borrowed'+ pruneAlts (ElaboratingArg _ _ _ e) alts env = pruneAlts e alts env+ pruneAlts (At _ e) alts env = pruneAlts e alts env+ pruneAlts (NoValidAlts _) alts env = alts+ pruneAlts _ alts _ = filter isLend alts++ hasArg n env ap | isLend ap = True -- special case hack for 'Borrowed'+ hasArg n env (PApp _ (PRef _ _ a) _) + = case lookupTyExact a (tt_ctxt ist) of+ Just ty -> let args = map snd (getArgTys (normalise (tt_ctxt ist) env ty)) in+ any (fnIs n) args+ Nothing -> False+ hasArg n _ _ = False++ isLend (PApp _ (PRef _ _ l) _) = l == sNS (sUN "lend") ["Ownership"]+ isLend _ = False++ fnIs n ty = case unApply ty of+ (P _ n' _, _) -> n == n'+ _ -> False++ showQuick (CantUnify _ (l, _) (r, _) _ _ _)+ = show (l, r)+ showQuick (ElaboratingArg _ _ _ e) = showQuick e+ showQuick (At _ e) = showQuick e+ showQuick (ProofSearchFail (Msg _)) = "search fail"+ showQuick _ = "No chance"+ elab' ina _ (PPatvar fc n) | bindfree = do patvar n update_term liftPats@@ -483,13 +561,13 @@ -- elab' (_, _, inty) (PRef fc f) -- | isTConName f (tt_ctxt ist) && pattern && not reflection && not inty -- = lift $ tfail (Msg "Typecase is not allowed")- elab' ec _ tm@(PRef fc n)+ elab' ec _ tm@(PRef fc hl n) | pattern && not reflection && not (e_qq ec) && not (e_intype ec) && isTConName n (tt_ctxt ist) = lift $ tfail $ Msg ("No explicit types on left hand side: " ++ show tm) | pattern && not reflection && not (e_qq ec) && e_nomatching ec = lift $ tfail $ Msg ("Attempting concrete match on polymorphic argument: " ++ show tm)- | (pattern || (bindfree && bindable n)) && not (inparamBlock n) && not (e_qq ec)+ | (pattern || intransform || (bindfree && bindable n)) && not (inparamBlock n) && not (e_qq ec) = do let ina = e_inarg ec guarded = e_guarded ec inty = e_intype ec@@ -500,7 +578,7 @@ _ -> True -- this is to stop us resolve type classes recursively -- trace (show (n, guarded)) $- if (tcname n && ina)+ if (tcname n && ina && not intransform) then erun fc $ do patvar n update_term liftPats@@ -523,8 +601,8 @@ bindable (NS _ _) = False bindable (UN xs) = True bindable n = implicitable n- elab' ina _ f@(PInferRef fc n) = elab' ina (Just fc) (PApp NoFC f [])- elab' ina fc' tm@(PRef fc n) + elab' ina _ f@(PInferRef fc hls n) = elab' ina (Just fc) (PApp NoFC f [])+ elab' ina fc' tm@(PRef fc hls n) | pattern && not reflection && not (e_qq ina) && not (e_intype ina) && isTConName n (tt_ctxt ist) = lift $ tfail $ Msg ("No explicit types on left hand side: " ++ show tm)@@ -538,9 +616,10 @@ if null a' then erun fc $ do apply (Var n) []- hl <- findHighlight n+ hilite <- findHighlight n solve- highlightSource fc hl+ mapM_ (uncurry highlightSource) $+ (fc, hilite) : map (\f -> (f, hilite)) hls else elab' ina fc' (PApp fc tm []) elab' ina _ (PLam _ _ _ _ PImpossible) = lift . tfail . Msg $ "Only pattern-matching lambdas can be impossible" elab' ina _ (PLam fc n nfc Placeholder sc)@@ -550,6 +629,7 @@ lift $ tfail (Msg $ "Can't use type constructor " ++ show n ++ " here") checkPiGoal n attack; intro (Just n);+ addPSname n -- okay for proof search -- trace ("------ intro " ++ show n ++ " ---- \n" ++ show ptm) elabE (ina { e_inarg = True } ) (Just fc) sc; solve highlightSource nfc (AnnBoundName n False)@@ -566,6 +646,7 @@ ptm <- get_term hs <- get_holes introTy (Var tyn) (Just n)+ addPSname n -- okay for proof search focus tyn elabE (ec { e_inarg = True, e_intype = True }) (Just fc) ty@@ -574,6 +655,7 @@ highlightSource nfc (AnnBoundName n False) elab' ina fc (PPi p n nfc Placeholder sc) = do attack; arg n (is_scoped p) (sMN 0 "ty")+ addPSname n -- okay for proof search elabE (ina { e_inarg = True, e_intype = True }) fc sc solve highlightSource nfc (AnnBoundName n False)@@ -584,13 +666,14 @@ MN _ _ -> unique_hole n _ -> return n forall n' (is_scoped p) (Var tyn)+ addPSname n' -- okay for proof search focus tyn let ec' = ina { e_inarg = True, e_intype = True } elabE ec' fc ty elabE ec' fc sc solve highlightSource nfc (AnnBoundName n False)- elab' ina _ (PLet fc n nfc ty val sc)+ elab' ina _ tm@(PLet fc n nfc ty val sc) = do attack ivs <- get_instances tyn <- getNameFrom (sMN 0 "letty")@@ -599,6 +682,7 @@ claim valn (Var tyn) explicit valn letbind n (Var tyn) (Var valn)+ addPSname n case ty of Placeholder -> return () _ -> do focus tyn@@ -611,12 +695,12 @@ ivs' <- get_instances env <- get_env elabE (ina { e_inarg = True }) (Just fc) sc- when (not pattern) $+ when (not (pattern || intransform)) $ mapM_ (\n -> do focus n g <- goal hs <- get_holes if all (\n -> n == tyn || not (n `elem` hs)) (freeNames g)- then try (resolveTC True False 10 g fn ist)+ then try (resolveTC' True False 10 g fn ist) (movelast n) else movelast n) (ivs' \\ ivs)@@ -643,7 +727,7 @@ solve -- elab' ina fc (PLet n Placeholder -- (PApp fc r [pexp (delab ist rty)]) sc)- elab' ina _ tm@(PApp fc (PInferRef _ f) args) = do+ elab' ina _ tm@(PApp fc (PInferRef _ _ f) args) = do rty <- goal ds <- get_deferred ctxt <- get_context@@ -674,7 +758,7 @@ fnTy [] ret = forget ret fnTy ((x, (_, xt)) : xs) ret = RBind x (Pi Nothing xt RType) (fnTy xs ret) - localVar env (PRef _ x)+ localVar env (PRef _ _ x) = case lookup x env of Just _ -> Just x _ -> Nothing@@ -698,7 +782,7 @@ solve -- if f is local, just do a simple_app -- FIXME: Anyone feel like refactoring this mess? - EB- elab' ina topfc tm@(PApp fc (PRef ffc f) args_in)+ elab' ina topfc tm@(PApp fc (PRef ffc hls f) args_in) | pattern && not reflection && not (e_qq ina) && e_nomatching ina = lift $ tfail $ Msg ("Attempting concrete match on polymorphic argument: " ++ show tm) | otherwise = implicitApp $@@ -720,11 +804,12 @@ if (f `elem` map fst env && length args == 1 && length args_in == 1) then -- simple app, as below do simple_app False- (elabE (ina { e_isfn = True }) (Just fc) (PRef ffc f))+ (elabE (ina { e_isfn = True }) (Just fc) (PRef ffc hls f)) (elabE (ina { e_inarg = True }) (Just fc) (getTm (head args))) (show tm) solve- highlightSource ffc annot+ mapM (uncurry highlightSource) $+ (ffc, annot) : map (\f -> (f, annot)) hls return [] else do ivs <- get_instances@@ -744,13 +829,14 @@ ns <- apply (Var f) (map isph args) -- trace ("ns is " ++ show ns) $ return () -- mark any type class arguments as injective- mapM_ checkIfInjective (map snd ns)+ when (not pattern) $ mapM_ checkIfInjective (map snd ns) unifyProblems -- try again with the new information, -- to help with disambiguation ulog <- getUnifyLog annot <- findHighlight f- highlightSource ffc annot+ mapM (uncurry highlightSource) $+ (ffc, annot) : map (\f -> (f, annot)) hls elabArgs ist (ina { e_inarg = e_inarg ina || not isinf }) [] fc False f@@ -786,7 +872,7 @@ env <- get_env hs <- get_holes if all (\n -> not (n `elem` hs)) (freeNames g)- then try (resolveTC False False 10 g fn ist)+ then try (resolveTC' False False 10 g fn ist) (movelast n) else movelast n) (ivs' \\ ivs)@@ -799,7 +885,7 @@ -- to be needed. implicitApp :: ElabD [ImplicitInfo] -> ElabD () implicitApp elab - | pattern = do elab; return ()+ | pattern || intransform = do elab; return () | otherwise = do s <- get imps <- elab@@ -822,7 +908,7 @@ case lookup n env of Nothing -> return () Just b ->- case unApply (binderTy b) of+ case unApply (normalise (tt_ctxt ist) env (binderTy b)) of (P _ c _, args) -> case lookupCtxtExact c (idris_classes ist) of Nothing -> return ()@@ -848,8 +934,8 @@ tacTm (PProof _) = True tacTm _ = False - setInjective (PRef _ n) = setinj n- setInjective (PApp _ (PRef _ n) _) = setinj n+ setInjective (PRef _ _ n) = setinj n+ setInjective (PApp _ (PRef _ _ n) _) = setinj n setInjective _ = return () elab' ina _ tm@(PApp fc f [arg]) =@@ -859,9 +945,9 @@ (elabE (ina { e_inarg = True }) (Just fc) (getTm arg)) (show tm) solve- where headRef (PRef _ _) = True+ where headRef (PRef _ _ _) = True headRef (PApp _ f _) = headRef f- headRef (PAlternative _ as) = all headRef as+ headRef (PAlternative _ _ as) = all headRef as headRef _ = False elab' ina fc (PAppImpl f es) = do appImpl (reverse es) -- not that we look... @@ -880,15 +966,12 @@ -- names which have been used elsewhere in the term, since we -- won't be able to use them in the resulting application. let unique_used = getUniqueUsed (tt_ctxt ist) ptm- let n' = mkN n+ let n' = metavarName (namespace info) n attack+ psns <- getPSnames defer unique_used n' solve highlightSource nfc (AnnName n' (Just MetavarOutput) Nothing Nothing)- where mkN n@(NS _ _) = n- mkN n = case namespace info of- Just xs@(_:_) -> sNS n xs- _ -> n elab' ina fc (PProof ts) = do compute; mapM_ (runTac True ist (elabFC info) fn) ts elab' ina fc (PTactics ts) | not pattern = do mapM_ (runTac False ist fc fn) ts@@ -925,7 +1008,7 @@ elab' ina (Just fc) t focus valn elab' ina (Just fc) sc- elab' ina (Just fc) (PRef fc letn)+ elab' ina (Just fc) (PRef fc [] letn) solve elab' ina _ c@(PCase fc scr opts) = do attack@@ -970,7 +1053,7 @@ -- if the scrutinee is one of the 'args' in env, we should -- inspect it directly, rather than adding it as a new argument let newdef = PClauses fc [] cname'- (caseBlock fc cname'+ (caseBlock fc cname' scr (map (isScr scr) (reverse args')) opts) -- elaborate case updateAux (\e -> e { case_decls = (cname', newdef) : case_decls e } )@@ -1109,15 +1192,18 @@ elab' ina fc (PUnquote t) = fail "Found unquote outside of quasiquote"- elab' ina fc (PQuoteName n) =+ elab' ina fc (PQuoteName n nfc) = do ctxt <- get_context env <- get_env case lookup n env of- Just _ -> do fill $ reflectName n ; solve+ Just _ -> do fill $ reflectName n+ solve+ highlightSource nfc (AnnBoundName n False) Nothing -> case lookupNameDef n ctxt of [(n', _)] -> do fill $ reflectName n' solve+ highlightSource nfc (AnnName n' Nothing Nothing Nothing) [] -> lift . tfail . NoSuchVariable $ n more -> lift . tfail . CantResolveAlts $ map fst more elab' ina fc (PAs _ n t) = lift . tfail . Msg $ "@-pattern not allowed here"@@ -1135,7 +1221,7 @@ delayElab 10 $ do focus h dotterm elab' ina fc t- elab' ina fc (PRunElab fc' tm) =+ elab' ina fc (PRunElab fc' tm ns) = do attack n <- getNameFrom (sMN 0 "tacticScript") n' <- getNameFrom (sMN 0 "tacticExpr")@@ -1148,8 +1234,44 @@ focus n elab' ina (Just fc') tm env <- get_env- runTactical ist (maybe fc' id fc) env (P Bound n' Erased)+ runElabAction ist (maybe fc' id fc) env (P Bound n' Erased) ns solve+ elab' ina fc (PConstSugar constFC tm) =+ -- Here we elaborate the contained term, then calculate+ -- highlighting for constFC. The highlighting is the+ -- highlighting for the outermost constructor of the result of+ -- evaluating the elaborated term, if one exists (it always+ -- should, but better to fail gracefully for something silly+ -- like highlighting info). This is how implicit applications of+ -- fromInteger get highlighted.+ do saveState -- so we don't pollute the elaborated term+ n <- getNameFrom (sMN 0 "cstI")+ n' <- getNameFrom (sMN 0 "cstIhole")+ g <- forget <$> goal+ claim n' g+ movelast n'+ -- In order to intercept the elaborated value, we need to+ -- let-bind it.+ attack+ letbind n g (Var n')+ focus n'+ elab' ina fc tm+ env <- get_env+ ctxt <- get_context+ let v = fmap (normaliseAll ctxt env . finalise . binderVal)+ (lookup n env)+ loadState -- we have the highlighting - re-elaborate the value+ elab' ina fc tm+ case v of+ Just val -> highlightConst constFC val+ Nothing -> return ()+ where highlightConst fc (P _ n _) =+ highlightSource fc (AnnName n Nothing Nothing Nothing)+ highlightConst fc (App _ f _) =+ highlightConst fc f+ highlightConst fc (Constant c) =+ highlightSource fc (AnnConst c)+ highlightConst _ _ = return () elab' ina fc x = fail $ "Unelaboratable syntactic form " ++ showTmImpls x -- delay elaboration of 't', with priority 'pri' until after everything@@ -1161,12 +1283,13 @@ = updateAux (\e -> e { delayed_elab = delayed_elab e ++ [(pri, t)] }) isScr :: PTerm -> (Name, Binder Term) -> (Name, (Bool, Binder Term))- isScr (PRef _ n) (n', b) = (n', (n == n', b))+ isScr (PRef _ _ n) (n', b) = (n', (n == n', b)) isScr _ (n', b) = (n', (False, b)) - caseBlock :: FC -> Name ->- [(Name, (Bool, Binder Term))] -> [(PTerm, PTerm)] -> [PClause]- caseBlock fc n env opts+ caseBlock :: FC -> Name+ -> PTerm -- original scrutinee+ -> [(Name, (Bool, Binder Term))] -> [(PTerm, PTerm)] -> [PClause]+ caseBlock fc n scr env opts = let args' = findScr env args = map mkarg (map getNmScr args') in map (mkClause args) opts@@ -1189,29 +1312,44 @@ getNmScr (n, (s, _)) = (n, s) - mkarg (n, s) = (PRef fc n, s)+ mkarg (n, s) = (PRef fc [] n, s) -- may be shadowed names in the new pattern - so replace the -- old ones with an _+ -- Also, names which don't appear on the rhs should not be+ -- fixed on the lhs, or this restricts the kind of matching+ -- we can do to non-dependent types. mkClause args (l, r) = let args' = map (shadowed (allNamesIn l)) args- lhs = PApp (getFC fc l) (PRef (getFC fc l) n)- (map (mkLHSarg l) args') in+ args'' = map (implicitable (allNamesIn r +++ keepscrName scr)) args'+ lhs = PApp (getFC fc l) (PRef NoFC [] n)+ (map (mkLHSarg l) args'') in PClause (getFC fc l) n lhs [] r [] + -- Keep scrutinee available if it's just a name (this makes+ -- the names in scope look better when looking at a hole on+ -- the rhs of a case)+ keepscrName (PRef _ _ n) = [n]+ keepscrName _ = []+ mkLHSarg l (tm, True) = pexp l mkLHSarg l (tm, False) = pexp tm - shadowed new (PRef _ n, s) | n `elem` new = (Placeholder, s)+ shadowed new (PRef _ _ n, s) | n `elem` new = (Placeholder, s) shadowed new t = t + implicitable rhs (PRef _ _ n, s) | n `notElem` rhs = (Placeholder, s)+ implicitable rhs t = t++ getFC d (PApp fc _ _) = fc- getFC d (PRef fc _) = fc- getFC d (PAlternative _ (x:_)) = getFC d x+ getFC d (PRef fc _ _) = fc+ getFC d (PAlternative _ _ (x:_)) = getFC d x getFC d x = d insertLazy :: PTerm -> ElabD PTerm- insertLazy t@(PApp _ (PRef _ (UN l)) _) | l == txt "Delay" = return t- insertLazy t@(PApp _ (PRef _ (UN l)) _) | l == txt "Force" = return t+ insertLazy t@(PApp _ (PRef _ _ (UN l)) _) | l == txt "Delay" = return t+ insertLazy t@(PApp _ (PRef _ _ (UN l)) _) | l == txt "Force" = return t insertLazy (PCoerced t) = return t insertLazy t = do ty <- goal@@ -1220,13 +1358,13 @@ let tries = if pattern then [t, mkDelay env t] else [mkDelay env t, t] case tyh of P _ (UN l) _ | l == txt "Lazy'"- -> return (PAlternative FirstSuccess tries)+ -> return (PAlternative [] FirstSuccess tries) _ -> return t where- mkDelay env (PAlternative b xs) = PAlternative b (map (mkDelay env) xs)+ mkDelay env (PAlternative ms b xs) = PAlternative ms b (map (mkDelay env) xs) mkDelay env t = let fc = fileFC "Delay" in- addImplBound ist (map fst env) (PApp fc (PRef fc (sUN "Delay"))+ addImplBound ist (map fst env) (PApp fc (PRef fc [] (sUN "Delay")) [pexp t]) @@ -1235,10 +1373,10 @@ -- blowup especially where there are errors deep in large expressions. notImplicitable (PApp _ f _) = notImplicitable f -- TMP HACK no coercing on bind (make this configurable)- notImplicitable (PRef _ n)+ notImplicitable (PRef _ _ n) | [opts] <- lookupCtxt n (idris_flags ist) = NoImplicit `elem` opts- notImplicitable (PAlternative (ExactlyOne _) as) = any notImplicitable as+ notImplicitable (PAlternative _ (ExactlyOne _) as) = any notImplicitable as -- case is tricky enough without implicit coercions! If they are needed, -- they can go in the branches separately. notImplicitable (PCase _ _ _) = True@@ -1281,14 +1419,13 @@ let t' = case (t, cs) of (PCoerced tm, _) -> tm (_, []) -> t- (_, cs) -> PAlternative FirstSuccess [t ,- PAlternative (ExactlyOne False) - (map (mkCoerce env t) cs)]+ (_, cs) -> PAlternative [] TryImplicit + (t : map (mkCoerce env t) cs) return t' where mkCoerce env t n = let fc = maybe (fileFC "Coercion") id (highestFC t) in addImplBound ist (map fst env)- (PApp fc (PRef fc n) [pexp (PCoerced t)])+ (PApp fc (PRef fc [] n) [pexp (PCoerced t)]) -- | Elaborate the arguments to a function elabArgs :: IState -- ^ The current Idris state@@ -1351,28 +1488,28 @@ pruneAlt :: [PTerm] -> [PTerm] pruneAlt xs = map prune xs where- prune (PApp fc1 (PRef fc2 f) as)- = PApp fc1 (PRef fc2 f) (fmap (fmap (choose f)) as)+ prune (PApp fc1 (PRef fc2 hls f) as)+ = PApp fc1 (PRef fc2 hls f) (fmap (fmap (choose f)) as) prune t = t - choose f (PAlternative a as)+ choose f (PAlternative ms a as) = let as' = fmap (choose f) as fs = filter (headIs f) as' in case fs of [a] -> a- _ -> PAlternative a as'+ _ -> PAlternative ms a as' choose f (PApp fc f' as) = PApp fc (choose f f') (fmap (fmap (choose f)) as) choose f t = t - headIs f (PApp _ (PRef _ f') _) = f == f'+ headIs f (PApp _ (PRef _ _ f') _) = f == f' headIs f (PApp _ f' _) = headIs f f' headIs f _ = True -- keep if it's not an application -- Rule out alternatives that don't return the same type as the head of the goal -- (If there are none left as a result, do nothing)-pruneByType :: [Name] -> Term -> -- head of the goal- Context -> [PTerm] -> [PTerm]+pruneByType :: Env -> Term -> -- head of the goal+ IState -> [PTerm] -> [PTerm] -- if an alternative has a locally bound name at the head, take it pruneByType env t c as | Just a <- locallyBound as = [a]@@ -1380,15 +1517,16 @@ locallyBound [] = Nothing locallyBound (t:ts) | Just n <- getName t,- n `elem` env = Just t+ n `elem` map fst env = Just t | otherwise = locallyBound ts- getName (PRef _ n) = Just n+ getName (PRef _ _ n) = Just n getName (PApp _ f _) = getName f getName (PHidden t) = getName t getName _ = Nothing -pruneByType env (P _ n _) ctxt as--- if the goal type is polymorphic, keep e+-- 'n' is the name at the head of the goal type+pruneByType env (P _ n _) ist as+-- if the goal type is polymorphic, keep everything | Nothing <- lookupTyExact n ctxt = as | otherwise = let asV = filter (headIs True n) as@@ -1399,8 +1537,10 @@ _ -> asV _ -> as' where- headIs var f (PRef _ f') = typeHead var f f'- headIs var f (PApp _ (PRef _ f') _) = typeHead var f f'+ ctxt = tt_ctxt ist ++ headIs var f (PRef _ _ f') = typeHead var f f'+ headIs var f (PApp _ (PRef _ _ f') _) = typeHead var f f' headIs var f (PApp _ f' _) = headIs var f f' headIs var f (PPi _ _ _ _ sc) = headIs var f sc headIs var f (PHidden t) = headIs var f t@@ -1414,12 +1554,45 @@ _ -> let ty' = normalise ctxt [] ty in case unApply (getRetTy ty') of (P _ ftyn _, _) -> ftyn == f- (V _, _) -> var -- keep, variable+ (V _, _) -> + -- keep, variable+-- trace ("Keeping " ++ show (f', ty')+-- ++ " for " ++ show n) $+ isPlausible ist var env n ty _ -> False _ -> False pruneByType _ t _ as = as +-- Could the name feasibly be the return type?+-- If there is a type class constraint on the return type, and no instance+-- in the environment or globally for that name, then no+-- Otherwise, yes+-- (FIXME: This isn't complete, but I'm leaving it here and coming back+-- to it later - just returns 'var' for now. EB)+isPlausible :: IState -> Bool -> Env -> Name -> Type -> Bool+isPlausible ist var env n ty + = let (hvar, classes) = collectConstraints [] [] ty in+ case hvar of+ Nothing -> True+ Just rth -> var -- trace (show (rth, classes)) var+ where+ collectConstraints :: [Name] -> [(Term, [Name])] -> Type -> + (Maybe Name, [(Term, [Name])])+ collectConstraints env tcs (Bind n (Pi _ ty _) sc)+ = let tcs' = case unApply ty of+ (P _ c _, _) -> + case lookupCtxtExact c (idris_classes ist) of+ Just tc -> ((ty, map fst (class_instances tc)) + : tcs) + Nothing -> tcs+ _ -> tcs + in+ collectConstraints (n : env) tcs' sc+ collectConstraints env tcs t+ | (V i, _) <- unApply t = (Just (env !! i), tcs)+ | otherwise = (Nothing, tcs)+ -- | Use the local elab context to work out the highlighting for a name findHighlight :: Name -> ElabD OutputAnnotation findHighlight n = do ctxt <- get_context@@ -1431,20 +1604,6 @@ Nothing -> lift . tfail . InternalMsg $ "Can't find name" ++ show n --- | Find the names of instances that have been designeated for--- searching (i.e. non-named instances or instances from Elab scripts)-findInstances :: IState -> Term -> [Name]-findInstances ist t- | (P _ n _, _) <- unApply (getRetTy t)- = case lookupCtxt n (idris_classes ist) of- [CI _ _ _ _ _ ins _] ->- [n | (n, True) <- ins, accessible n]- _ -> []- | otherwise = []- where accessible n = case lookupDefAccExact n False (tt_ctxt ist) of- Just (_, Hidden) -> False- _ -> True- -- Try again to solve auto implicits solveAuto :: IState -> Name -> Bool -> Name -> ElabD () solveAuto ist fn ambigok n@@ -1455,7 +1614,7 @@ g <- goal isg <- is_guess -- if it's a guess, we're working on it recursively, so stop when (not isg) $- proofSearch' ist True ambigok 100 True Nothing fn []+ proofSearch' ist True ambigok 100 True Nothing fn [] [] solveAutos :: IState -> Name -> Bool -> ElabD () solveAutos ist fn ambigok@@ -1464,181 +1623,21 @@ trivial' ist = trivial (elab ist toplevel ERHS [] (sMN 0 "tac")) ist-trivialHoles' h ist- = trivialHoles h (elab ist toplevel ERHS [] (sMN 0 "tac")) ist-proofSearch' ist rec ambigok depth prv top n hints+trivialHoles' psn h ist+ = trivialHoles psn h (elab ist toplevel ERHS [] (sMN 0 "tac")) ist+proofSearch' ist rec ambigok depth prv top n psns hints = do unifyProblems proofSearch rec prv ambigok (not prv) depth- (elab ist toplevel ERHS [] (sMN 0 "tac")) top n hints ist---- | Resolve type classes. This will only pick up 'normal' instances, never--- named instances (which is enforced by 'findInstances').-resolveTC :: Bool -- ^ using default Int- -> Bool -- ^ allow metavariables in the goal- -> Int -- ^ depth- -> Term -- ^ top level goal, for error messages- -> Name -- ^ top level function name, to prevent loops- -> IState -> ElabD ()-resolveTC def mvok depth top fn ist- = do hs <- get_holes- resTC' [] def hs depth top fn ist--resTC' tcs def topholes 0 topg fn ist = fail $ "Can't resolve type class"-resTC' tcs def topholes 1 topg fn ist = try' (trivial' ist) (resolveTC def False 0 topg fn ist) True-resTC' tcs defaultOn topholes depth topg fn ist- = do compute- g <- goal- -- Resolution can proceed only if there is something concrete in the- -- determining argument positions. Keep track of the holes in the- -- non-determining position, because it's okay for 'trivial' to solve- -- those holes and no others.- let (argsok, okholePos) = case tcArgsOK g topholes of- Nothing -> (False, [])- Just hs -> (True, hs)- if not argsok -- && not mvok)- then lift $ tfail $ CantResolve True topg- else do- ptm <- get_term- ulog <- getUnifyLog- hs <- get_holes- env <- get_env- t <- goal- let (tc, ttypes) = unApply (getRetTy t)- let okholes = case tc of- P _ n _ -> zip (repeat n) okholePos- _ -> []-- traceWhen ulog ("Resolving class " ++ show g ++ "\nin" ++ show env ++ "\n" ++ show okholes) $- try' (trivialHoles' okholes ist)- (do addDefault t tc ttypes- let stk = map fst (filter snd $ elab_stack ist)- let insts = findInstances ist t- blunderbuss t depth stk (stk ++ insts)) True- where- -- returns Just hs if okay, where hs are holes which are okay in the- -- goal, or Nothing if not okay to proceed- tcArgsOK ty hs | (P _ nc _, as) <- unApply (getRetTy ty), nc == numclass && defaultOn- = Just []- tcArgsOK ty hs -- if any determining arguments are metavariables, postpone- = let (f, as) = unApply (getRetTy ty) in- case f of- P _ cn _ -> case lookupCtxtExact cn (idris_classes ist) of- Just ci -> tcDetArgsOK 0 (class_determiners ci) hs as- Nothing -> if any (isMeta hs) as- then Nothing- else Just []- _ -> if any (isMeta hs) as- then Nothing- else Just []-- -- return the list of argument positions which can safely be a hole- -- or Nothing if one of the determining arguments is a hole- tcDetArgsOK i ds hs (x : xs)- | i `elem` ds = if isMeta hs x- then Nothing- else tcDetArgsOK (i + 1) ds hs xs- | otherwise = do rs <- tcDetArgsOK (i + 1) ds hs xs- case x of- P _ n _ -> Just (i : rs)- _ -> Just rs- tcDetArgsOK _ _ _ [] = Just []-- isMeta :: [Name] -> Term -> Bool- isMeta ns (P _ n _) = n `elem` ns - isMeta _ _ = False-- notHole hs (P _ n _, c)- | (P _ cn _, _) <- unApply (getRetTy c),- n `elem` hs && isConName cn (tt_ctxt ist) = False- | Constant _ <- c = not (n `elem` hs)- notHole _ _ = True-- -- HACK! Rather than giving a special name, better to have some kind- -- of flag in ClassInfo structure- chaser (UN nm)- | ('@':'@':_) <- str nm = True -- old way- chaser (SN (ParentN _ _)) = True- chaser (NS n _) = chaser n- chaser _ = False-- numclass = sNS (sUN "Num") ["Classes","Prelude"]-- addDefault t num@(P _ nc _) [P Bound a _] | nc == numclass && defaultOn- = do focus a- fill (RConstant (AType (ATInt ITBig))) -- default Integer- solve- addDefault t f as- | all boundVar as = return () -- True -- fail $ "Can't resolve " ++ show t- addDefault t f a = return () -- trace (show t) $ return ()-- boundVar (P Bound _ _) = True- boundVar _ = False-- blunderbuss t d stk [] = do -- c <- get_env- -- ps <- get_probs- lift $ tfail $ CantResolve False topg- blunderbuss t d stk (n:ns)- | n /= fn -- && (n `elem` stk)- = tryCatch (resolve n d)- (\e -> case e of- CantResolve True _ -> lift $ tfail e- _ -> blunderbuss t d stk ns)- | otherwise = blunderbuss t d stk ns-- introImps = do g <- goal- case g of- (Bind _ (Pi _ _ _) sc) -> do attack; intro Nothing- num <- introImps- return (num + 1)- _ -> return 0-- solven 0 = return ()- solven n = do solve; solven (n - 1)-- resolve n depth- | depth == 0 = fail $ "Can't resolve type class"- | otherwise- = do lams <- introImps- t <- goal- let (tc, ttypes) = trace (show t) $ unApply (getRetTy t)--- if (all boundVar ttypes) then resolveTC (depth - 1) fn insts ist--- else do- -- if there's a hole in the goal, don't even try- let imps = case lookupCtxtName n (idris_implicits ist) of- [] -> []- [args] -> map isImp (snd args) -- won't be overloaded!- xs -> error "The impossible happened - overloading is not expected here!"- ps <- get_probs- tm <- get_term- args <- map snd <$> try' (apply (Var n) imps)- (match_apply (Var n) imps) True- solven lams -- close any implicit lambdas we introduced- ps' <- get_probs- when (length ps < length ps' || unrecoverable ps') $- fail "Can't apply type class"--- traceWhen (all boundVar ttypes) ("Progress: " ++ show t ++ " with " ++ show n) $- mapM_ (\ (_,n) -> do focus n- t' <- goal- let (tc', ttype) = unApply (getRetTy t')- let got = fst (unApply (getRetTy t))- let depth' = if tc' `elem` tcs- then depth - 1 else depth- resTC' (got : tcs) defaultOn topholes depth' topg fn ist)- (filter (\ (x, y) -> not x) (zip (map fst imps) args))- -- if there's any arguments left, we've failed to resolve- hs <- get_holes- ulog <- getUnifyLog- solve- traceWhen ulog ("Got " ++ show n) $ return ()- where isImp (PImp p _ _ _ _) = (True, p)- isImp arg = (False, priority arg)+ (elab ist toplevel ERHS [] (sMN 0 "tac")) top n psns hints ist+resolveTC' di mv depth tm n ist+ = resolveTC di mv depth tm n (elab ist toplevel ERHS [] (sMN 0 "tac")) ist collectDeferred :: Maybe Name -> [Name] -> Context ->- Term -> State [(Name, (Int, Maybe Name, Type))] Term-collectDeferred top casenames ctxt (Bind n (GHole i t) app) =+ Term -> State [(Name, (Int, Maybe Name, Type, [Name]))] Term+collectDeferred top casenames ctxt (Bind n (GHole i psns t) app) = do ds <- get t' <- collectDeferred top casenames ctxt t- when (not (n `elem` map fst ds)) $ put (ds ++ [(n, (i, top, tidyArg [] t'))])+ when (not (n `elem` map fst ds)) $ put (ds ++ [(n, (i, top, tidyArg [] t', psns))]) collectDeferred top casenames ctxt app where -- Evaluate the top level functions in arguments, if possible, and if it's@@ -1648,18 +1647,9 @@ tidyArg env (Bind n b@(Pi im t k) sc) = Bind n (Pi im (tidy ctxt env t) k) (tidyArg ((n, b) : env) sc)- tidyArg env t = t+ tidyArg env t = tidy ctxt env t - tidy ctxt env t | (f, args) <- unApply t,- P _ specn _ <- getFn f,- n `notElem` casenames- = fst $ specialise ctxt env [(specn, 99999)] t - tidy ctxt env t@(Bind n (Let _ _) sct)- | (f, args) <- unApply sct,- P _ specn _ <- getFn f,- n `notElem` casenames- = fst $ specialise ctxt env [(specn, 99999)] t - tidy ctxt env t = t+ tidy ctxt env t = normalise ctxt env t getFn (Bind n (Lam _) t) = getFn t getFn t | (f, a) <- unApply t = f@@ -1695,11 +1685,16 @@ else casetac (forget val) when autoSolve solveAll +-- | Compute the appropriate name for a top-level metavariable+metavarName :: Maybe [String] -> Name -> Name+metavarName _ n@(NS _ _) = n+metavarName (Just (ns@(_:_))) n = sNS n ns+metavarName _ n = n -runTactical :: IState -> FC -> Env -> Term -> ElabD ()-runTactical ist fc env tm = do tm' <- eval tm- runTacTm tm'- return ()+runElabAction :: IState -> FC -> Env -> Term -> [String] -> ElabD Term+runElabAction ist fc env tm ns = do tm' <- eval tm+ runTacTm tm'+ where eval tm = do ctxt <- get_context return $ normaliseAll ctxt env (finalise tm)@@ -1720,8 +1715,9 @@ let info = CaseInfo True True False -- TODO document and figure out clauses' <- forM clauses (\case RMkFunClause lhs rhs ->- do lhs' <- fmap fst . lift $ check ctxt [] lhs- rhs' <- fmap fst . lift $ check ctxt [] rhs+ do (lhs', lty) <- lift $ check ctxt [] lhs+ (rhs', rty) <- lift $ check ctxt [] rhs+ lift $ converts ctxt [] lty rty return $ Right (lhs', rhs') RMkImpossibleClause lhs -> do lhs' <- fmap fst . lift $ check ctxt [] lhs@@ -1730,21 +1726,27 @@ Left lhs -> let (ns, lhs') = patvars [] lhs' in (ns, lhs', Impossible)) clauses'- set_context $- addCasedef n (const [])- info False (STerm Erased)- True False -- TODO what are these?- (map snd $ getArgTys ty) [] -- TODO inaccessible types- clauses'- clauses''- clauses''- clauses''- clauses''- ty- ctxt+ ctxt'<- lift $+ addCasedef n (const [])+ info False (STerm Erased)+ True False -- TODO what are these?+ (map snd $ getArgTys ty) [] -- TODO inaccessible types+ clauses'+ clauses''+ clauses''+ clauses''+ clauses''+ ty+ ctxt+ set_context ctxt' updateAux $ \e -> e { new_tyDecls = RClausesInstrs n clauses'' : new_tyDecls e} return () + checkClosed :: Raw -> Elab' aux (Term, Type)+ checkClosed tm = do ctxt <- get_context+ (val, ty) <- lift $ check ctxt [] tm+ return $! (finalise val, finalise ty)+ -- | Do a step in the reflected elaborator monad. The input is the -- step, the output is the (reflected) term returned. runTacTm :: Term -> ElabD Term@@ -1753,14 +1755,18 @@ = do solve returnUnit | n == tacN "prim__Goal", [] <- args- = do (h:_) <- get_holes- t <- goal- fmap fst . get_type_val $- rawPair (Var (reflm "TTName"), Var (reflm "TT"))- (reflectName h, reflect t)+ = do hs <- get_holes+ case hs of+ (h : _) -> do t <- goal+ fmap fst . checkClosed $+ rawPair (Var (reflm "TTName"), Var (reflm "TT"))+ (reflectName h, reflect t)+ [] -> lift . tfail . Msg $+ "Elaboration is complete. There are no goals."+ | n == tacN "prim__Holes", [] <- args = do hs <- get_holes- fmap fst . get_type_val $+ fmap fst . checkClosed $ mkList (Var $ reflm "TTName") (map reflectName hs) | n == tacN "prim__Guess", [] <- args = do ok <- is_guess@@ -1770,7 +1776,7 @@ RApp (RApp (Var (sNS (sUN "Just") ["Maybe", "Prelude"])) (Var (reflm "TT"))) guess- else fmap fst . get_type_val $+ else fmap fst . checkClosed $ RApp (Var (sNS (sUN "Nothing") ["Maybe", "Prelude"])) (Var (reflm "TT")) | n == tacN "prim__LookupTy", [n] <- args@@ -1790,7 +1796,7 @@ let defs = [ reflectTriple (reflectName n, reflectNameType nt, reflect ty) | (n, def) <- lookupNameDef n' ctxt , let (nt, ty) = getNameTypeAndType def ]- fmap fst . get_type_val $+ fmap fst . checkClosed $ rawList (raw_apply (Var pairTy) [ Var (reflm "TTName") , raw_apply (Var pairTy) [ Var (reflm "NameType") , Var (reflm "TT")]])@@ -1799,15 +1805,18 @@ = do n' <- reifyTTName name datatypes <- get_datatypes ctxt <- get_context- fmap fst . get_type_val $+ fmap fst . checkClosed $ rawList (Var (tacN "Datatype"))- (map reflectDatatype (buildDatatypes ctxt datatypes n'))+ (map reflectDatatype (buildDatatypes ist n')) | n == tacN "prim__SourceLocation", [] <- args- = fmap fst . get_type_val $+ = fmap fst . checkClosed $ reflectFC fc+ | n == tacN "prim__Namespace", [] <- args+ = fmap fst . checkClosed $+ rawList (RConstant StrType) (map (RConstant . Str) ns) | n == tacN "prim__Env", [] <- args = do env <- get_env- fmap fst . get_type_val $ reflectEnv env+ fmap fst . checkClosed $ reflectEnv env | n == tacN "prim__Fail", [_a, errs] <- args = do errs' <- eval errs parts <- reifyReportParts errs'@@ -1827,10 +1836,20 @@ = do raw' <- reifyRaw =<< eval raw fill raw' returnUnit- | n == tacN "prim__Apply", [raw] <- args+ | n == tacN "prim__Apply" || n == tacN "prim__MatchApply"+ , [raw, argSpec] <- args = do raw' <- reifyRaw =<< eval raw- apply raw' []- returnUnit+ argSpec' <- reifyList (reifyPair reifyBool reifyInt) argSpec+ let op = if n == tacN "prim__Apply"+ then apply+ else match_apply+ ns <- op raw' argSpec'+ fmap fst . checkClosed $+ rawList (rawPairTy (Var $ reflm "TTName") (Var $ reflm "TTName"))+ [ rawPair (Var $ reflm "TTName", Var $ reflm "TTName")+ (reflectName n1, reflectName n2)+ | (n1, n2) <- ns+ ] | n == tacN "prim__Gensym", [hint] <- args = do hintStr <- eval hint case hintStr of@@ -1843,9 +1862,17 @@ ty' <- reifyRaw ty claim n' ty' returnUnit+ | n == tacN "prim__Check", [raw] <- args+ = do raw' <- reifyRaw =<< eval raw+ ctxt <- get_context+ env <- get_env+ (tm, ty) <- lift $ check ctxt env raw'+ fmap fst . checkClosed $+ rawPair (Var (reflm "TT"), Var (reflm "TT"))+ (reflect tm, reflect ty) | n == tacN "prim__Forget", [tt] <- args = do tt' <- reifyTT tt- fmap fst . get_type_val . reflectRaw $ forget tt'+ fmap fst . checkClosed . reflectRaw $ forget tt' | n == tacN "prim__Attack", [] <- args = do attack returnUnit@@ -1855,8 +1882,10 @@ returnUnit | n == tacN "prim__Focus", [what] <- args = do n' <- reifyTTName what- focus n'- returnUnit+ hs <- get_holes+ if elem n' hs+ then focus n' >> returnUnit+ else lift . tfail . Msg $ "The name " ++ show n' ++ " does not denote a hole" | n == tacN "prim__Unfocus", [what] <- args = do n' <- reifyTTName what movelast n'@@ -1874,14 +1903,30 @@ returnUnit | n == tacN "prim__PatVar", [n] <- args = do n' <- reifyTTName n- patvar n'+ patvar' n' returnUnit | n == tacN "prim__PatBind", [n] <- args = do n' <- reifyTTName n patbind n' returnUnit+ | n == tacN "prim__LetBind", [n, ty, tm] <- args+ = do n' <- reifyTTName n+ ty' <- reifyRaw ty+ tm' <- reifyRaw tm+ letbind n' ty' tm'+ returnUnit | n == tacN "prim__Compute", [] <- args = do compute ; returnUnit+ | n == tacN "prim__Normalise", [env, tm] <- args+ = do env' <- reifyEnv env+ tm' <- reifyTT tm+ ctxt <- get_context+ let out = normaliseAll ctxt env' (finalise tm')+ fmap fst . checkClosed $ reflect out+ | n == tacN "prim__Whnf", [tm] <- args+ = do tm' <- reifyTT tm+ ctxt <- get_context+ fmap fst . checkClosed . reflect $ whnf ctxt tm' | n == tacN "prim__DeclareType", [decl] <- args = do (RDeclare n args res) <- reifyTyDecl decl ctxt <- get_context@@ -1902,7 +1947,7 @@ let decl = TyDecl Ref checked ctxt' = addCtxtDef n decl ctxt set_context ctxt'- updateAux $ \e -> e { new_tyDecls = (RTyDeclInstrs n fc (map rArgToPArg args) checked) :+ updateAux $ \e -> e { new_tyDecls = (RTyDeclInstrs n fc (map rFunArgToPArg args) checked) : new_tyDecls e } aux <- getAux returnUnit@@ -1919,8 +1964,21 @@ | n == tacN "prim__ResolveTC", [fn] <- args = do g <- goal fn <- reifyTTName fn- resolveTC False True 100 g fn ist+ resolveTC' False True 100 g fn ist returnUnit+ | n == tacN "prim__Search", [depth, hints] <- args+ = do d <- eval depth+ hints' <- eval hints+ case (d, unList hints') of+ (Constant (I i), Just hs) ->+ do actualHints <- mapM reifyTTName hs+ unifyProblems+ let psElab = elab ist toplevel ERHS [] (sMN 0 "tac")+ proofSearch True True False False i psElab Nothing (sMN 0 "search ") [] actualHints ist+ returnUnit+ (Constant (I _), Nothing ) ->+ lift . tfail . InternalMsg $ "Not a list: " ++ show hints'+ (_, _) -> lift . tfail . InternalMsg $ "Can't reify int " ++ show d | n == tacN "prim__RecursiveElab", [goal, script] <- args = do goal' <- reifyRaw goal ctxt <- get_context@@ -1932,22 +1990,49 @@ datatypes <- get_datatypes env <- get_env (_, ES (p, aux') _ _) <-- lift $ runElab aux (runTactical ist fc [] script)- (newProof recH ctxt datatypes goalTT)+ do (ES (current_p, _) _ _) <- get+ lift $ runElab aux (runElabAction ist fc [] script ns)+ ((newProof recH ctxt datatypes goalTT)+ { nextname = nextname current_p}) let tm_out = getProofTerm (pterm p)- updateAux $ const aux'+ do (ES (prf, _) s e) <- get+ let p' = prf { nextname = nextname p }+ put (ES (p', aux') s e) env' <- get_env (tm, ty, _) <- lift $ recheck ctxt env (forget tm_out) tm_out let (tm', ty') = (reflect tm, reflect ty)- fmap fst . get_type_val $+ fmap fst . checkClosed $ rawPair (Var $ reflm "TT", Var $ reflm "TT") (tm', ty')+ | n == tacN "prim__Metavar", [n] <- args+ = do n' <- reifyTTName n+ ctxt <- get_context+ ptm <- get_term+ -- See documentation above in the elab case for PMetavar+ let unique_used = getUniqueUsed ctxt ptm+ let mvn = metavarName (Just ns) n'+ attack+ defer unique_used mvn+ solve+ returnUnit+ | n == tacN "prim__Fixity", [op'] <- args+ = do opTm <- eval op'+ case opTm of+ Constant (Str op) -> + let opChars = ":!#$%&*+./<=>?@\\^|-~"+ invalidOperators = [":", "=>", "->", "<-", "=", "?=", "|", "**", "==>", "\\", "%", "~", "?", "!"]+ fixities = idris_infixes ist+ in if not (all (flip elem opChars) op) || elem op invalidOperators+ then lift . tfail . Msg $ "'" ++ op ++ "' is not a valid operator name."+ else case nub [f | Fix f someOp <- fixities, someOp == op] of+ [] -> lift . tfail . Msg $ "No fixity found for operator '" ++ op ++ "'."+ [f] -> fmap fst . checkClosed $ reflectFixity f+ many -> lift . tfail . InternalMsg $ "Ambiguous fixity for '" ++ op ++ "'! Found " ++ show many+ _ -> lift . tfail . Msg $ "Not a constant string for an operator name: " ++ show opTm | n == tacN "prim__Debug", [ty, msg] <- args- = do let msg' = fromTTMaybe msg- case msg' of- Nothing -> debugElaborator Nothing- Just (Constant (Str m)) -> debugElaborator (Just m)- Just x -> lift . tfail . InternalMsg $ "Can't reify message for debugging: " ++ show x+ = do msg' <- eval msg+ parts <- reifyReportParts msg+ debugElaborator parts runTacTm x = lift . tfail $ ElabScriptStuck x -- Running tactics directly@@ -2079,8 +2164,8 @@ runT Compute = compute runT Trivial = do trivial' ist; when autoSolve solveAll runT TCInstance = runT (Exact (PResolveTC emptyFC))- runT (ProofSearch rec prover depth top hints)- = do proofSearch' ist rec False depth prover top fn hints+ runT (ProofSearch rec prover depth top psns hints)+ = do proofSearch' ist rec False depth prover top fn psns hints when autoSolve solveAll runT (Focus n) = focus n runT Unfocus = do hs <- get_holes@@ -2288,7 +2373,7 @@ updateIState $ \i -> i { idris_implicits = addDef n impls (idris_implicits i) } addIBC (IBCImp n)- ds <- checkDef fc (\_ e -> e) [(n, (-1, Nothing, ty))]+ ds <- checkDef fc (\_ e -> e) [(n, (-1, Nothing, ty, []))] addIBC (IBCDef n) ctxt <- getContext case lookupDef n ctxt of@@ -2297,7 +2382,7 @@ -- then it must be added as a metavariable. This needs guarding -- to prevent overwriting case defs with a metavar, if the case -- defs come after the type decl in the same script!- let ds' = map (\(n, (i, top, t)) -> (n, (i, top, t, True))) ds+ let ds' = map (\(n, (i, top, t, ns)) -> (n, (i, top, t, ns, True))) ds in addDeferred ds' _ -> return () RAddInstance className instName ->
src/Idris/Elab/Transform.hs view
@@ -49,13 +49,14 @@ import Util.Pretty(pretty, text) elabTransform :: ElabInfo -> FC -> Bool -> PTerm -> PTerm -> Idris (Term, Term)-elabTransform info fc safe lhs_in@(PApp _ (PRef _ tf) _) rhs_in+elabTransform info fc safe lhs_in@(PApp _ (PRef _ _ tf) _) rhs_in = do ctxt <- getContext i <- getIState let lhs = addImplPat i lhs_in+ logLvl 5 ("Transform LHS input: " ++ showTmImpls lhs) (ElabResult lhs' dlhs [] ctxt' newDecls highlights, _) <- tclift $ elaborate ctxt (idris_datatypes i) (sMN 0 "transLHS") infP initEState- (erun fc (buildTC i info ELHS [] (sUN "transform")+ (erun fc (buildTC i info ETransLHS [] (sUN "transform") (infTerm lhs))) setContext ctxt' processTacticDecls info newDecls@@ -67,8 +68,11 @@ (clhs_tm_in, clhs_ty) <- recheckC fc id [] lhs_tm let clhs_tm = renamepats pnames clhs_tm_in logLvl 3 ("Transform LHS " ++ show clhs_tm)-+ logLvl 3 ("Transform type " ++ show clhs_ty)+ let rhs = addImplBound i (map fst newargs) rhs_in+ logLvl 5 ("Transform RHS input: " ++ showTmImpls rhs)+ ((rhs', defer, ctxt', newDecls), _) <- tclift $ elaborate ctxt (idris_datatypes i) (sMN 0 "transRHS") clhs_ty initEState (do pbinds i lhs_tm
src/Idris/Elab/Type.hs view
@@ -148,7 +148,7 @@ rep <- useREPL when rep $ do addInternalApp (fc_fname fc) (fst . fc_start $ fc) ty' -- (mergeTy ty' (delab i nty')) -- TODO: Should use span instead of line and filename?- addIBC (IBCLineApp (fc_fname fc) (fst . fc_start $ fc) ty') -- (mergeTy ty' (delab i nty')))+ addIBC (IBCLineApp (fc_fname fc) (fst . fc_start $ fc) ty') -- (mergeTy ty' (delab i nty'))) let (fam, _) = unApply (getRetTy nty') let corec = case fam of@@ -159,9 +159,9 @@ -- Productivity checking now via checking for guarded 'Delay' let opts' = opts -- if corec then (Coinductive : opts) else opts let usety = if norm then nty' else nty- ds <- checkDef fc iderr [(n, (-1, Nothing, usety))]+ ds <- checkDef fc iderr [(n, (-1, Nothing, usety, []))] addIBC (IBCDef n)- let ds' = map (\(n, (i, top, fam)) -> (n, (i, top, fam, True))) ds+ let ds' = map (\(n, (i, top, fam, ns)) -> (n, (i, top, fam, ns, True))) ds addDeferred ds' setFlags n opts' checkDocs fc argDocs ty@@ -232,18 +232,19 @@ tyIsHandler _ = False elabPostulate :: ElabInfo -> SyntaxInfo -> Docstring (Either Err PTerm) ->- FC -> FnOpts -> Name -> PTerm -> Idris ()-elabPostulate info syn doc fc opts n ty = do+ FC -> FC -> FnOpts -> Name -> PTerm -> Idris ()+elabPostulate info syn doc fc nfc opts n ty = do elabType info syn doc [] fc opts n NoFC ty putIState . (\ist -> ist{ idris_postulates = S.insert n (idris_postulates ist) }) =<< getIState addIBC (IBCPostulate n)+ sendHighlighting [(nfc, AnnName n (Just PostulateOutput) Nothing Nothing)] -- remove it from the deferred definitions list solveDeferred n elabExtern :: ElabInfo -> SyntaxInfo -> Docstring (Either Err PTerm) ->- FC -> FnOpts -> Name -> PTerm -> Idris ()-elabExtern info syn doc fc opts n ty = do+ FC -> FC -> FnOpts -> Name -> PTerm -> Idris ()+elabExtern info syn doc fc nfc opts n ty = do cty <- elabType info syn doc [] fc opts n NoFC ty ist <- getIState let arity = length (getArgTys (normalise (tt_ctxt ist) [] cty))
src/Idris/Elab/Utils.hs view
@@ -40,21 +40,21 @@ iderr :: Name -> Err -> Err iderr _ e = e -checkDef :: FC -> (Name -> Err -> Err) -> [(Name, (Int, Maybe Name, Type))]- -> Idris [(Name, (Int, Maybe Name, Type))]+checkDef :: FC -> (Name -> Err -> Err) -> [(Name, (Int, Maybe Name, Type, [Name]))]+ -> Idris [(Name, (Int, Maybe Name, Type, [Name]))] checkDef fc mkerr ns = checkAddDef False True fc mkerr ns checkAddDef :: Bool -> Bool -> FC -> (Name -> Err -> Err)- -> [(Name, (Int, Maybe Name, Type))]- -> Idris [(Name, (Int, Maybe Name, Type))]+ -> [(Name, (Int, Maybe Name, Type, [Name]))]+ -> Idris [(Name, (Int, Maybe Name, Type, [Name]))] checkAddDef add toplvl fc mkerr [] = return []-checkAddDef add toplvl fc mkerr ((n, (i, top, t)) : ns) +checkAddDef add toplvl fc mkerr ((n, (i, top, t, psns)) : ns) = do ctxt <- getContext (t', _) <- recheckC fc (mkerr n) [] t- when add $ do addDeferred [(n, (i, top, t, toplvl))]+ when add $ do addDeferred [(n, (i, top, t, psns, toplvl))] addIBC (IBCDef n) ns' <- checkAddDef add toplvl fc mkerr ns- return ((n, (i, top, t')) : ns')+ return ((n, (i, top, t', psns)) : ns') -- | Get the list of (index, name) of inaccessible arguments from an elaborated -- type@@ -66,8 +66,6 @@ -- | Get the list of (index, name) of inaccessible arguments from the type. inaccessibleArgs :: Int -> PTerm -> [(Int, Name)]-inaccessibleArgs i (PPi (Imp _ _ _ _) n _ Placeholder t)- = (i,n) : inaccessibleArgs (i+1) t -- unbound implicit inaccessibleArgs i (PPi plicity n _ ty t) | InaccessibleArg `elem` pargopts plicity = (i,n) : inaccessibleArgs (i+1) t -- an .{erased : Implicit}@@ -131,7 +129,7 @@ dc (PWith fc n t as w pn ds) = PWith fc (decorate n) (dappname t) as w pn (map (decorateid decorate) ds)- dappname (PApp fc (PRef fc' n) as) = PApp fc (PRef fc' (decorate n)) as+ dappname (PApp fc (PRef fc' hl n) as) = PApp fc (PRef fc' hl (decorate n)) as dappname t = t @@ -139,7 +137,8 @@ pbinds :: IState -> Term -> ElabD () pbinds i (Bind n (PVar t) sc) = do attack; patbind n- case unApply t of+ env <- get_env+ case unApply (normalise (tt_ctxt i) env t) of (P _ c _, args) -> case lookupCtxt c (idris_classes i) of [] -> return () _ -> -- type class, set as injective@@ -166,19 +165,19 @@ getFixedInType i env (PExp _ _ _ _ : is) (Bind n (Pi _ t _) sc) = nub $ getFixedInType i env [] t ++ getFixedInType i (n : env) is (instantiate (P Bound n t) sc)- ++ case t of- P _ n _ -> if n `elem` env then [n] else []+ ++ case unApply t of+ (P _ n _, _) -> if n `elem` env then [n] else [] _ -> [] getFixedInType i env (_ : is) (Bind n (Pi _ t _) sc) = getFixedInType i (n : env) is (instantiate (P Bound n t) sc) getFixedInType i env is tm@(App _ f a) | (P _ tn _, args) <- unApply tm- = case lookupCtxt tn (idris_datatypes i) of- [t] -> nub $ paramNames args env (param_pos t) ++- getFixedInType i env is f ++- getFixedInType i env is a- [] -> nub $ getFixedInType i env is f ++- getFixedInType i env is a+ = case lookupCtxtExact tn (idris_datatypes i) of+ Just t -> nub $ paramNames args env (param_pos t) +++ getFixedInType i env is f +++ getFixedInType i env is a+ Nothing -> nub $ getFixedInType i env is f +++ getFixedInType i env is a | otherwise = nub $ getFixedInType i env is f ++ getFixedInType i env is a getFixedInType i _ _ _ = []@@ -189,17 +188,16 @@ getFlexInType i env ps tm@(App _ f a) | (P nt tn _, args) <- unApply tm, nt /= Bound- = case lookupCtxt tn (idris_datatypes i) of- [t] -> nub $ paramNames args env [x | x <- [0..length args],- not (x `elem` param_pos t)] + = case lookupCtxtExact tn (idris_datatypes i) of+ Just t -> nub $ paramNames args env [x | x <- [0..length args],+ not (x `elem` param_pos t)] ++ getFlexInType i env ps f ++ getFlexInType i env ps a- [] -> let ppos = case lookupCtxtName tn (idris_fninfo i) of- [fi] -> fn_params (snd fi)- [] -> []- xs -> error ("Too much function info: " ++ show xs)- in nub $ paramNames args env [x | x <- [0..length args],- not (x `elem` ppos)] + Nothing -> let ppos = case lookupCtxtExact tn (idris_fninfo i) of+ Just fi -> fn_params fi+ Nothing -> []+ in nub $ paramNames args env [x | x <- [0..length args],+ not (x `elem` ppos)] ++ getFlexInType i env ps f ++ getFlexInType i env ps a | otherwise = nub $ getFlexInType i env ps f ++
src/Idris/Elab/Value.hs view
@@ -1,6 +1,7 @@ {-# LANGUAGE PatternGuards #-} {-# OPTIONS_GHC -fwarn-incomplete-patterns #-}-module Idris.Elab.Value(elabVal, elabValBind, elabDocTerms, elabExec) where+module Idris.Elab.Value(elabVal, elabValBind, elabDocTerms, + elabExec, elabREPL) where import Idris.AbsSyntax import Idris.ASTUtils@@ -50,7 +51,7 @@ import Util.Pretty(pretty, text) --- Elaborate a value, returning any new bindings created (this will only+-- | Elaborate a value, returning any new bindings created (this will only -- happen if elaborating as a pattern clause) elabValBind :: ElabInfo -> ElabMode -> Bool -> PTerm -> Idris (Term, Type, [(Name, Type)]) elabValBind info aspat norm tm_in@@ -75,7 +76,7 @@ let vtm = orderPats (getInferTerm tm') def' <- checkDef (fileFC "(input)") iderr defer- let def'' = map (\(n, (i, top, t)) -> (n, (i, top, t, True))) def'+ let def'' = map (\(n, (i, top, t, ns)) -> (n, (i, top, t, ns, True))) def' addDeferred def'' mapM_ (elabCaseBlock info []) is @@ -116,17 +117,24 @@ else Checked tm | otherwise = Unchecked --- Try running the term directly (as IO ()), then printing it as an Integer+-- | Try running the term directly (as IO ()), then printing it as an Integer -- (as a default numeric tye), then printing it as any Showable thing elabExec :: FC -> PTerm -> PTerm-elabExec fc tm = runtm (PAlternative FirstSuccess- [printtm (PApp fc (PRef fc (sUN "the"))+elabExec fc tm = runtm (PAlternative [] FirstSuccess+ [printtm (PApp fc (PRef fc [] (sUN "the")) [pexp (PConstant NoFC (AType (ATInt ITBig))), pexp tm]), tm, printtm tm ]) where- runtm t = PApp fc (PRef fc (sUN "run__IO")) [pexp t]- printtm t = PApp fc (PRef fc (sUN "printLn"))- [pimp (sUN "ffi") (PRef fc (sUN "FFI_C")) False, pexp t]+ runtm t = PApp fc (PRef fc [] (sUN "run__IO")) [pexp t]+ printtm t = PApp fc (PRef fc [] (sUN "printLn"))+ [pimp (sUN "ffi") (PRef fc [] (sUN "FFI_C")) False, pexp t] +elabREPL :: ElabInfo -> ElabMode -> PTerm -> Idris (Term, Type)+elabREPL info aspat tm+ = idrisCatch (elabVal info aspat tm) catchAmbig+ where+ catchAmbig (CantResolveAlts _)+ = elabVal info aspat (PDisamb [[txt "List"]] tm)+ catchAmbig e = ierror e
src/Idris/ElabDecls.hs view
@@ -29,6 +29,7 @@ import Idris.Elab.Class import Idris.Elab.Instance import Idris.Elab.Provider+import Idris.Elab.RunElab import Idris.Elab.Transform import Idris.Elab.Value @@ -68,8 +69,8 @@ -- | Return the elaborated term which calls 'main' elabMain :: Idris Term elabMain = do (m, _) <- elabVal recinfo ERHS- (PApp fc (PRef fc (sUN "run__IO"))- [pexp $ PRef fc (sNS (sUN "main") ["Main"])])+ (PApp fc (PRef fc [] (sUN "run__IO"))+ [pexp $ PRef fc [] (sNS (sUN "main") ["Main"])]) return m where fc = fileFC "toplevel" @@ -158,25 +159,25 @@ = return () -- nothing to elaborate elabDecl' what info (PTy doc argdocs s f o n nfc ty) | what /= EDefns- = do iLOG $ "Elaborating type decl " ++ show n ++ show o+ = do logLvl 1 $ "Elaborating type decl " ++ show n ++ show o elabType info s doc argdocs f o n nfc ty return ()-elabDecl' what info (PPostulate b doc s f o n ty)+elabDecl' what info (PPostulate b doc s f nfc o n ty) | what /= EDefns- = do iLOG $ "Elaborating postulate " ++ show n ++ show o+ = do logLvl 1 $ "Elaborating postulate " ++ show n ++ show o if b - then elabExtern info s doc f o n ty- else elabPostulate info s doc f o n ty+ then elabExtern info s doc f nfc o n ty+ else elabPostulate info s doc f nfc o n ty elabDecl' what info (PData doc argDocs s f co d) | what /= ETypes- = do iLOG $ "Elaborating " ++ show (d_name d)+ = do logLvl 1 $ "Elaborating " ++ show (d_name d) elabData info s doc argDocs f co d | otherwise- = do iLOG $ "Elaborating [type of] " ++ show (d_name d)+ = do logLvl 1 $ "Elaborating [type of] " ++ show (d_name d) elabData info s doc argDocs f co (PLaterdecl (d_name d) (d_name_fc d) (d_tcon d)) elabDecl' what info d@(PClauses f o n ps) | what /= ETypes- = do iLOG $ "Elaborating clause " ++ show n+ = do logLvl 1 $ "Elaborating clause " ++ show n i <- getIState -- get the type options too let o' = case lookupCtxt n (idris_flags i) of [fs] -> fs@@ -190,12 +191,14 @@ -- record mutually defined data definitions let datans = concatMap declared (filter isDataDecl ps) mapM_ (setMutData datans) datans- iLOG $ "Rechecking for positivity " ++ show datans+ logLvl 1 $ "Rechecking for positivity " ++ show datans mapM_ (\x -> do setTotality x Unchecked) datans -- Do totality checking after entire mutual block i <- get mapM_ (\n -> do logLvl 5 $ "Simplifying " ++ show n- updateContext (simplifyCasedef n $ getErasureInfo i))+ ctxt' <- do ctxt <- getContext+ tclift $ simplifyCasedef n (getErasureInfo i) ctxt+ setContext ctxt') (map snd (idris_totcheck i)) mapM_ buildSCG (idris_totcheck i) mapM_ checkDeclTotality (idris_totcheck i)@@ -213,7 +216,7 @@ elabDecl' what info (PParams f ns ps) = do i <- getIState- iLOG $ "Expanding params block with " ++ show ns ++ " decls " +++ logLvl 1 $ "Expanding params block with " ++ show ns ++ " decls " ++ show (concatMap tldeclared ps) let nblock = pblock i mapM_ (elabDecl' what info) nblock@@ -237,18 +240,17 @@ elabDecl' what info (PClass doc s f cs n nfc ps pdocs fds ds cn cd) | what /= EDefns- = do iLOG $ "Elaborating class " ++ show n+ = do logLvl 1 $ "Elaborating class " ++ show n elabClass info (s { syn_params = [] }) doc f cs n nfc ps pdocs fds ds cn cd elabDecl' what info (PInstance doc argDocs s f cs n nfc ps t expn ds)- = do iLOG $ "Elaborating instance " ++ show n+ = do logLvl 1 $ "Elaborating instance " ++ show n elabInstance info s doc argDocs what f cs n nfc ps t expn ds elabDecl' what info (PRecord doc rsyn fc opts name nfc ps pdocs fs cname cdoc csyn)- | what /= ETypes- = do iLOG $ "Elaborating record " ++ show name- elabRecord info doc rsyn fc opts name nfc ps pdocs fs cname cdoc csyn+ = do logLvl 1 $ "Elaborating record " ++ show name+ elabRecord info what doc rsyn fc opts name nfc ps pdocs fs cname cdoc csyn {- | otherwise- = do iLOG $ "Elaborating [type of] " ++ show tyn+ = do logLvl 1 $ "Elaborating [type of] " ++ show tyn elabData info s doc [] f [] (PLaterdecl tyn ty) -} elabDecl' _ info (PDSL n dsl)@@ -257,11 +259,14 @@ addIBC (IBCDSL n) elabDecl' what info (PDirective i) | what /= EDefns = directiveAction i-elabDecl' what info (PProvider doc syn fc provWhat n)+elabDecl' what info (PProvider doc syn fc nfc provWhat n) | what /= EDefns- = do iLOG $ "Elaborating type provider " ++ show n- elabProvider doc info syn fc provWhat n+ = do logLvl 1 $ "Elaborating type provider " ++ show n+ elabProvider doc info syn fc nfc provWhat n elabDecl' what info (PTransform fc safety old new) = do elabTransform info fc safety old new+ return ()+elabDecl' what info (PRunElabDecl fc script ns)+ = do elabRunElab info fc script ns return () elabDecl' _ _ _ = return () -- skipped this time
src/Idris/ElabQuasiquote.hs view
@@ -116,19 +116,19 @@ Just zz -> do (z', ex3) <- extractUnquotes n zz return (PRewrite fc x' y' (Just z'), ex1 ++ ex2 ++ ex3) Nothing -> return (PRewrite fc x' y' Nothing, ex1 ++ ex2)-extractUnquotes n (PPair fc info l r)+extractUnquotes n (PPair fc hls info l r) = do (l', ex1) <- extractUnquotes n l (r', ex2) <- extractUnquotes n r- return (PPair fc info l' r', ex1 ++ ex2)-extractUnquotes n (PDPair fc info a b c)+ return (PPair fc hls info l' r', ex1 ++ ex2)+extractUnquotes n (PDPair fc hls info a b c) = do (a', ex1) <- extractUnquotes n a (b', ex2) <- extractUnquotes n b (c', ex3) <- extractUnquotes n c- return (PDPair fc info a' b' c', ex1 ++ ex2 ++ ex3)-extractUnquotes n (PAlternative b alts)+ return (PDPair fc hls info a' b' c', ex1 ++ ex2 ++ ex3)+extractUnquotes n (PAlternative ms b alts) = do alts' <- mapM (extractUnquotes n) alts let (alts'', exs) = unzip alts'- return (PAlternative b alts'', concat exs)+ return (PAlternative ms b alts'', concat exs) extractUnquotes n (PHidden tm) = do (tm', ex) <- extractUnquotes n tm return (PHidden tm', ex)@@ -163,11 +163,13 @@ = fmap (\(tm', ex) -> (PQuasiquote tm' goal, ex)) $ extractUnquotes (n+1) tm extractUnquotes n (PUnquote tm) | n == 0 = do n <- getNameFrom (sMN 0 "unquotation")- return (PRef (fileFC "(unquote)") n, [(n, tm)])+ return (PRef (fileFC "(unquote)") [] n, [(n, tm)]) | otherwise = fmap (\(tm', ex) -> (PUnquote tm', ex)) $ extractUnquotes (n-1) tm-extractUnquotes n (PRunElab fc tm)- = fmap (\(tm', ex) -> (PRunElab fc tm', ex)) $ extractUnquotes n tm+extractUnquotes n (PRunElab fc tm ns)+ = fmap (\(tm', ex) -> (PRunElab fc tm' ns, ex)) $ extractUnquotes n tm+extractUnquotes n (PConstSugar fc tm)+ = extractUnquotes n tm extractUnquotes n x = return (x, []) -- no subterms!
src/Idris/ErrReverse.hs view
@@ -1,6 +1,6 @@ {-# LANGUAGE PatternGuards #-} -module Idris.ErrReverse where+module Idris.ErrReverse(errReverse) where import Idris.AbsSyntax import Idris.Core.TT
src/Idris/Error.hs view
@@ -88,8 +88,8 @@ -- | Issue a warning on "with"-terms whose namespace is empty or nonexistent warnDisamb :: IState -> PTerm -> Idris () warnDisamb ist (PQuote _) = return ()-warnDisamb ist (PRef _ _) = return ()-warnDisamb ist (PInferRef _ _) = return ()+warnDisamb ist (PRef _ _ _) = return ()+warnDisamb ist (PInferRef _ _ _) = return () warnDisamb ist (PPatvar _ _) = return () warnDisamb ist (PLam _ _ _ t b) = warnDisamb ist t >> warnDisamb ist b warnDisamb ist (PPi _ _ _ t b) = warnDisamb ist t >> warnDisamb ist b@@ -107,9 +107,9 @@ warnDisamb ist (PResolveTC _) = return () warnDisamb ist (PRewrite _ x y z) = warnDisamb ist x >> warnDisamb ist y >> Foldable.mapM_ (warnDisamb ist) z-warnDisamb ist (PPair _ _ x y) = warnDisamb ist x >> warnDisamb ist y-warnDisamb ist (PDPair _ _ x y z) = warnDisamb ist x >> warnDisamb ist y >> warnDisamb ist z-warnDisamb ist (PAlternative _ tms) = mapM_ (warnDisamb ist) tms+warnDisamb ist (PPair _ _ _ x y) = warnDisamb ist x >> warnDisamb ist y+warnDisamb ist (PDPair _ _ _ x y z) = warnDisamb ist x >> warnDisamb ist y >> warnDisamb ist z+warnDisamb ist (PAlternative _ _ tms) = mapM_ (warnDisamb ist) tms warnDisamb ist (PHidden tm) = warnDisamb ist tm warnDisamb ist (PType _) = return () warnDisamb ist (PUniverse _) = return ()@@ -147,7 +147,8 @@ warnDisamb ist (PQuasiquote tm goal) = warnDisamb ist tm >> Foldable.mapM_ (warnDisamb ist) goal warnDisamb ist (PUnquote tm) = warnDisamb ist tm-warnDisamb ist (PQuoteName _) = return ()+warnDisamb ist (PQuoteName _ _) = return () warnDisamb ist (PAs _ _ tm) = warnDisamb ist tm warnDisamb ist (PAppImpl tm _) = warnDisamb ist tm-warnDisamb ist (PRunElab _ tm) = warnDisamb ist tm+warnDisamb ist (PRunElab _ tm _) = warnDisamb ist tm+warnDisamb ist (PConstSugar _ tm) = warnDisamb ist tm
src/Idris/Help.hs view
@@ -27,7 +27,7 @@ show NumberArg = "<number>" show NamespaceArg = "<namespace>" show OptionArg = "<option>"- show MetaVarArg = "<metavar>"+ show MetaVarArg = "<hole>" show ColourArg = "<option>" show NoArg = "" show SpecialHeaderArg = "Arguments"@@ -46,5 +46,5 @@ , ([":makewith!", ":mw!"], NoArg, ":mw! <line> <name> destructively adds a with clause for the definition of the name on the line") , ([":proofsearch!", ":ps!"], NoArg, ":ps! <line> <name> <names> destructively does proof search for name on line, with names as hints") , ([":addproofclause!", ":apc!"], NoArg, ":apc! <line> <name> destructively adds a pattern-matching proof clause to name on line")- , ([":refine!", ":ref!"], NoArg, ":ref! <line> <name> <name'> destructively attempts to partially solve name on line, with name' as hint, introducing metavariables for arguments that aren't inferrable")+ , ([":refine!", ":ref!"], NoArg, ":ref! <line> <name> <name'> destructively attempts to partially solve name on line, with name' as hint, introducing holes for arguments that aren't inferrable") ]
src/Idris/IBC.hs view
@@ -2,7 +2,8 @@ {-# OPTIONS_GHC -fwarn-incomplete-patterns #-} module Idris.IBC (loadIBC, loadPkgIndex,- writeIBC, writePkgIndex) where+ writeIBC, writePkgIndex,+ hasValidIBCVersion) where import Idris.Core.Evaluate import Idris.Core.TT@@ -36,16 +37,13 @@ import qualified Control.Monad.State.Strict as ST import System.FilePath import System.Directory-import Codec.Compression.Zlib (compress) import Codec.Archive.Zip-import Util.Zlib (decompressEither) ibcVersion :: Word16-ibcVersion = 110+ibcVersion = 119 data IBCFile = IBCFile { ver :: Word16, sourcefile :: FilePath,- symbols :: ![Name], ibc_imports :: ![(Bool, FilePath)], ibc_importdirs :: ![FilePath], ibc_implicits :: ![(Name, [PArg])],@@ -80,7 +78,7 @@ ibc_metainformation :: ![(Name, MetaInformation)], ibc_errorhandlers :: ![Name], ibc_function_errorhandlers :: ![(Name, Name, Name)], -- fn, arg, handler- ibc_metavars :: ![(Name, (Maybe Name, Int, Bool))],+ ibc_metavars :: ![(Name, (Maybe Name, Int, [Name], Bool))], ibc_patdefs :: ![(Name, ([([Name], Term, Term)], [PTerm]))], ibc_postulates :: ![Name], ibc_externs :: ![(Name, Int)],@@ -95,8 +93,16 @@ !-} initIBC :: IBCFile-initIBC = IBCFile ibcVersion "" [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] Nothing [] [] []+initIBC = IBCFile ibcVersion "" [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] Nothing [] [] [] +hasValidIBCVersion :: FilePath -> Idris Bool+hasValidIBCVersion fp = do+ archiveFile <- runIO $ B.readFile fp+ case toArchiveOrFail archiveFile of+ Left _ -> return False+ Right archive -> do ver <- getEntry 0 "ver" archive+ return (ver == ibcVersion)+ loadIBC :: Bool -- ^ True = reexport, False = make everything private -> FilePath -> Idris () loadIBC reexport fp@@ -105,7 +111,7 @@ Nothing -> True Just p -> not p && reexport when redo $- do iLOG $ "Loading ibc " ++ fp ++ " " ++ show reexport+ do logLvl 1 $ "Loading ibc " ++ fp ++ " " ++ show reexport archiveFile <- runIO $ B.readFile fp case toArchiveOrFail archiveFile of Left _ -> ifail $ fp ++ " isn't loadable, it may have an old ibc format.\n"@@ -130,7 +136,6 @@ entries :: IBCFile -> [Entry] entries i = catMaybes [Just $ toEntry "ver" 0 (encode $ ver i), makeEntry "sourcefile" (sourcefile i),- makeEntry "symbols" (symbols i), makeEntry "ibc_imports" (ibc_imports i), makeEntry "ibc_importdirs" (ibc_importdirs i), makeEntry "ibc_implicits" (ibc_implicits i),@@ -180,7 +185,7 @@ writeIBC :: FilePath -> FilePath -> Idris () writeIBC src f- = do iLOG $ "Writing ibc " ++ show f+ = do logLvl 1 $ "Writing ibc " ++ show f i <- getIState -- case (Data.List.map fst (idris_metavars i)) \\ primDefs of -- (_:_) -> ifail "Can't write ibc when there are unsolved metavariables"@@ -189,8 +194,8 @@ ibcf <- mkIBC (ibc_write i) (initIBC { sourcefile = src }) idrisCatch (do runIO $ createDirectoryIfMissing True (dropFileName f) writeArchive f ibcf- iLOG "Written")- (\c -> do iLOG $ "Failed " ++ pshow i c)+ logLvl 1 "Written")+ (\c -> do logLvl 1 $ "Failed " ++ pshow i c) return () -- Write a package index containing all the imports in the current IState@@ -199,14 +204,14 @@ writePkgIndex f = do i <- getIState let imps = map (\ (x, y) -> (True, x)) $ idris_imported i- iLOG $ "Writing package index " ++ show f ++ " including\n" +++ logLvl 1 $ "Writing package index " ++ show f ++ " including\n" ++ show (map snd imps) resetNameIdx let ibcf = initIBC { ibc_imports = imps } idrisCatch (do runIO $ createDirectoryIfMissing True (dropFileName f) writeArchive f ibcf- iLOG "Written")- (\c -> do iLOG $ "Failed " ++ pshow i c)+ logLvl 1 "Written")+ (\c -> do logLvl 1 $ "Failed " ++ pshow i c) return () mkIBC :: [IBCWrite] -> IBCFile -> Idris IBCFile@@ -305,7 +310,7 @@ process reexp i fn = do ver <- getEntry 0 "ver" i when (ver /= ibcVersion) $ do- iLOG "ibc out of date"+ logLvl 1 "ibc out of date" let e = if ver < ibcVersion then " an earlier " else " a later " ifail $ "Incompatible ibc version.\nThis library was built with"@@ -314,7 +319,7 @@ srcok <- runIO $ doesFileExist source when srcok $ timestampOlder source fn pImportDirs =<< getEntry [] "ibc_importdirs" i- pImports =<< getEntry [] "ibc_imports" i+ pImports reexp =<< getEntry [] "ibc_imports" i pImps =<< getEntry [] "ibc_implicits" i pFixes =<< getEntry [] "ibc_fixes" i pStatics =<< getEntry [] "ibc_statics" i@@ -330,9 +335,7 @@ pCGFlags =<< getEntry [] "ibc_cgflags" i pDyLibs =<< getEntry [] "ibc_dynamic_libs" i pHdrs =<< getEntry [] "ibc_hdrs" i- symbols <- getEntry [] "symbols" i- defs <- getEntry [] "ibc_defs" i- pDefs reexp symbols defs+ pDefs reexp =<< getEntry [] "ibc_defs" i pPatdefs =<< getEntry [] "ibc_patdefs" i pAccess reexp =<< getEntry [] "ibc_access" i pFlags =<< getEntry [] "ibc_flags" i@@ -362,7 +365,7 @@ timestampOlder src ibc = do srct <- runIO $ getModificationTime src ibct <- runIO $ getModificationTime ibc if (srct > ibct)- then ifail "Needs reloading"+ then ifail $ "Needs reloading " ++ show (srct, ibct) else return () pPostulates :: [Name] -> Idris ()@@ -387,22 +390,22 @@ pImportDirs :: [FilePath] -> Idris () pImportDirs fs = mapM_ addImportDir fs -pImports :: [(Bool, FilePath)] -> Idris ()-pImports fs+pImports :: Bool -> [(Bool, FilePath)] -> Idris ()+pImports reexp fs = do mapM_ (\(re, f) -> do i <- getIState ibcsd <- valIBCSubDir i ids <- allImportDirs fp <- findImport ids ibcsd f -- if (f `elem` imported i)--- then iLOG $ "Already read " ++ f+-- then logLvl 1 $ "Already read " ++ f putIState (i { imported = f : imported i }) case fp of- LIDR fn -> do iLOG $ "Failed at " ++ fn+ LIDR fn -> do logLvl 1 $ "Failed at " ++ fn ifail "Must be an ibc"- IDR fn -> do iLOG $ "Failed at " ++ fn+ IDR fn -> do logLvl 1 $ "Failed at " ++ fn ifail "Must be an ibc"- IBC fn src -> loadIBC re fn)+ IBC fn src -> loadIBC (reexp && re) fn) fs pImps :: [(Name, [PArg])] -> Idris ()@@ -485,19 +488,19 @@ pPatdefs ds = mapM_ (\ (n, d) -> updateIState (\i -> i { idris_patdefs = addDef n (force d) (idris_patdefs i) })) ds -pDefs :: Bool -> [Name] -> [(Name, Def)] -> Idris ()-pDefs reexp syms ds+pDefs :: Bool -> [(Name, Def)] -> Idris ()+pDefs reexp ds = mapM_ (\ (n, d) -> do d' <- updateDef d case d' of TyDecl _ _ -> return ()- _ -> do iLOG $ "SOLVING " ++ show n+ _ -> do logLvl 1 $ "SOLVING " ++ show n solveDeferred n updateIState (\i -> i { tt_ctxt = addCtxtDef n d' (tt_ctxt i) }) -- logLvl 1 $ "Added " ++ show (n, d')- if (not reexp) then do iLOG $ "Not exporting " ++ show n+ if (not reexp) then do logLvl 1 $ "Not exporting " ++ show n setAccessibility n Hidden- else iLOG $ "Exporting " ++ show n) ds+ else logLvl 1 $ "Exporting " ++ show n) ds where updateDef (CaseOp c t args o s cd) = do o' <- mapM updateOrig o@@ -607,7 +610,7 @@ pFunctionErrorHandlers ns = mapM_ (\ (fn,arg,handler) -> addFunctionErrorHandlers fn arg [handler]) ns -pMetavars :: [(Name, (Maybe Name, Int, Bool))] -> Idris ()+pMetavars :: [(Name, (Maybe Name, Int, [Name], Bool))] -> Idris () pMetavars ns = updateIState (\i -> i { idris_metavars = L.reverse ns ++ idris_metavars i }) ----- For Cheapskate and docstrings@@ -948,6 +951,7 @@ put x1 Unchecked -> do putWord8 2 Productive -> do putWord8 3+ Generated -> do putWord8 4 get = do i <- getWord8 case i of@@ -957,6 +961,7 @@ return (Partial x1) 2 -> return Unchecked 3 -> return Productive+ 4 -> return Generated _ -> error "Corrupted binary data for Totality" instance Binary MetaInformation where@@ -1007,6 +1012,7 @@ CExport x1 -> do putWord8 14 put x1 AutoHint -> putWord8 15+ PEGenerated -> putWord8 16 get = do i <- getWord8 case i of@@ -1028,6 +1034,7 @@ 14 -> do x1 <- get return $ CExport x1 15 -> return AutoHint+ 16 -> return PEGenerated _ -> error "Corrupted binary data for FnOpt" instance Binary Fixity where@@ -1228,7 +1235,7 @@ PMutual x1 x2 -> do putWord8 11 put x1 put x2- PPostulate x1 x2 x3 x4 x5 x6 x7+ PPostulate x1 x2 x3 x4 x5 x6 x7 x8 -> do putWord8 12 put x1 put x2@@ -1237,22 +1244,28 @@ put x5 put x6 put x7+ put x8 PSyntax x1 x2 -> do putWord8 13 put x1 put x2 PDirective x1 -> error "Cannot serialize PDirective"- PProvider x1 x2 x3 x4 x5 ->+ PProvider x1 x2 x3 x4 x5 x6 -> do putWord8 15 put x1 put x2 put x3 put x4 put x5+ put x6 PTransform x1 x2 x3 x4 -> do putWord8 16 put x1 put x2 put x3 put x4+ PRunElabDecl x1 x2 x3 -> do putWord8 17+ put x1+ put x2+ put x3 get = do i <- getWord8 case i of@@ -1344,7 +1357,8 @@ x5 <- get x6 <- get x7 <- get- return (PPostulate x1 x2 x3 x4 x5 x6 x7)+ x8 <- get+ return (PPostulate x1 x2 x3 x4 x5 x6 x7 x8) 13 -> do x1 <- get x2 <- get return (PSyntax x1 x2)@@ -1354,12 +1368,17 @@ x3 <- get x4 <- get x5 <- get- return (PProvider x1 x2 x3 x4 x5)+ x6 <- get+ return (PProvider x1 x2 x3 x4 x5 x6) 16 -> do x1 <- get x2 <- get x3 <- get x4 <- get return (PTransform x1 x2 x3 x4)+ 17 -> do x1 <- get+ x2 <- get+ x3 <- get+ return (PRunElabDecl x1 x2 x3) _ -> error "Corrupted binary data for PDecl'" instance Binary t => Binary (ProvideWhat' t) where@@ -1511,12 +1530,14 @@ = case x of PQuote x1 -> do putWord8 0 put x1- PRef x1 x2 -> do putWord8 1- put x1- put x2- PInferRef x1 x2 -> do putWord8 2- put x1- put x2+ PRef x1 x2 x3 -> do putWord8 1+ put x1+ put x2+ put x3+ PInferRef x1 x2 x3 -> do putWord8 2+ put x1+ put x2+ put x3 PPatvar x1 x2 -> do putWord8 3 put x1 put x2@@ -1568,20 +1589,23 @@ put x2 put x3 put x4- PPair x1 x2 x3 x4 -> do putWord8 18- put x1- put x2- put x3- put x4- PDPair x1 x2 x3 x4 x5 -> do putWord8 19+ PPair x1 x2 x3 x4 x5 -> do putWord8 18+ put x1+ put x2+ put x3+ put x4+ put x5+ PDPair x1 x2 x3 x4 x5 x6 -> do putWord8 19+ put x1+ put x2+ put x3+ put x4+ put x5+ put x6+ PAlternative x1 x2 x3 -> do putWord8 20 put x1 put x2 put x3- put x4- put x5- PAlternative x1 x2 -> do putWord8 20- put x1- put x2 PHidden x1 -> do putWord8 21 put x1 PType x1 -> do putWord8 22@@ -1621,9 +1645,10 @@ put x2 PUniverse x1 -> do putWord8 38 put x1- PRunElab x1 x2 -> do putWord8 39- put x1- put x2+ PRunElab x1 x2 x3 -> do putWord8 39+ put x1+ put x2+ put x3 PAs x1 x2 x3 -> do putWord8 40 put x1 put x2@@ -1635,13 +1660,17 @@ put x2 PUnquote x1 -> do putWord8 43 put x1- PQuoteName x1 -> do putWord8 44- put x1+ PQuoteName x1 x2 -> do putWord8 44+ put x1+ put x2 PIfThenElse x1 x2 x3 x4 -> do putWord8 45 put x1 put x2 put x3 put x4+ PConstSugar x1 x2 -> do putWord8 46+ put x1+ put x2 get = do i <- getWord8@@ -1650,10 +1679,12 @@ return (PQuote x1) 1 -> do x1 <- get x2 <- get- return (PRef x1 x2)+ x3 <- get+ return (PRef x1 x2 x3) 2 -> do x1 <- get x2 <- get- return (PInferRef x1 x2)+ x3 <- get+ return (PInferRef x1 x2 x3) 3 -> do x1 <- get x2 <- get return (PPatvar x1 x2)@@ -1708,16 +1739,19 @@ x2 <- get x3 <- get x4 <- get- return (PPair x1 x2 x3 x4)+ x5 <- get+ return (PPair x1 x2 x3 x4 x5) 19 -> do x1 <- get x2 <- get x3 <- get x4 <- get x5 <- get- return (PDPair x1 x2 x3 x4 x5)+ x6 <- get+ return (PDPair x1 x2 x3 x4 x5 x6) 20 -> do x1 <- get x2 <- get- return (PAlternative x1 x2)+ x3 <- get+ return (PAlternative x1 x2 x3) 21 -> do x1 <- get return (PHidden x1) 22 -> do x1 <- get@@ -1759,7 +1793,8 @@ return (PUniverse x1) 39 -> do x1 <- get x2 <- get- return (PRunElab x1 x2)+ x3 <- get+ return (PRunElab x1 x2 x3) 40 -> do x1 <- get x2 <- get x3 <- get@@ -1772,12 +1807,16 @@ 43 -> do x1 <- get return (PUnquote x1) 44 -> do x1 <- get- return (PQuoteName x1)+ x2 <- get+ return (PQuoteName x1 x2) 45 -> do x1 <- get x2 <- get x3 <- get x4 <- get return (PIfThenElse x1 x2 x3 x4)+ 46 -> do x1 <- get+ x2 <- get+ return (PConstSugar x1 x2) _ -> error "Corrupted binary data for PTerm" instance Binary PAltType where@@ -1786,12 +1825,14 @@ ExactlyOne x1 -> do putWord8 0 put x1 FirstSuccess -> putWord8 1+ TryImplicit -> putWord8 2 get = do i <- getWord8 case i of 0 -> do x1 <- get return (ExactlyOne x1) 1 -> return FirstSuccess+ 2 -> return TryImplicit _ -> error "Corrupted binary data for PAltType" @@ -1836,12 +1877,13 @@ put x1 ByReflection x1 -> do putWord8 20 put x1- ProofSearch x1 x2 x3 x4 x5 -> do putWord8 21- put x1- put x2- put x3- put x4- put x5+ ProofSearch x1 x2 x3 x4 x5 x6 -> do putWord8 21+ put x1+ put x2+ put x3+ put x4+ put x5+ put x6 DoUnify -> putWord8 22 CaseTac x1 -> do putWord8 23 put x1@@ -1921,7 +1963,8 @@ x3 <- get x4 <- get x5 <- get- return (ProofSearch x1 x2 x3 x4 x5)+ x6 <- get+ return (ProofSearch x1 x2 x3 x4 x5 x6) 22 -> return DoUnify 23 -> do x1 <- get return (CaseTac x1)@@ -2133,14 +2176,25 @@ instance Binary Syntax where put (Rule x1 x2 x3)- = do put x1+ = do putWord8 0+ put x1 put x2 put x3+ put (DeclRule x1 x2)+ = do putWord8 1+ put x1+ put x2 get- = do x1 <- get- x2 <- get- x3 <- get- return (Rule x1 x2 x3)+ = do i <- getWord8+ case i of+ 0 -> do x1 <- get+ x2 <- get+ x3 <- get+ return (Rule x1 x2 x3)+ 1 -> do x1 <- get+ x2 <- get+ return (DeclRule x1 x2)+ _ -> error "Corrupted binary data for Syntax" instance (Binary t) => Binary (DSL' t) where put (DSL x1 x2 x3 x4 x5 x6 x7 x8 x9 x10)
src/Idris/IdeMode.hs view
@@ -2,7 +2,7 @@ {-# LANGUAGE FlexibleInstances, IncoherentInstances, PatternGuards #-} -module Idris.IdeMode(parseMessage, convSExp, WhatDocs(..), IdeModeCommand(..), sexpToCommand, toSExp, SExp(..), SExpable, Opt(..), ideModeEpoch, getLen, getNChar) where+module Idris.IdeMode(parseMessage, convSExp, WhatDocs(..), IdeModeCommand(..), sexpToCommand, toSExp, SExp(..), SExpable, Opt(..), ideModeEpoch, getLen, getNChar, sExpToString) where import Text.Printf import Numeric@@ -148,7 +148,10 @@ BoldText -> "bold" ItalicText -> "italic" UnderlineText -> "underline"- toSExp (AnnTerm bnd tm) = toSExp [(SymbolAtom "tt-term", StringAtom (encodeTerm bnd tm))]+ toSExp (AnnLink url) = toSExp [(SymbolAtom "link-href", StringAtom url)]+ toSExp (AnnTerm bnd tm)+ | termSmallerThan 1000 tm = toSExp [(SymbolAtom "tt-term", StringAtom (encodeTerm bnd tm))]+ | otherwise = SexpList [] toSExp (AnnSearchResult ordr) = toSExp [(SymbolAtom "doc-overview", StringAtom ("Result type is " ++ descr))] where descr = case ordr of@@ -160,6 +163,8 @@ toSExp $ [(SymbolAtom "namespace", StringAtom (intercalate "." (map T.unpack ns)))] ++ [(SymbolAtom "decor", SymbolAtom $ if isJust file then "module" else "namespace")] ++ maybeProps [("source-file", file)]+ toSExp AnnQuasiquote = toSExp [(SymbolAtom "quasiquotation", True)]+ toSExp AnnAntiquote = toSExp [(SymbolAtom "antiquotation", True)] encodeTerm :: [(Name, Bool)] -> Term -> String encodeTerm bnd tm = UTF8.toString . Base64.encode . Lazy.toStrict . Binary.encode $@@ -224,6 +229,7 @@ | AddProofClause Int String | AddMissing Int String | MakeWithBlock Int String+ | MakeCaseBlock Int String | ProofSearch Bool Int String [String] (Maybe Int) -- ^^ Recursive?, line, name, hints, depth | MakeLemma Int String | LoadFile String (Maybe Int)@@ -256,6 +262,7 @@ sexpToCommand (SexpList [SymbolAtom "add-proof-clause", IntegerAtom line, StringAtom name]) = Just (AddProofClause (fromInteger line) name) sexpToCommand (SexpList [SymbolAtom "add-missing", IntegerAtom line, StringAtom name]) = Just (AddMissing (fromInteger line) name) sexpToCommand (SexpList [SymbolAtom "make-with", IntegerAtom line, StringAtom name]) = Just (MakeWithBlock (fromInteger line) name)+sexpToCommand (SexpList [SymbolAtom "make-case", IntegerAtom line, StringAtom name]) = Just (MakeCaseBlock (fromInteger line) name) -- The Boolean in ProofSearch means "search recursively" -- If it's False, that means "refine", i.e. apply the name and fill in any -- arguments which can be done by unification.
src/Idris/IdrisDoc.hs view
@@ -288,8 +288,8 @@ -- TODO: Remove unnecessary cases extractPTermNames :: PTerm -- ^ Where to extract names from -> [Name] -- ^ Extracted names-extractPTermNames (PRef _ n) = [n]-extractPTermNames (PInferRef _ n) = [n]+extractPTermNames (PRef _ _ n) = [n]+extractPTermNames (PInferRef _ _ n) = [n] extractPTermNames (PPatvar _ n) = [n] extractPTermNames (PLam _ n _ p1 p2) = n : concatMap extract [p1, p2] extractPTermNames (PPi _ n _ p1 p2) = n : concatMap extract [p1, p2]@@ -306,9 +306,9 @@ extractPTermNames (PRewrite _ a b m) | Just c <- m = concatMap extract [a, b, c] extractPTermNames (PRewrite _ a b _) = concatMap extract [a, b]-extractPTermNames (PPair _ _ p1 p2) = concatMap extract [p1, p2]-extractPTermNames (PDPair _ _ a b c) = concatMap extract [a, b, c]-extractPTermNames (PAlternative _ l) = concatMap extract l+extractPTermNames (PPair _ _ _ p1 p2) = concatMap extract [p1, p2]+extractPTermNames (PDPair _ _ _ a b c) = concatMap extract [a, b, c]+extractPTermNames (PAlternative _ _ l) = concatMap extract l extractPTermNames (PHidden p) = extract p extractPTermNames (PGoal _ p1 n p2) = n : concatMap extract [p1, p2] extractPTermNames (PDoBlock pdos) = concatMap extractPDo pdos@@ -320,7 +320,8 @@ extractPTermNames (PDisamb _ p) = extract p extractPTermNames (PUnifyLog p) = extract p extractPTermNames (PNoImplicits p) = extract p-extractPTermNames (PRunElab _ p) = extract p+extractPTermNames (PRunElab _ p _) = extract p+extractPTermNames (PConstSugar _ tm) = extract tm extractPTermNames _ = [] -- | Shorter name for extractPTermNames@@ -359,8 +360,8 @@ extractPTactic (LetTac n p) = n : extract p extractPTactic (LetTacTy n p1 p2) = n : concatMap extract [p1, p2] extractPTactic (Exact p) = extract p-extractPTactic (ProofSearch _ _ _ m ns) | Just n <- m = n : ns-extractPTactic (ProofSearch _ _ _ _ ns) = ns+extractPTactic (ProofSearch _ _ _ m _ ns) | Just n <- m = n : ns+extractPTactic (ProofSearch _ _ _ _ _ ns) = ns extractPTactic (Try t1 t2) = concatMap extractPTactic [t1, t2] extractPTactic (TSeq t1 t2) = concatMap extractPTactic [t1, t2] extractPTactic (ApplyTactic p) = extract p
src/Idris/Imports.hs view
@@ -1,4 +1,5 @@-module Idris.Imports where+module Idris.Imports(IFileType(..), findImport, findInPath, findPkgIndex,+ ibcPathNoFallback, installedPackages, pkgIndex) where import Control.Applicative ((<$>)) import Data.List (isSuffixOf)
src/Idris/Inliner.hs view
@@ -1,6 +1,6 @@ {-# LANGUAGE PatternGuards #-} -module Idris.Inliner where+module Idris.Inliner(inlineDef, inlineTerm) where import Idris.Core.TT import Idris.AbsSyntax
src/Idris/Interactive.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE PatternGuards #-} module Idris.Interactive(caseSplitAt, addClauseFrom, addProofClauseFrom,- addMissing, makeWith, doProofSearch,+ addMissing, makeWith, makeCase, doProofSearch, makeLemma) where {- Bits and pieces for editing source files interactively, called from@@ -35,7 +35,7 @@ caseSplitAt fn updatefile l n = do src <- runIO $ readSource fn res <- splitOnLine l n fn- iLOG (showSep "\n" (map show res))+ logLvl 1 (showSep "\n" (map show res)) let (before, (ap : later)) = splitAt (l-1) (lines src) res' <- replaceSplits ap res let new = concat res'@@ -112,7 +112,7 @@ else iPrintResult extras where showPat = show . stripNS stripNS tm = mapPT dens tm where- dens (PRef fc n) = PRef fc (nsroot n)+ dens (PRef fc hls n) = PRef fc hls (nsroot n) dens t = t nsroot (NS n _) = nsroot n@@ -120,7 +120,7 @@ nsroot n = n getAppName (PApp _ r _) = getAppName r- getAppName (PRef _ r) = r+ getAppName (PRef _ _ r) = r getAppName _ = n makeIndent ind | ".lidr" `isSuffixOf` fn = '>' : ' ' : replicate (ind-2) ' '@@ -158,11 +158,52 @@ else iPrintResult with where getIndent s = length (takeWhile isSpace s) +-- Replace the given metavariable on the given line with a 'case'+-- block, using a _ for the scrutinee+makeCase :: FilePath -> Bool -> Int -> Name -> Idris ()+makeCase fn updatefile l n+ = do src <- runIO $ readSource fn+ let (before, tyline : later) = splitAt (l-1) (lines src)+ let newcase = addCaseSkel (show n) tyline + if updatefile then+ do let fb = fn ++ "~"+ runIO $ writeSource fb (unlines (before ++ newcase ++ later))+ runIO $ copyFile fb fn+ else iPrintResult (showSep "\n" newcase ++"\n")+ where addCaseSkel n line =+ let b = brackets False line in+ case findSubstr ('?':n) line of+ Just (before, pos, after) ->+ [before ++ (if b then "(" else "") ++ "case _ of",+ take (pos + (if b then 6 else 5)) (repeat ' ') ++ + "case_val => ?" ++ n ++ (if b then ")" else "")+ ++ after]+ Nothing -> fail "No such metavariable"++ -- Assume case needs to be bracketed unless the metavariable is+ -- on its own after an =+ brackets eq line | line == '?' : show n = not eq+ brackets eq ('=':ls) = brackets True ls+ brackets eq (' ':ls) = brackets eq ls+ brackets eq (l : ls) = brackets False ls+ brackets eq [] = True++ findSubstr n xs = findSubstr' [] 0 n xs++ findSubstr' acc i n xs | take (length n) xs == n + = Just (reverse acc, i, drop (length n) xs)+ findSubstr' acc i n [] = Nothing+ findSubstr' acc i n (x : xs) = findSubstr' (x : acc) (i + 1) n xs+++++ doProofSearch :: FilePath -> Bool -> Bool -> Int -> Name -> [Name] -> Maybe Int -> Idris () doProofSearch fn updatefile rec l n hints Nothing- = doProofSearch fn updatefile rec l n hints (Just 10)+ = doProofSearch fn updatefile rec l n hints (Just 20) doProofSearch fn updatefile rec l n hints (Just depth) = do src <- runIO $ readSource fn let (before, tyline : later) = splitAt (l-1) (lines src)@@ -172,16 +213,17 @@ [] -> return n ns -> ierror (CantResolveAlts ns) i <- getIState- let (top, envlen, _) = case lookup mn (idris_metavars i) of- Just (t, e, False) -> (t, e, False)- _ -> (Nothing, 0, True)+ let (top, envlen, psnames, _) + = case lookup mn (idris_metavars i) of+ Just (t, e, ns, False) -> (t, e, ns, False)+ _ -> (Nothing, 0, [], True) let fc = fileFC fn- let body t = PProof [Try (TSeq Intros (ProofSearch rec False depth t hints))- (ProofSearch rec False depth t hints)]- let def = PClause fc mn (PRef fc mn) [] (body top) []+ let body t = PProof [Try (TSeq Intros (ProofSearch rec False depth t psnames hints))+ (ProofSearch rec False depth t psnames hints)]+ let def = PClause fc mn (PRef fc [] mn) [] (body top) [] newmv <- idrisCatch (do elabDecl' EAll recinfo (PClauses fc [] mn [def])- (tm, ty) <- elabVal recinfo ERHS (PRef fc mn)+ (tm, ty) <- elabVal recinfo ERHS (PRef fc [] mn) ctxt <- getContext i <- getIState return . flip displayS "" . renderPretty 1.0 80 $@@ -204,7 +246,7 @@ dropCtxt _ t = t stripNS tm = mapPT dens tm where- dens (PRef fc n) = PRef fc (nsroot n)+ dens (PRef fc hls n) = PRef fc hls (nsroot n) dens t = t nsroot (NS n _) = nsroot n@@ -250,19 +292,23 @@ let isProv = checkProv tyline (show n) ctxt <- getContext- mty <- case lookupTyName n ctxt of- [(_,t)] -> return t- [] -> ierror (NoSuchVariable n)- ns -> ierror (CantResolveAlts (map fst ns))+ (fname, mty) <- case lookupTyName n ctxt of+ [t] -> return t+ [] -> ierror (NoSuchVariable n)+ ns -> ierror (CantResolveAlts (map fst ns)) i <- getIState- margs <- case lookup n (idris_metavars i) of- Just (_, arity, _) -> return arity+ margs <- case lookup fname (idris_metavars i) of+ Just (_, arity, _, _) -> return arity _ -> return (-1) if (not isProv) then do- let skip = guessImps (tt_ctxt i) mty+ let skip = guessImps i (tt_ctxt i) mty+ let classes = guessClasses i (tt_ctxt i) mty - let lem = show n ++ " : " ++ show (stripMNBind skip (delab i mty))+ let lem = show n ++ " : " ++ + constraints i classes mty +++ showTmOpts (defaultPPOption { ppopt_pinames = True })+ (stripMNBind skip margs (delab i mty)) let lem_app = show n ++ appArgs skip margs mty if updatefile then@@ -305,22 +351,70 @@ appArgs skip i (Bind _ (Pi _ _ _) sc) = appArgs skip (i - 1) sc appArgs skip i _ = "" - stripMNBind skip (PPi b n@(UN c) _ ty sc) - | (thead c /= '_' && n `notElem` skip) ||+ stripMNBind _ args t | args <= 0 = t+ stripMNBind skip args (PPi b n@(UN c) _ ty sc) + | n `notElem` skip || take 4 (str c) == "__pi" -- keep in type, but not in app- = PPi b n NoFC ty (stripMNBind skip sc)- stripMNBind skip (PPi b _ _ ty sc) = stripMNBind skip sc- stripMNBind skip t = t+ = PPi b n NoFC ty (stripMNBind skip (args - 1) sc)+ stripMNBind skip args (PPi b _ _ ty sc) = stripMNBind skip (args - 1) sc+ stripMNBind skip args t = t + constraints :: IState -> [Name] -> Type -> String+ constraints i [] ty = ""+ constraints i [n] ty = showSep ", " (showConstraints i [n] ty) ++ " => "+ constraints i ns ty = "(" ++ showSep ", " (showConstraints i ns ty) ++ ") => "++ showConstraints i ns (Bind n (Pi _ ty _) sc)+ | n `elem` ns = show (delab i ty) : + showConstraints i ns (substV (P Bound n Erased) sc)+ | otherwise = showConstraints i ns (substV (P Bound n Erased) sc)+ showConstraints _ _ _ = []+ -- Guess which binders should be implicits in the generated lemma. -- Make them implicit if they appear guarded by a top level constructor, -- or at the top level themselves.- guessImps :: Context -> Term -> [Name]- guessImps ctxt (Bind n (Pi _ _ _) sc)+ -- Also, make type class instances implicit+ guessImps :: IState -> Context -> Term -> [Name]+ -- machine names aren't lifted+ guessImps ist ctxt (Bind n@(MN _ _) (Pi _ ty _) sc) + = n : guessImps ist ctxt sc+ guessImps ist ctxt (Bind n (Pi _ ty _) sc) | guarded ctxt n (substV (P Bound n Erased) sc) - = n : guessImps ctxt sc- | otherwise = guessImps ctxt sc- guessImps ctxt _ = []+ = n : guessImps ist ctxt sc+ | isClass ist ty+ = n : guessImps ist ctxt sc+ | TType _ <- ty = n : guessImps ist ctxt sc+ | ignoreName n = n : guessImps ist ctxt sc+ | otherwise = guessImps ist ctxt sc+ guessImps ist ctxt _ = []+ + -- TMP HACK unusable name so don't lift+ ignoreName n = case show n of+ "_aX" -> True+ _ -> False++ guessClasses :: IState -> Context -> Term -> [Name]+ guessClasses ist ctxt (Bind n (Pi _ ty _) sc)+ | isParamClass ist ty+ = n : guessClasses ist ctxt sc+ | otherwise = guessClasses ist ctxt sc+ guessClasses ist ctxt _ = []++ isClass ist t+ | (P _ n _, args) <- unApply t+ = case lookupCtxtExact n (idris_classes ist) of+ Just _ -> True+ _ -> False+ | otherwise = False+ + isParamClass ist t+ | (P _ n _, args) <- unApply t+ = case lookupCtxtExact n (idris_classes ist) of+ Just _ -> any isV args+ _ -> False+ | otherwise = False+ where isV (V _) = True+ isV _ = False guarded ctxt n (P _ n' _) | n == n' = True guarded ctxt n ap@(App _ _ _)
src/Idris/Output.hs view
@@ -6,6 +6,7 @@ import Idris.Core.Evaluate (isDConName, isTConName, isFnName, normaliseAll) import Idris.AbsSyntax+import Idris.Colours (hStartColourise, hEndColourise) import Idris.Delaborate import Idris.Docstrings import Idris.IdeMode@@ -17,7 +18,8 @@ import System.Console.Haskeline.MonadException (MonadException (controlIO), RunIO (RunIO))-import System.IO (stdout, Handle, hPutStrLn)+import System.IO (stdout, Handle, hPutStrLn, hPutStr)+import System.FilePath (replaceExtension) import Prelude hiding ((<$>)) @@ -44,7 +46,7 @@ case fc of FC fn _ _ | fn /= "" -> text (show fc) <> colon <//> err _ -> err- runIO . hPutStrLn h $ displayDecorated (consoleDecorate i) err'+ hWriteDoc h i err' IdeMode n h -> do err' <- iRender . fmap (fancifyAnnots i True) $ err let (str, spans) = displaySpans err'@@ -67,13 +69,23 @@ | otherwise -> do width <- runIO getScreenWidth return $ renderPretty 0.8 width d +hWriteDoc :: Handle -> IState -> SimpleDoc OutputAnnotation -> Idris ()+hWriteDoc h ist rendered =+ do runIO $ displayDecoratedA+ (hPutStr h)+ (maybe (return ()) (hStartColourise h))+ (maybe (return ()) (hEndColourise h))+ (fmap (annotationColour ist) rendered)+ runIO $ hPutStr h "\n" -- newline translation on the output+ -- stream should take care of this for+ -- Windows+ -- | Write a pretty-printed term to the console with semantic coloring consoleDisplayAnnotated :: Handle -> Doc OutputAnnotation -> Idris ()-consoleDisplayAnnotated h output = do ist <- getIState- rendered <- iRender $ output- runIO . hPutStrLn h .- displayDecorated (consoleDecorate ist) $- rendered+consoleDisplayAnnotated h output =+ do ist <- getIState+ rendered <- iRender output+ hWriteDoc h ist rendered iPrintTermWithType :: Doc OutputAnnotation -> Doc OutputAnnotation -> Idris () iPrintTermWithType tm ty = iRenderResult (tm <+> colon <+> align ty)@@ -86,16 +98,18 @@ let infixes = idris_infixes ist let output = vsep (map (uncurry (ppOverload ppo infixes)) overloads) iRenderResult output- where fullName n = prettyName True True bnd n+ where fullName ppo n | length overloads > 1 = prettyName True True bnd n+ | otherwise = prettyName True (ppopt_impl ppo) bnd n ppOverload ppo infixes n tm =- fullName n <+> colon <+> align tm+ fullName ppo n <+> colon <+> align tm iRenderOutput :: Doc OutputAnnotation -> Idris () iRenderOutput doc = do i <- getIState case idris_outputmode i of RawOutput h -> do out <- iRender doc- runIO $ putStrLn (displayDecorated (consoleDecorate i) out)+ hWriteDoc h i out+ IdeMode n h -> do (str, spans) <- fmap displaySpans . iRender . fmap (fancifyAnnots i True) $ doc let out = [toSExp str, toSExp spans]@@ -166,7 +180,7 @@ iputGoal :: SimpleDoc OutputAnnotation -> Idris () iputGoal g = do i <- getIState case idris_outputmode i of- RawOutput h -> runIO $ hPutStrLn h (displayDecorated (consoleDecorate i) g)+ RawOutput h -> hWriteDoc h i g IdeMode n h -> let (str, spans) = displaySpans . fmap (fancifyAnnots i True) $ g goal = [toSExp str, toSExp spans]@@ -194,11 +208,23 @@ where ppTm = pprintDelab ist norm = normaliseAll (tt_ctxt ist) [] +sendParserHighlighting :: Idris ()+sendParserHighlighting =+ do ist <- getIState+ let hs = map unwrap . nub . map wrap $ idris_parserHighlights ist+ sendHighlighting hs+ ist <- getIState+ putIState ist {idris_parserHighlights = []}+ where wrap (fc, a) = (FC' fc, a)+ unwrap (fc', a) = (unwrapFC fc', a)+ sendHighlighting :: [(FC, OutputAnnotation)] -> Idris () sendHighlighting highlights = do ist <- getIState case idris_outputmode ist of- RawOutput _ -> return ()+ RawOutput _ -> updateIState $+ \ist -> ist { idris_highlightedRegions =+ highlights ++ idris_highlightedRegions ist } IdeMode n h -> let fancier = [ toSExp (fc, fancifyAnnots ist False annot) | (fc, annot) <- highlights, fullFC fc@@ -213,7 +239,21 @@ where fullFC (FC _ _ _) = True fullFC _ = False +-- | Write the highlighting information to a file, for use in external tools+-- or in editors that don't support the IDE protocol+writeHighlights :: FilePath -> Idris ()+writeHighlights f =+ do ist <- getIState+ let hs = reverse $ idris_highlightedRegions ist+ let hfile = replaceExtension f "idh"+ let annots = toSExp [ (fc, fancifyAnnots ist False annot)+ | (fc@(FC _ _ _), annot) <- hs+ ]+ runIO $ writeFile hfile $ sExpToString annots +clearHighlights :: Idris ()+clearHighlights = updateIState $ \ist -> ist { idris_highlightedRegions = [] }+ renderExternal :: OutputFmt -> Int -> Doc OutputAnnotation -> Idris String renderExternal fmt width doc | width < 1 = throwError . Msg $ "There must be at least one column for the pretty-printer."@@ -256,6 +296,10 @@ decorate HTMLOutput (AnnSearchResult _) = id decorate HTMLOutput (AnnErr _) = id decorate HTMLOutput (AnnNamespace _ _) = id+ decorate HTMLOutput (AnnLink url) =+ \txt -> "<a href=\"" ++ url ++ "\">" ++ txt ++ "</a>"+ decorate HTMLOutput AnnQuasiquote = id+ decorate HTMLOutput AnnAntiquote = id decorate LaTeXOutput (AnnName _ (Just TypeOutput) _ _) = latex "IdrisType"@@ -284,6 +328,9 @@ decorate LaTeXOutput (AnnSearchResult _) = id decorate LaTeXOutput (AnnErr _) = id decorate LaTeXOutput (AnnNamespace _ _) = id+ decorate LaTeXOutput (AnnLink url) = (++ "(\\url{" ++ url ++ "})")+ decorate LaTeXOutput AnnQuasiquote = id+ decorate LaTeXOutput AnnAntiquote = id tag cls docs str = "<span class=\""++cls++"\""++title++">" ++ str ++ "</span>" where title = maybe "" (\d->" title=\"" ++ d ++ "\"") docs
src/Idris/ParseData.hs view
@@ -57,7 +57,7 @@ let tyn = expandNS syn tyn_in let rsyn = syn { syn_namespace = show (nsroot tyn) : syn_namespace syn }- params <- manyTill (recordParameter rsyn) (reserved "where")+ params <- manyTill (recordParameter rsyn) (reservedHL "where") (fields, cname, cdoc) <- indentedBlockS $ recordBody rsyn tyn case cname of Just cn' -> accData acc tyn [fst cn']@@ -86,28 +86,29 @@ let constructorDoc' = annotate syn ist constructorDoc - fields <- many . indented $ field syn+ fields <- many . indented $ fieldLine syn - return (fields, constructorName, constructorDoc')+ return (concat fields, constructorName, constructorDoc') where- field :: SyntaxInfo -> IdrisParser ((Maybe (Name, FC)), Plicity, PTerm, Maybe (Docstring (Either Err PTerm)))- field syn = do doc <- optional docComment- c <- optional $ lchar '{'- n <- (do (n, nfc) <- fnName- return $ Just (expandNS syn n, nfc))- <|> (do symbol "_"- return Nothing)- lchar ':'- t <- typeExpr (allowImp syn)- p <- endPlicity c- ist <- get- let doc' = case doc of -- Temp: Throws away any possible arg docs- Just (d,_) -> Just $ annotate syn ist d- Nothing -> Nothing- return (n, p, t, doc')+ fieldLine :: SyntaxInfo -> IdrisParser [(Maybe (Name, FC), Plicity, PTerm, Maybe (Docstring (Either Err PTerm)))]+ fieldLine syn = do+ doc <- optional docComment+ c <- optional $ lchar '{'+ let oneName = (do (n, nfc) <- fnName+ return $ Just (expandNS syn n, nfc))+ <|> (symbol "_" >> return Nothing)+ ns <- commaSeparated oneName+ lchar ':'+ t <- typeExpr (allowImp syn)+ p <- endPlicity c+ ist <- get+ let doc' = case doc of -- Temp: Throws away any possible arg docs+ Just (d,_) -> Just $ annotate syn ist d+ Nothing -> Nothing+ return $ map (\n -> (n, p, t, doc')) ns constructor :: IdrisParser (Name, FC)- constructor = (reserved "constructor") *> fnName+ constructor = (reservedHL "constructor") *> fnName endPlicity :: Maybe Char -> IdrisParser Plicity@@ -144,12 +145,12 @@ DataI ::= 'data' | 'codata'; -} dataI :: IdrisParser DataOpts-dataI = do reserved "data"; return []- <|> do reserved "codata"; return [Codata]+dataI = do reservedHL "data"; return []+ <|> do reservedHL "codata"; return [Codata] recordI :: IdrisParser DataOpts-recordI = do reserved "record"; return []- <|> do reserved "corecord"; return [Codata]+recordI = do reservedHL "record"; return []+ <|> do reservedHL "corecord"; return [Codata] {- | Parses if a data should not have a default eliminator DefaultEliminator ::= 'noelim'?@@ -197,7 +198,7 @@ ty <- typeExpr (allowImp syn) let tyn = expandNS syn tyn_in option (PData doc argDocs syn fc dataOpts (PLaterdecl tyn nfc ty)) (do- reserved "where"+ reservedHL "where" cons <- indentedBlock (constructor syn) accData acc tyn (map (\ (_, _, n, _, _, _, _) -> n) cons) return $ PData doc argDocs syn fc dataOpts (PDatadecl tyn nfc ty cons))) <|> (do@@ -205,7 +206,7 @@ let ty = bindArgs (map (const (PType fc)) args) (PType fc) let tyn = expandNS syn tyn_in option (PData doc argDocs syn fc dataOpts (PLaterdecl tyn nfc ty)) (do- try (lchar '=') <|> do reserved "where"+ try (lchar '=') <|> do reservedHL "where" let kw = (if DefaultEliminator `elem` dataOpts then "%elim" else "") ++ (if Codata `elem` dataOpts then "co" else "") ++ "data " let n = show tyn_in ++ " " let s = kw ++ n@@ -218,7 +219,7 @@ fail $ fixErrorMsg "unexpected \"where\"" [fix1, fix2, fix3] cons <- sepBy1 (simpleConstructor syn) (reservedOp "|") terminator- let conty = mkPApp fc (PRef fc tyn) (map (PRef fc) args)+ let conty = mkPApp fc (PRef fc [] tyn) (map (PRef fc []) args) cons' <- mapM (\ (doc, argDocs, x, xfc, cargs, cfc, fs) -> do let cty = bindArgs cargs conty return (doc, argDocs, x, xfc, cty, cfc, fs)) cons@@ -276,7 +277,7 @@ DSL ::= 'dsl' FnName OpenBlock Overload'+ CloseBlock; -} dsl :: SyntaxInfo -> IdrisParser PDecl-dsl syn = do reserved "dsl"+dsl syn = do reservedHL "dsl" n <- fst <$> fnName bs <- indentedBlock (overload syn) let dsl = mkDSL bs (dsl_info syn)@@ -314,11 +315,12 @@ Overload ::= OverloadIdentifier '=' Expr; -} overload :: SyntaxInfo -> IdrisParser (String, PTerm)-overload syn = do o <- (fst <$> identifier) <|> do reserved "let"- return "let"+overload syn = do (o, fc) <- identifier <|> do fc <- reservedFC "let"+ return ("let", fc) if o `notElem` overloadable then fail $ show o ++ " is not an overloading" else do+ highlightP fc AnnKeyword lchar '=' t <- expr syn return (o, t)
src/Idris/ParseExpr.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE GeneralizedNewtypeDeriving, ConstraintKinds, PatternGuards #-}+{-# LANGUAGE GeneralizedNewtypeDeriving, ConstraintKinds, PatternGuards, TupleSections #-} module Idris.ParseExpr where import Prelude hiding (pi)@@ -91,8 +91,18 @@ {- | Parses a user-defined expression -} externalExpr :: SyntaxInfo -> IdrisParser PTerm externalExpr syn = do i <- get- extensions syn (syntaxRulesList $ syntax_rules i)+ (FC fn start _) <- getFC+ expr <- extensions syn (syntaxRulesList $ syntax_rules i)+ (FC _ _ end) <- getFC+ let outerFC = FC fn start end+ return (mapPTermFC (fixFC outerFC) (fixFCH fn outerFC) expr) <?> "user-defined expression"+ where -- Fix non-highlighting FCs by approximating with the span of the syntax application+ fixFC outer inner | inner `fcIn` outer = inner+ | otherwise = outer+ -- Fix highlighting FCs by making them useless, to avoid spurious highlights+ fixFCH fn outer inner | inner `fcIn` outer = inner+ | otherwise = FileFC fn {- | Parses a simple user-defined expression -} simpleExternalExpr :: SyntaxInfo -> IdrisParser PTerm@@ -118,8 +128,10 @@ isValid (Rule _ _ AnySyntax) = True isValid (Rule _ _ PatternSyntax) = inPattern syn isValid (Rule _ _ TermSyntax) = not (inPattern syn)+ isValid (DeclRule _ _) = False -data SynMatch = SynTm PTerm | SynBind Name+data SynMatch = SynTm PTerm | SynBind FC Name -- ^ the FC is for highlighting information+ deriving Show extension :: SyntaxInfo -> [Maybe (Name, SynMatch)] -> [Syntax] -> IdrisParser PTerm extension syn ns rules =@@ -130,79 +142,122 @@ extension syn (n : ns) [Rule ss t ctx | (Rule (_:ss) t ctx) <- rs] -- If we have more than one Rule in this bucket, our grammar is -- nondeterministic.- Rule [] ptm _ -> return (flatten (update (mapMaybe id ns) ptm))+ Rule [] ptm _ -> return (flatten (updateSynMatch (mapMaybe id ns) ptm)) where ruleGroup [] [] = True ruleGroup (s1:_) (s2:_) = s1 == s2 ruleGroup _ _ = False extensionSymbol :: SSymbol -> IdrisParser (Maybe (Name, SynMatch))- extensionSymbol (Keyword n) = do reserved (show n); return Nothing+ extensionSymbol (Keyword n) = do fc <- reservedFC (show n)+ highlightP fc AnnKeyword+ return Nothing extensionSymbol (Expr n) = do tm <- expr syn return $ Just (n, SynTm tm) extensionSymbol (SimpleExpr n) = do tm <- simpleExpr syn return $ Just (n, SynTm tm)- extensionSymbol (Binding n) = do b <- fst <$> name- return $ Just (n, SynBind b)- extensionSymbol (Symbol s) = do symbol s+ extensionSymbol (Binding n) = do (b, fc) <- name+ return $ Just (n, SynBind fc b)+ extensionSymbol (Symbol s) = do fc <- symbolFC s+ highlightP fc AnnKeyword return Nothing- dropn :: Name -> [(Name, a)] -> [(Name, a)]- dropn n [] = []- dropn n ((x,t) : xs) | n == x = xs- | otherwise = (x,t):dropn n xs-+ flatten :: PTerm -> PTerm -- flatten application flatten (PApp fc (PApp _ f as) bs) = flatten (PApp fc f (as ++ bs)) flatten t = t - updateB :: [(Name, SynMatch)] -> Name -> Name- updateB ns n = case lookup n ns of- Just (SynBind t) -> t- _ -> n+updateSynMatch = update+ where+ updateB :: [(Name, SynMatch)] -> (Name, FC) -> (Name, FC)+ updateB ns (n, fc) = case lookup n ns of+ Just (SynBind tfc t) -> (t, tfc)+ _ -> (n, fc) update :: [(Name, SynMatch)] -> PTerm -> PTerm- update ns (PRef fc n) = case lookup n ns of- Just (SynTm t) -> t- _ -> PRef fc n+ update ns (PRef fc hls n) = case lookup n ns of+ Just (SynTm t) -> t+ _ -> PRef fc hls n+ update ns (PPatvar fc n) = uncurry (flip PPatvar) $ updateB ns (n, fc) update ns (PLam fc n nfc ty sc)- = PLam fc (updateB ns n) nfc (update ns ty) (update (dropn n ns) sc)+ = let (n', nfc') = updateB ns (n, nfc)+ in PLam fc n' nfc' (update ns ty) (update (dropn n ns) sc) update ns (PPi p n fc ty sc)- = PPi (updTacImp ns p) (updateB ns n) fc- (update ns ty) (update (dropn n ns) sc)- update ns (PLet fc n nfc ty val sc) - = PLet fc (updateB ns n) nfc (update ns ty)- (update ns val) (update (dropn n ns) sc)+ = let (n', nfc') = updateB ns (n, fc)+ in PPi (updTacImp ns p) n' nfc'+ (update ns ty) (update (dropn n ns) sc)+ update ns (PLet fc n nfc ty val sc)+ = let (n', nfc') = updateB ns (n, nfc)+ in PLet fc n' nfc' (update ns ty)+ (update ns val) (update (dropn n ns) sc) update ns (PApp fc t args) = PApp fc (update ns t) (map (fmap (update ns)) args) update ns (PAppBind fc t args) = PAppBind fc (update ns t) (map (fmap (update ns)) args)- update ns (PCase fc c opts)- = PCase fc (update ns c) (map (pmap (update ns)) opts)+ update ns (PMatchApp fc n) = let (n', nfc') = updateB ns (n, fc)+ in PMatchApp nfc' n' update ns (PIfThenElse fc c t f) = PIfThenElse fc (update ns c) (update ns t) (update ns f)- update ns (PPair fc p l r) = PPair fc p (update ns l) (update ns r)- update ns (PDPair fc p l t r)- = PDPair fc p (update ns l) (update ns t) (update ns r)- update ns (PAlternative a as) = PAlternative a (map (update ns) as)+ update ns (PCase fc c opts)+ = PCase fc (update ns c) (map (pmap (update ns)) opts)+ update ns (PRewrite fc eq tm mty)+ = PRewrite fc (update ns eq) (update ns tm) (fmap (update ns) mty)+ update ns (PPair fc hls p l r) = PPair fc hls p (update ns l) (update ns r)+ update ns (PDPair fc hls p l t r)+ = PDPair fc hls p (update ns l) (update ns t) (update ns r)+ update ns (PAs fc n t) = PAs fc (fst $ updateB ns (n, NoFC)) (update ns t)+ update ns (PAlternative ms a as) = PAlternative ms a (map (update ns) as) update ns (PHidden t) = PHidden (update ns t)- update ns (PDoBlock ds) = PDoBlock $ upd ns ds- where upd :: [(Name, SynMatch)] -> [PDo] -> [PDo]- upd ns (DoExp fc t : ds) = DoExp fc (update ns t) : upd ns ds- upd ns (DoBind fc n nfc t : ds) = DoBind fc n nfc (update ns t) : upd (dropn n ns) ds- upd ns (DoLet fc n nfc ty t : ds) = DoLet fc n nfc (update ns ty) (update ns t)- : upd (dropn n ns) ds- upd ns (DoBindP fc i t ts : ds) - = DoBindP fc (update ns i) (update ns t) - (map (\(l,r) -> (update ns l, update ns r)) ts)- : upd ns ds- upd ns (DoLetP fc i t : ds) = DoLetP fc (update ns i) (update ns t)- : upd ns ds update ns (PGoal fc r n sc) = PGoal fc (update ns r) n (update ns sc)+ update ns (PDoBlock ds) = PDoBlock $ map (upd ns) ds+ where upd :: [(Name, SynMatch)] -> PDo -> PDo+ upd ns (DoExp fc t) = DoExp fc (update ns t)+ upd ns (DoBind fc n nfc t) = DoBind fc n nfc (update ns t)+ upd ns (DoLet fc n nfc ty t) = DoLet fc n nfc (update ns ty) (update ns t)+ upd ns (DoBindP fc i t ts)+ = DoBindP fc (update ns i) (update ns t)+ (map (\(l,r) -> (update ns l, update ns r)) ts)+ upd ns (DoLetP fc i t) = DoLetP fc (update ns i) (update ns t)+ update ns (PIdiom fc t) = PIdiom fc $ update ns t+ update ns (PMetavar fc n) = uncurry (flip PMetavar) $ updateB ns (n, fc)+ update ns (PProof tacs) = PProof $ map (updTactic ns) tacs+ update ns (PTactics tacs) = PTactics $ map (updTactic ns) tacs+ update ns (PDisamb nsps t) = PDisamb nsps $ update ns t+ update ns (PUnifyLog t) = PUnifyLog $ update ns t+ update ns (PNoImplicits t) = PNoImplicits $ update ns t+ update ns (PQuasiquote tm mty) = PQuasiquote (update ns tm) (fmap (update ns) mty)+ update ns (PUnquote t) = PUnquote $ update ns t+ update ns (PQuoteName n fc) = uncurry PQuoteName (updateB ns (n, fc))+ update ns (PRunElab fc t nsp) = PRunElab fc (update ns t) nsp+ update ns (PConstSugar fc t) = PConstSugar fc $ update ns t+ -- PConstSugar probably can't contain anything substitutable, but it's hard to track update ns t = t + updTactic :: [(Name, SynMatch)] -> PTactic -> PTactic+ -- handle all the ones with Names explicitly, then use fmap for the rest with PTerms+ updTactic ns (Intro ns') = Intro $ map (fst . updateB ns . (, NoFC)) ns'+ updTactic ns (Focus n) = Focus . fst $ updateB ns (n, NoFC)+ updTactic ns (Refine n bs) = Refine (fst $ updateB ns (n, NoFC)) bs+ updTactic ns (Claim n t) = Claim (fst $ updateB ns (n, NoFC)) (update ns t)+ updTactic ns (MatchRefine n) = MatchRefine (fst $ updateB ns (n, NoFC))+ updTactic ns (LetTac n t) = LetTac (fst $ updateB ns (n, NoFC)) (update ns t)+ updTactic ns (LetTacTy n ty tm) = LetTacTy (fst $ updateB ns (n, NoFC)) (update ns ty) (update ns tm)+ updTactic ns (ProofSearch rec prover depth top psns hints) = ProofSearch rec prover depth+ (fmap (fst . updateB ns . (, NoFC)) top) (map (fst . updateB ns . (, NoFC)) psns) (map (fst . updateB ns . (, NoFC)) hints)+ updTactic ns (Try l r) = Try (updTactic ns l) (updTactic ns r)+ updTactic ns (TSeq l r) = TSeq (updTactic ns l) (updTactic ns r)+ updTactic ns (GoalType s tac) = GoalType s $ updTactic ns tac+ updTactic ns (TDocStr (Left n)) = TDocStr . Left . fst $ updateB ns (n, NoFC)+ updTactic ns t = fmap (update ns) t+ updTacImp ns (TacImp o st scr) = TacImp o st (update ns scr) updTacImp _ x = x+ + dropn :: Name -> [(Name, a)] -> [(Name, a)]+ dropn n [] = []+ dropn n ((x,t) : xs) | n == x = xs+ | otherwise = (x,t):dropn n xs + {- | Parses a (normal) built-in expression @ InternalExpr ::=@@ -243,7 +298,9 @@ @ -} impossible :: IdrisParser PTerm-impossible = PImpossible <$ reserved "impossible"+impossible = do fc <- reservedFC "impossible"+ highlightP fc AnnKeyword+ return PImpossible {- | Parses a case expression @@@ -252,9 +309,11 @@ @ -} caseExpr :: SyntaxInfo -> IdrisParser PTerm-caseExpr syn = do reserved "case"; fc <- getFC- scr <- expr syn; reserved "of";+caseExpr syn = do kw1 <- reservedFC "case"; fc <- getFC+ scr <- expr syn; kw2 <- reservedFC "of"; opts <- indentedBlock1 (caseOption syn)+ highlightP kw1 AnnKeyword+ highlightP kw2 AnnKeyword return (PCase fc scr opts) <?> "case expression" @@ -279,8 +338,9 @@ @ -} proofExpr :: SyntaxInfo -> IdrisParser PTerm-proofExpr syn = do reserved "proof"+proofExpr syn = do kw <- reservedFC "proof" ts <- indentedBlock1 (tactic syn)+ highlightP kw AnnKeyword return $ PProof ts <?> "proof block" @@ -292,8 +352,9 @@ @ -} tacticsExpr :: SyntaxInfo -> IdrisParser PTerm-tacticsExpr syn = do reserved "tactics"+tacticsExpr syn = do kw <- reservedFC "tactics" ts <- indentedBlock1 (tactic syn)+ highlightP kw AnnKeyword return $ PTactics ts <?> "tactics block" @@ -327,7 +388,7 @@ <|> do (x, FC f (l, c) end) <- try (lchar '?' *> name) return (PMetavar (FC f (l, c-1) end) x) <|> do lchar '%'; fc <- getFC; reserved "instance"; return (PResolveTC fc)- <|> do reserved "elim_for"; fc <- getFC; t <- fst <$> fnName; return (PRef fc (SN $ ElimN t))+ <|> do reserved "elim_for"; fc <- getFC; t <- fst <$> fnName; return (PRef fc [] (SN $ ElimN t)) <|> proofExpr syn <|> tacticsExpr syn <|> try (do reserved "Type"; symbol "*"; return $ PUniverse AllTypes)@@ -339,16 +400,16 @@ fc <- getFC return (modifyConst syn fc (PConstant cfc c)) <|> do symbol "'"; fc <- getFC; str <- fst <$> name- return (PApp fc (PRef fc (sUN "Symbol_"))+ return (PApp fc (PRef fc [] (sUN "Symbol_")) [pexp (PConstant NoFC (Str (show str)))]) <|> do (x, fc) <- fnName if inPattern syn- then option (PRef fc x)+ then option (PRef fc [fc] x) (do reservedOp "@" s <- simpleExpr syn fcIn <- getFC return (PAs fcIn x s))- else return (PRef fc x)+ else return (PRef fc [fc] x) <|> idiom syn <|> listExpr syn <|> alt syn@@ -369,9 +430,9 @@ @ -} bracketed :: SyntaxInfo -> IdrisParser PTerm-bracketed syn = do fc <- getFC+bracketed syn = do (FC fn (sl, sc) _) <- getFC lchar '(' <?> "parenthesized expression"- bracketed' fc syn+ bracketed' (FC fn (sl, sc) (sl, sc+1)) syn {- |Parses the rest of an expression in braces @ Bracketed' ::=@@ -390,52 +451,52 @@ do (FC f start (l, c)) <- getFC lchar ')' return $ PTrue (spanFC open (FC f start (l, c+1))) TypeOrTerm- <|> try (do ln <- fst <$> name; lchar ':';+ <|> try (do (ln, lnfc) <- name+ colonFC <- lcharFC ':' lty <- expr syn- reservedOp "**"+ starsFC <- reservedOpFC "**" fc <- getFC r <- expr syn- lchar ')'- return (PDPair fc TypeOrTerm (PRef fc ln) lty r))+ close <- lcharFC ')'+ return (PDPair fc [open, colonFC, starsFC, close] TypeOrTerm (PRef lnfc [] ln) lty r)) <|> try (do fc <- getFC; o <- operator; e <- expr syn; lchar ')' -- No prefix operators! (bit of a hack here...) if (o == "-" || o == "!") then fail "minus not allowed in section" else return $ PLam fc (sMN 1000 "ARG") NoFC Placeholder- (PApp fc (PRef fc (sUN o)) [pexp (PRef fc (sMN 1000 "ARG")),- pexp e]))+ (PApp fc (PRef fc [] (sUN o)) [pexp (PRef fc [] (sMN 1000 "ARG")),+ pexp e])) <|> try (do l <- simpleExpr syn op <- option Nothing (do o <- operator lchar ')' return (Just o)) fc0 <- getFC case op of- Nothing -> bracketedExpr syn l+ Nothing -> bracketedExpr syn open l Just o -> return $ PLam fc0 (sMN 1000 "ARG") NoFC Placeholder- (PApp fc0 (PRef fc0 (sUN o)) [pexp l,- pexp (PRef fc0 (sMN 1000 "ARG"))]))+ (PApp fc0 (PRef fc0 [] (sUN o)) [pexp l,+ pexp (PRef fc0 [] (sMN 1000 "ARG"))])) <|> do l <- expr syn- bracketedExpr syn l+ bracketedExpr syn open l -bracketedExpr :: SyntaxInfo -> PTerm -> IdrisParser PTerm-bracketedExpr syn e =+-- | Parse the contents of parentheses, after an expression has been parsed.+bracketedExpr :: SyntaxInfo -> FC -> PTerm -> IdrisParser PTerm+bracketedExpr syn openParenFC e = do lchar ')'; return e- <|> do fc <- do fc <- getFC- lchar ','- return fc- rs <- sepBy1 (do fc' <- getFC; r <- expr syn; return (r, fc')) (lchar ',')- lchar ')'- return $ PPair fc TypeOrTerm e (mergePairs rs)- <|> do fc <- do fc <- getFC- reservedOp "**"- return fc+ <|> do exprs <- many (do comma <- lcharFC ','+ r <- expr syn+ return (r, comma))+ closeParenFC <- lcharFC ')'+ let hilite = [openParenFC, closeParenFC] ++ map snd exprs+ return $ PPair openParenFC hilite TypeOrTerm e (mergePairs exprs)+ <|> do starsFC <- reservedOpFC "**" r <- expr syn- lchar ')'- return (PDPair fc TypeOrTerm e Placeholder r)+ closeParenFC <- lcharFC ')'+ return (PDPair starsFC [openParenFC, starsFC, closeParenFC] TypeOrTerm e Placeholder r) <?> "end of bracketed expression" where mergePairs :: [(PTerm, FC)] -> PTerm mergePairs [(t, fc)] = t- mergePairs ((t, fc):rs) = PPair fc TypeOrTerm t (mergePairs rs)+ mergePairs ((t, fc):rs) = PPair fc [] TypeOrTerm t (mergePairs rs) -- bit of a hack here. If the integer doesn't fit in an Int, treat it as a -- big integer, otherwise try fromInteger and the constants as alternatives.@@ -445,10 +506,12 @@ modifyConst :: SyntaxInfo -> FC -> PTerm -> PTerm modifyConst syn fc (PConstant inFC (BI x)) | not (inPattern syn)- = PAlternative FirstSuccess- (PApp fc (PRef fc (sUN "fromInteger")) [pexp (PConstant NoFC (BI (fromInteger x)))]- : consts)- | otherwise = PAlternative FirstSuccess consts+ = PConstSugar inFC $ -- wrap in original location for highlighting+ PAlternative [] FirstSuccess+ (PApp fc (PRef fc [] (sUN "fromInteger")) [pexp (PConstant NoFC (BI (fromInteger x)))]+ : consts)+ | otherwise = PConstSugar inFC $+ PAlternative [] FirstSuccess consts where consts = [ PConstant inFC (BI x) , PConstant inFC (I (fromInteger x))@@ -471,7 +534,7 @@ -} alt :: SyntaxInfo -> IdrisParser PTerm alt syn = do symbol "(|"; alts <- sepBy1 (expr' syn) (lchar ','); symbol "|)"- return (PAlternative FirstSuccess alts)+ return (PAlternative [] FirstSuccess alts) {- | Parses a possibly hidden simple expression @@@ -495,8 +558,9 @@ ; -} unifyLog :: SyntaxInfo -> IdrisParser PTerm-unifyLog syn = do try (lchar '%' *> reserved "unifyLog")+unifyLog syn = do (FC fn (sl, sc) kwEnd) <- try (lchar '%' *> reservedFC "unifyLog") tm <- simpleExpr syn+ highlightP (FC fn (sl, sc-1) kwEnd) AnnKeyword return (PUnifyLog tm) <?> "unification log expression" @@ -506,11 +570,11 @@ ; -} runElab :: SyntaxInfo -> IdrisParser PTerm-runElab syn = do try (lchar '%' *> reserved "runElab")+runElab syn = do (FC fn (sl, sc) kwEnd) <- try (lchar '%' *> reservedFC "runElab") fc <- getFC tm <- simpleExpr syn- i <- get- return $ PRunElab fc tm+ highlightP (FC fn (sl, sc-1) kwEnd) AnnKeyword+ return $ PRunElab fc tm (syn_namespace syn) <?> "new-style tactics expression" {- | Parses a disambiguation expression @@ -519,11 +583,12 @@ ; -} disamb :: SyntaxInfo -> IdrisParser PTerm-disamb syn = do reserved "with";+disamb syn = do kw <- reservedFC "with" ns <- sepBy1 (fst <$> name) (lchar ',') tm <- expr' syn+ highlightP kw AnnKeyword return (PDisamb (map tons ns) tm)- <?> "unification log expression"+ <?> "namespace disambiguation expression" where tons (NS n s) = txt (show n) : s tons n = [txt (show n)] {- | Parses a no implicits expression@@ -559,16 +624,29 @@ return (PLet fc (sMN 0 "match") NoFC f (PMatchApp fc ff)- (PRef fc (sMN 0 "match")))+ (PRef fc [] (sMN 0 "match"))) <?> "matching application expression") <|> (do fc <- getFC i <- get args <- many (do notEndApp; arg syn) case args of [] -> return f- _ -> return (PApp fc f args))+ _ -> return (flattenFromInt fc f args)) <?> "function application"+ where+ -- bit of a hack to deal with the situation where we're applying a+ -- literal to an argument, which we may want for obscure applications+ -- of fromInteger, and this will help disambiguate better.+ -- We know, at least, it won't be one of the constants!+ flattenFromInt fc (PAlternative _ x alts) args+ | Just i <- getFromInt alts+ = PApp fc (PRef fc [] (sUN "fromInteger")) (i : args)+ flattenFromInt fc f args = PApp fc f args + getFromInt ((PApp _ (PRef _ _ n) [a]) : _) | n == sUN "fromInteger" = Just a+ getFromInt (_ : xs) = getFromInt xs+ getFromInt _ = Nothing+ {-| Parses a function argument @ Arg ::=@@ -594,10 +672,10 @@ -} implicitArg :: SyntaxInfo -> IdrisParser PArg implicitArg syn = do lchar '{'- n <- fst <$> name+ (n, nfc) <- name fc <- getFC- v <- option (PRef fc n) (do lchar '='- expr syn)+ v <- option (PRef nfc [nfc] n) (do lchar '='+ expr syn) lchar '}' return (pimp n v True) <?> "implicit function argument"@@ -622,14 +700,19 @@ -} quasiquote :: SyntaxInfo -> IdrisParser PTerm-quasiquote syn = do symbol "`("+quasiquote syn = do startFC <- symbolFC "`(" e <- expr syn { syn_in_quasiquote = (syn_in_quasiquote syn) + 1 , inPattern = False }- g <- optional $ do- symbol ":"- expr syn { inPattern = False } -- don't allow antiquotes- symbol ")"- return $ PQuasiquote e g+ g <- optional $+ do fc <- symbolFC ":"+ ty <- expr syn { inPattern = False } -- don't allow antiquotes+ return (ty, fc)+ endFC <- symbolFC ")"+ mapM_ (uncurry highlightP) [(startFC, AnnKeyword), (endFC, AnnKeyword), (spanFC startFC endFC, AnnQuasiquote)]+ case g of+ Just (_, fc) -> highlightP fc AnnKeyword+ _ -> return ()+ return $ PQuasiquote e (fst <$> g) <?> "quasiquotation" {-| Parses an unquoting inside a quasiquotation (for building reflected terms using the elaborator)@@ -639,8 +722,11 @@ -} unquote :: SyntaxInfo -> IdrisParser PTerm unquote syn = do guard (syn_in_quasiquote syn > 0)- symbol "~"+ startFC <- symbolFC "~" e <- simpleExpr syn { syn_in_quasiquote = syn_in_quasiquote syn - 1 }+ endFC <- getFC+ highlightP startFC AnnKeyword+ highlightP (spanFC startFC endFC) AnnAntiquote return $ PUnquote e <?> "unquotation" @@ -650,10 +736,15 @@ -} namequote :: SyntaxInfo -> IdrisParser PTerm-namequote syn = do symbol "`{"- n <- fst <$> fnName- symbol "}"- return $ PQuoteName n+namequote syn = do startFC <- symbolFC "`{"+ (n, nfc) <- fnName+ endFC <- symbolFC "}"+ mapM_ (uncurry highlightP)+ [ (startFC, AnnKeyword)+ , (endFC, AnnKeyword)+ , (spanFC startFC endFC, AnnQuasiquote)+ ]+ return $ PQuoteName n nfc <?> "quoted name" @@ -676,25 +767,26 @@ -} recordType :: SyntaxInfo -> IdrisParser PTerm recordType syn =- do reserved "record"+ do kw <- reservedFC "record" lchar '{' fgs <- fieldGetOrSet lchar '}' fc <- getFC rec <- optional (simpleExpr syn)+ highlightP kw AnnKeyword case fgs of Left fields -> case rec of Nothing -> return (PLam fc (sMN 0 "fldx") NoFC Placeholder- (applyAll fc fields (PRef fc (sMN 0 "fldx"))))+ (applyAll fc fields (PRef fc [] (sMN 0 "fldx")))) Just v -> return (applyAll fc fields v) Right fields -> case rec of Nothing -> return (PLam fc (sMN 0 "fldx") NoFC Placeholder- (getAll fc (reverse fields) - (PRef fc (sMN 0 "fldx"))))+ (getAll fc (reverse fields)+ (PRef fc [] (sMN 0 "fldx")))) Just v -> return (getAll fc (reverse fields) v) <?> "record setting expression"@@ -718,17 +810,17 @@ applyAll fc [] x = x applyAll fc ((ns, e) : es) x = applyAll fc es (doUpdate fc ns e x)- + doUpdate fc [n] e get- = PApp fc (PRef fc (mkType n)) [pexp e, pexp get]+ = PApp fc (PRef fc [] (mkType n)) [pexp e, pexp get] doUpdate fc (n : ns) e get- = PApp fc (PRef fc (mkType n)) - [pexp (doUpdate fc ns e (PApp fc (PRef fc n) [pexp get])), + = PApp fc (PRef fc [] (mkType n))+ [pexp (doUpdate fc ns e (PApp fc (PRef fc [] n) [pexp get])), pexp get] getAll :: FC -> [Name] -> PTerm -> PTerm- getAll fc [n] e = PApp fc (PRef fc n) [pexp e]- getAll fc (n:ns) e = PApp fc (PRef fc n) [pexp (getAll fc ns e)]+ getAll fc [n] e = PApp fc (PRef fc [] n) [pexp e]+ getAll fc (n:ns) e = PApp fc (PRef fc [] n) [pexp (getAll fc ns e)] -- | Creates setters for record types on necessary functions@@ -790,7 +882,7 @@ pmList [] sc = sc pmList ((i, (fc, x)) : xs) sc = PLam fc (sMN i "lamp") NoFC Placeholder- (PCase fc (PRef fc (sMN i "lamp"))+ (PCase fc (PRef fc [] (sMN i "lamp")) [(x, pmList xs sc)]) lambdaTail :: IdrisParser PTerm lambdaTail = impossible <|> symbol "=>" *> expr syn@@ -803,13 +895,15 @@ @ -} rewriteTerm :: SyntaxInfo -> IdrisParser PTerm-rewriteTerm syn = do reserved "rewrite"+rewriteTerm syn = do kw <- reservedFC "rewrite" fc <- getFC prf <- expr syn giving <- optional (do symbol "==>"; expr' syn)- reserved "in"; sc <- expr syn+ kw' <- reservedFC "in"; sc <- expr syn+ highlightP kw AnnKeyword+ highlightP kw' AnnKeyword return (PRewrite fc- (PApp fc (PRef fc (sUN "sym")) [pexp prf]) sc+ (PApp fc (PRef fc [] (sUN "sym")) [pexp prf]) sc giving) <?> "term rewrite expression" @@ -825,13 +919,14 @@ @ -} let_ :: SyntaxInfo -> IdrisParser PTerm-let_ syn = try (do reserved "let"+let_ syn = try (do kw <- reservedFC "let" ls <- indentedBlock (let_binding syn)- reserved "in"; sc <- expr syn+ kw' <- reservedFC "in"; sc <- expr syn+ highlightP kw AnnKeyword; highlightP kw' AnnKeyword return (buildLets ls sc)) <?> "let binding" where buildLets [] sc = sc- buildLets ((fc, PRef nfc n, ty, v, []) : ls) sc+ buildLets ((fc, PRef nfc _ n, ty, v, []) : ls) sc = PLet fc n nfc ty v (buildLets ls sc) buildLets ((fc, pat, ty, v, alts) : ls) sc = PCase fc v ((pat, buildLets ls sc) : alts)@@ -852,13 +947,14 @@ -} if_ :: SyntaxInfo -> IdrisParser PTerm-if_ syn = (do reserved "if"+if_ syn = (do ifFC <- reservedFC "if" fc <- getFC c <- expr syn- reserved "then"+ thenFC <- reservedFC "then" t <- expr syn- reserved "else"+ elseFC <- reservedFC "else" f <- expr syn+ mapM_ (flip highlightP AnnKeyword) [ifFC, thenFC, elseFC] return (PIfThenElse fc c t f)) <?> "conditional expression" @@ -872,12 +968,13 @@ @ -} quoteGoal :: SyntaxInfo -> IdrisParser PTerm-quoteGoal syn = do reserved "quoteGoal"; n <- fst <$> name;- reserved "by"+quoteGoal syn = do kw1 <- reservedFC "quoteGoal"; n <- fst <$> name;+ kw2 <- reservedFC "by" r <- expr syn- reserved "in"+ kw3 <- reservedFC "in" fc <- getFC sc <- expr syn+ mapM_ (flip highlightP AnnKeyword) [kw1, kw2, kw3] return (PGoal fc r n sc) <?> "quote goal expression" @@ -909,17 +1006,18 @@ return (bindList (PPi binder) xt sc) autoImplicit opts st syn- = do reserved "auto"+ = do kw <- reservedFC "auto" when (st == Static) $ fail "auto implicits can not be static" xt <- typeDeclList syn lchar '}' symbol "->" sc <- expr syn+ highlightP kw AnnKeyword return (bindList (PPi- (TacImp [] Dynamic (PTactics [ProofSearch True True 100 Nothing []]))) xt sc) + (TacImp [] Dynamic (PTactics [ProofSearch True True 100 Nothing [] []]))) xt sc) defaultImplicit opts st syn = do- reserved "default"+ kw <- reservedFC "default" when (st == Static) $ fail "default implicits can not be static" ist <- get script' <- simpleExpr syn@@ -928,6 +1026,7 @@ lchar '}' symbol "->" sc <- expr syn+ highlightP kw AnnKeyword return (bindList (PPi (TacImp [] Dynamic script)) xt sc) normalImplicit opts st syn = do@@ -1090,20 +1189,26 @@ qs <- sepBy1 (do_ syn) (lchar ',') lchar ']' return (PDoBlock (map addGuard qs ++- [DoExp fc (PApp fc (PRef fc (sUN "return"))+ [DoExp fc (PApp fc (PRef fc [] (sUN "return")) [pexp x])]))) <|>- (do xs <- many ((lchar ',' <?> "list element") *> expr syn)+ (do xs <- many (do (FC fn (sl, sc) _) <- getFC+ lchar ',' <?> "list element"+ let commaFC = FC fn (sl, sc) (sl, sc + 1)+ elt <- expr syn+ return (elt, commaFC))+ (FC fn (sl, sc) _) <- getFC lchar ']' <?> "end of list expression"- return (mkList fc (x:xs))))+ let rbrackFC = FC fn (sl, sc) (sl, sc+1)+ return (mkList fc rbrackFC ((x, (FC f (l, c) (l, c+1))) : xs)))) <?> "list expression" where mkNil :: FC -> PTerm- mkNil fc = PRef fc (sUN "Nil")- mkList :: FC -> [PTerm] -> PTerm- mkList fc [] = PRef NoFC (sUN "Nil")- mkList fc (x : xs) = PApp fc (PRef NoFC (sUN "::")) [pexp x, pexp (mkList fc xs)]+ mkNil fc = PRef fc [fc] (sUN "Nil")+ mkList :: FC -> FC -> [(PTerm, FC)] -> PTerm+ mkList errFC nilFC [] = PRef nilFC [nilFC] (sUN "Nil")+ mkList errFC nilFC ((x, fc) : xs) = PApp errFC (PRef fc [fc] (sUN "::")) [pexp x, pexp (mkList errFC nilFC xs)] addGuard :: PDo -> PDo- addGuard (DoExp fc e) = DoExp fc (PApp fc (PRef fc (sUN "guard"))+ addGuard (DoExp fc e) = DoExp fc (PApp fc (PRef fc [] (sUN "guard")) [pexp e]) addGuard x = x @@ -1120,8 +1225,9 @@ -} doBlock :: SyntaxInfo -> IdrisParser PTerm doBlock syn- = do reserved "do"+ = do kw <- reservedFC "do" ds <- indentedBlock1 (do_ syn)+ highlightP kw AnnKeyword return (PDoBlock ds) <?> "do block" @@ -1138,19 +1244,21 @@ -} do_ :: SyntaxInfo -> IdrisParser PDo do_ syn- = try (do reserved "let"+ = try (do kw <- reservedFC "let" (i, ifc) <- name ty <- option Placeholder (do lchar ':' expr' syn) reservedOp "=" fc <- getFC e <- expr syn+ highlightP kw AnnKeyword return (DoLet fc i ifc ty e))- <|> try (do reserved "let"+ <|> try (do kw <- reservedFC "let" i <- expr' syn reservedOp "=" fc <- getFC sc <- expr syn+ highlightP kw AnnKeyword return (DoLetP fc i sc)) <|> try (do (i, ifc) <- name symbol "<-"@@ -1159,7 +1267,7 @@ option (DoBind fc i ifc e) (do lchar '|' ts <- sepBy1 (do_alt syn) (lchar '|')- return (DoBindP fc (PRef ifc i) e ts)))+ return (DoBindP fc (PRef ifc [ifc] i) e ts))) <|> try (do i <- expr' syn symbol "<-" fc <- getFC@@ -1371,14 +1479,14 @@ , noArgs ["unify"] DoUnify , (["search"], Nothing, const $ do depth <- option 10 $ fst <$> natural- return (ProofSearch True True (fromInteger depth) Nothing []))+ return (ProofSearch True True (fromInteger depth) Nothing [] [])) , noArgs ["instance"] TCInstance , noArgs ["solve"] Solve , noArgs ["attack"] Attack- , noArgs ["state"] ProofState- , noArgs ["term"] ProofTerm- , noArgs ["undo"] Undo- , noArgs ["qed"] Qed+ , noArgs ["state", ":state"] ProofState+ , noArgs ["term", ":term"] ProofTerm+ , noArgs ["undo", ":undo"] Undo+ , noArgs ["qed", ":qed"] Qed , noArgs ["abandon", ":q"] Abandon , noArgs ["skip"] Skip , noArgs ["sourceLocation"] SourceFC
src/Idris/ParseHelpers.hs view
@@ -79,6 +79,10 @@ parseString (runInnerParser (evalStateT p i)) (Directed (UTF8.fromString inputname) 0 0 0 0) +highlightP :: FC -> OutputAnnotation -> IdrisParser ()+highlightP fc annot = do ist <- get+ put ist { idris_parserHighlights = (fc, annot) : idris_parserHighlights ist}+ noDocCommentHere :: String -> IdrisParser () noDocCommentHere msg = optional (do fc <- getFC@@ -256,10 +260,21 @@ lchar :: MonadicParsing m => Char -> m Char lchar = token . char +-- | Parses a character as a token, returning the source span of the character+lcharFC :: MonadicParsing m => Char -> m FC+lcharFC ch = do (FC file (l, c) _) <- getFC+ _ <- token (char ch)+ return $ FC file (l, c) (l, c+1)+ -- | Parses string as a token symbol :: MonadicParsing m => String -> m String symbol = Tok.symbol +symbolFC :: MonadicParsing m => String -> m FC+symbolFC str = do (FC file (l, c) _) <- getFC+ Tok.symbol str+ return $ FC file (l, c) (l, c + length str)+ -- | Parses a reserved identifier reserved :: MonadicParsing m => String -> m () reserved = Tok.reserve idrisStyle@@ -271,6 +286,10 @@ Tok.reserve idrisStyle str return $ FC file (l, c) (l, c + length str) +-- | Parse a reserved identfier, highlighting its span as a keyword+reservedHL :: String -> IdrisParser ()+reservedHL str = reservedFC str >>= flip highlightP AnnKeyword+ -- Taken from Parsec (c) Daan Leijen 1999-2001, (c) Paolo Martini 2007 -- | Parses a reserved operator reservedOp :: MonadicParsing m => String -> m ()@@ -415,6 +434,11 @@ bindList b [] sc = sc bindList b ((n, fc, t):bs) sc = b n fc t (bindList b bs sc) +{- | @commaSeparated p@ parses one or more occurences of `p`,+ separated by commas and optional whitespace. -}+commaSeparated :: MonadicParsing m => m a -> m [a]+commaSeparated p = p `sepBy1` (spaces >> char ',' >> spaces)+ {- * Layout helpers -} -- | Push indentation to stack@@ -426,8 +450,9 @@ -- | Pops indentation from stack popIndent :: IdrisParser () popIndent = do ist <- get- let (x : xs) = indent_stack ist- put (ist { indent_stack = xs })+ case indent_stack ist of+ [] -> error "The impossible happened! Tried to pop an indentation level where none was pushed (underflow)."+ (x : xs) -> put (ist { indent_stack = xs }) -- | Gets current indentation
src/Idris/ParseOps.hs view
@@ -35,11 +35,11 @@ -- using pre-build and user-defined operator/fixity declarations table :: [FixDecl] -> OperatorTable IdrisParser PTerm table fixes- = [[prefix "-" (\fc x -> PApp fc (PRef fc (sUN "negate")) [pexp x])]] +++ = [[prefix "-" (\fc x -> PApp fc (PRef fc [fc] (sUN "negate")) [pexp x])]] ++ toTable (reverse fixes) ++ [[backtick], [binary "$" (\fc x y -> flatten $ PApp fc x [pexp y]) AssocRight],- [binary "=" (\fc x y -> PApp fc (PRef fc eqTy) [pexp x, pexp y]) AssocLeft],+ [binary "=" (\fc x y -> PApp fc (PRef fc [fc] eqTy) [pexp x, pexp y]) AssocLeft], [nofixityoperator]] where flatten :: PTerm -> PTerm -- flatten application@@ -52,9 +52,9 @@ toTable fs = map (map toBin) (groupBy (\ (Fix x _) (Fix y _) -> prec x == prec y) fs) where toBin (Fix (PrefixN _) op) = prefix op- (\fc x -> PApp fc (PRef fc (sUN op)) [pexp x])+ (\fc x -> PApp fc (PRef fc [] (sUN op)) [pexp x]) toBin (Fix f op)- = binary op (\fc x y -> PApp fc (PRef fc (sUN op)) [pexp x,pexp y]) (assoc f)+ = binary op (\fc x y -> PApp fc (PRef fc [] (sUN op)) [pexp x,pexp y]) (assoc f) assoc (Infixl _) = AssocLeft assoc (Infixr _) = AssocRight assoc (InfixN _) = AssocNone@@ -79,7 +79,7 @@ lchar '`'; (n, fc) <- fnName lchar '`' indentPropHolds gtProp- return (\x y -> PApp fc (PRef fc n) [pexp x, pexp y])) AssocNone+ return (\x y -> PApp fc (PRef fc [fc] n) [pexp x, pexp y])) AssocNone -- | Operator without fixity (throws an error) nofixityoperator :: Operator IdrisParser PTerm
src/Idris/Parser.hs view
@@ -62,6 +62,7 @@ import Data.Monoid import Data.Char import Data.Ord+import Data.Foldable (asum) import Data.Generics.Uniplate.Data (descendM) import qualified Data.Map as M import qualified Data.HashSet as HS@@ -97,7 +98,7 @@ moduleHeader :: IdrisParser (Maybe (Docstring ()), [String], [(FC, OutputAnnotation)]) moduleHeader = try (do docs <- optional docComment noArgs docs- reserved "module"+ reservedHL "module" (i, ifc) <- identifier option ';' (lchar ';') let modName = moduleName i@@ -129,10 +130,12 @@ -} import_ :: IdrisParser ImportInfo import_ = do fc <- getFC- reserved "import"- reexport <- option False (do reserved "public"; return True)+ reservedHL "import"+ reexport <- option False (do reservedHL "public"+ return True) (id, idfc) <- identifier- newName <- optional (reserved "as" *> identifier)+ newName <- optional (do reservedHL "as"+ identifier) option ';' (lchar ';') return $ ImportInfo reexport (toPath id) (fmap (\(n, fc) -> (toPath n, fc)) newName)@@ -176,11 +179,18 @@ | Provider | Transform | Import!+ | RunElabDecl ; @ -} decl :: SyntaxInfo -> IdrisParser [PDecl]-decl syn = do fc <- getFC+decl syn = try (externalDecl syn)+ <|> internalDecl syn+ <?> "declaration"++internalDecl :: SyntaxInfo -> IdrisParser [PDecl]+internalDecl syn + = do fc <- getFC -- if we're after maxline, stop here let continue = case maxline syn of Nothing -> True@@ -228,8 +238,137 @@ <|> fnDecl' syn <|> data_ syn <|> record syn+ <|> runElabDecl syn <?> "declaration" +externalDecl :: SyntaxInfo -> IdrisParser [PDecl]+externalDecl syn = do i <- get+ notEndBlock+ FC fn start _ <- getFC+ decls <- declExtensions syn (syntaxRulesList $ syntax_rules i)+ FC _ _ end <- getFC+ let outerFC = FC fn start end+ return $ map (mapPDeclFC (fixFC outerFC)+ (fixFCH fn outerFC))+ decls+ where+ -- | Fix non-highlighting FCs to prevent spurious error location reports+ fixFC :: FC -> FC -> FC+ fixFC outer inner | inner `fcIn` outer = inner+ | otherwise = outer+ -- | Fix highlighting FCs by obliterating them, to avoid spurious highlights+ fixFCH fn outer inner | inner `fcIn` outer = inner+ | otherwise = FileFC fn++declExtensions :: SyntaxInfo -> [Syntax] -> IdrisParser [PDecl]+declExtensions syn rules = declExtension syn [] (filter isDeclRule rules)+ <?> "user-defined declaration"+ where+ isDeclRule (DeclRule _ _) = True+ isDeclRule _ = False++declExtension :: SyntaxInfo -> [Maybe (Name, SynMatch)] -> [Syntax] + -> IdrisParser [PDecl]+declExtension syn ns rules =+ choice $ flip map (groupBy (ruleGroup `on` syntaxSymbols) rules) $ \rs ->+ case head rs of -- can never be []+ DeclRule (symb:_) _ -> try $ do+ n <- extSymbol symb+ declExtension syn (n : ns) [DeclRule ss t | (DeclRule (_:ss) t) <- rs]+ -- If we have more than one Rule in this bucket, our grammar is+ -- nondeterministic.+ DeclRule [] dec -> let r = map (update (mapMaybe id ns)) dec in+ return r++ where+ update :: [(Name, SynMatch)] -> PDecl -> PDecl+ update ns = updateNs ns . fmap (updateRefs ns) . fmap (updateSynMatch ns)++ updateRefs ns = mapPT newref+ where+ newref (PRef fc fcs n) = PRef fc fcs (updateB ns n)+ newref t = t++ -- Below is a lot of tedious boilerplate which updates any top level+ -- names in the declaration. It will only change names which are bound in+ -- the declaration (including method names in classes and field names in+ -- record declarations, not including pattern variables)+ updateB :: [(Name, SynMatch)] -> Name -> Name+ updateB ns (NS n mods) = NS (updateB ns n) mods+ updateB ns n = case lookup n ns of+ Just (SynBind tfc t) -> t+ _ -> n++ updateNs :: [(Name, SynMatch)] -> PDecl -> PDecl+ updateNs ns (PTy doc argdoc s fc o n fc' t)+ = PTy doc argdoc s fc o (updateB ns n) fc' t+ updateNs ns (PClauses fc o n cs) + = PClauses fc o (updateB ns n) (map (updateClause ns) cs)+ updateNs ns (PCAF fc n t) = PCAF fc (updateB ns n) t+ updateNs ns (PData ds cds s fc o dat)+ = PData ds cds s fc o (updateData ns dat)+ updateNs ns (PParams fc ps ds) = PParams fc ps (map (updateNs ns) ds)+ updateNs ns (PNamespace s fc ds) = PNamespace s fc (map (updateNs ns) ds)+ updateNs ns (PRecord doc syn fc o n fc' ps pdocs fields cname cdoc s)+ = PRecord doc syn fc o (updateB ns n) fc' ps pdocs+ (map (updateField ns) fields)+ (updateRecCon ns cname)+ cdoc+ s+ updateNs ns (PClass docs s fc cs cn fc' ps pdocs pdets ds cname cdocs)+ = PClass docs s fc cs (updateB ns cn) fc' ps pdocs pdets+ (map (updateNs ns) ds)+ (updateRecCon ns cname)+ cdocs+ updateNs ns (PInstance docs pdocs s fc cs cn fc' ps ity ni ds)+ = PInstance docs pdocs s fc cs (updateB ns cn) fc'+ ps ity (fmap (updateB ns) ni) + (map (updateNs ns) ds)+ updateNs ns (PMutual fc ds) = PMutual fc (map (updateNs ns) ds)+ updateNs ns (PProvider docs s fc fc' pw n) + = PProvider docs s fc fc' pw (updateB ns n)+ updateNs ns d = d++ updateRecCon ns Nothing = Nothing+ updateRecCon ns (Just (n, fc)) = Just (updateB ns n, fc)++ updateField ns (m, p, t, doc) = (updateRecCon ns m, p, t, doc)++ updateClause ns (PClause fc n t ts t' ds)+ = PClause fc (updateB ns n) t ts t' (map (update ns) ds)+ updateClause ns (PWith fc n t ts t' m ds)+ = PWith fc (updateB ns n) t ts t' m (map (update ns) ds)+ updateClause ns (PClauseR fc ts t ds)+ = PClauseR fc ts t (map (update ns) ds)+ updateClause ns (PWithR fc ts t m ds)+ = PWithR fc ts t m (map (update ns) ds)++ updateData ns (PDatadecl n fc t cs)+ = PDatadecl (updateB ns n) fc t (map (updateCon ns) cs)+ updateData ns (PLaterdecl n fc t)+ = PLaterdecl (updateB ns n) fc t++ updateCon ns (cd, ads, cn, fc, ty, fc', fns)+ = (cd, ads, updateB ns cn, fc, ty, fc', fns)++ ruleGroup [] [] = True+ ruleGroup (s1:_) (s2:_) = s1 == s2+ ruleGroup _ _ = False++ extSymbol :: SSymbol -> IdrisParser (Maybe (Name, SynMatch))+ extSymbol (Keyword n) = do fc <- reservedFC (show n)+ highlightP fc AnnKeyword+ return Nothing+ extSymbol (Expr n) = do tm <- expr syn+ return $ Just (n, SynTm tm)+ extSymbol (SimpleExpr n) = do tm <- simpleExpr syn+ return $ Just (n, SynTm tm)+ extSymbol (Binding n) = do (b, fc) <- name+ return $ Just (n, SynBind fc b)+ extSymbol (Symbol s) = do fc <- symbolFC s+ highlightP fc AnnKeyword+ return Nothing+ {- | Parses a syntax extension declaration (and adds the rule to parser state) @@@ -284,9 +423,10 @@ syntaxRule syn = do sty <- try (do pushIndent- sty <- option AnySyntax (do reserved "term"; return TermSyntax- <|> do reserved "pattern"; return PatternSyntax)- reserved "syntax"+ sty <- option AnySyntax+ (do reservedHL "term"; return TermSyntax+ <|> do reservedHL "pattern"; return PatternSyntax)+ reservedHL "syntax" return sty) syms <- some syntaxSym when (all isExpr syms) $ unexpected "missing keywords in syntax rule"@@ -297,6 +437,17 @@ tm <- typeExpr (allowImp syn) >>= uniquifyBinders [n | Binding n <- syms] terminator return (Rule (mkSimple syms) tm sty)+ <|> do reservedHL "decl"; reservedHL "syntax"+ syms <- some syntaxSym+ when (all isExpr syms) $ unexpected "missing keywords in syntax rule"+ let ns = mapMaybe getName syms+ when (length ns /= length (nub ns))+ $ unexpected "repeated variable in syntax rule"+ lchar '='+ openBlock+ dec <- some (decl syn)+ closeBlock+ return (DeclRule (mkSimple syms) (concat dec)) where isExpr (Expr _) = True isExpr _ = False@@ -311,7 +462,7 @@ mkSimple es -- Can't parse a full expression followed by operator like characters due to ambiguity mkSimple' (Expr e : Symbol s : es)- | takeWhile (`elem` opChars) ts /= "" && ts `notElem` invalidOperators = SimpleExpr e : Symbol s : mkSimple' es+ | takeWhile (`elem` opChars) ts /= "" = SimpleExpr e : Symbol s : mkSimple' es where ts = dropWhile isSpace . dropWhileEnd isSpace $ s mkSimple' (e : es) = e : mkSimple' es mkSimple' [] = []@@ -322,8 +473,8 @@ uniquifyBinders userNames = fixBind [] where fixBind :: [(Name, Name)] -> PTerm -> IdrisParser PTerm- fixBind rens (PRef fc n) | Just n' <- lookup n rens =- return $ PRef fc n'+ fixBind rens (PRef fc hls n) | Just n' <- lookup n rens =+ return $ PRef fc hls n' fixBind rens (PPatvar fc n) | Just n' <- lookup n rens = return $ PPatvar fc n' fixBind rens (PLam fc n nfc ty body)@@ -480,31 +631,31 @@ -- https://github.com/idris-lang/Idris-dev/issues/1574 fnOpts :: [FnOpt] -> IdrisParser [FnOpt] fnOpts opts- = do reserved "total"; fnOpts (TotalFn : opts)- <|> do reserved "partial"; fnOpts (PartialFn : (opts \\ [TotalFn]))- <|> do reserved "covering"; fnOpts (CoveringFn : (opts \\ [TotalFn]))- <|> do try (lchar '%' *> reserved "export"); c <- fmap fst stringLiteral;- fnOpts (CExport c : opts)- <|> do try (lchar '%' *> reserved "no_implicit");- fnOpts (NoImplicit : opts)- <|> do try (lchar '%' *> reserved "inline");- fnOpts (Inlinable : opts)- <|> do try (lchar '%' *> reserved "assert_total");- fnOpts (AssertTotal : opts)- <|> do try (lchar '%' *> reserved "error_handler");- fnOpts (ErrorHandler : opts)- <|> do try (lchar '%' *> reserved "error_reverse");- fnOpts (ErrorReverse : opts)- <|> do try (lchar '%' *> reserved "reflection");- fnOpts (Reflection : opts)- <|> do try (lchar '%' *> reserved "hint");- fnOpts (AutoHint : opts)- <|> do lchar '%'; reserved "specialise";- lchar '['; ns <- sepBy nameTimes (lchar ','); lchar ']'- fnOpts (Specialise ns : opts)- <|> do reserved "implicit"; fnOpts (Implicit : opts)- <|> return opts- <?> "function modifier"+ = do reservedHL "total"; fnOpts (TotalFn : opts)+ <|> do reservedHL "partial"; fnOpts (PartialFn : (opts \\ [TotalFn]))+ <|> do reservedHL "covering"; fnOpts (CoveringFn : (opts \\ [TotalFn]))+ <|> do try (lchar '%' *> reserved "export"); c <- fmap fst stringLiteral;+ fnOpts (CExport c : opts)+ <|> do try (lchar '%' *> reserved "no_implicit");+ fnOpts (NoImplicit : opts)+ <|> do try (lchar '%' *> reserved "inline");+ fnOpts (Inlinable : opts)+ <|> do try (lchar '%' *> reserved "assert_total");+ fnOpts (AssertTotal : opts)+ <|> do try (lchar '%' *> reserved "error_handler");+ fnOpts (ErrorHandler : opts)+ <|> do try (lchar '%' *> reserved "error_reverse");+ fnOpts (ErrorReverse : opts)+ <|> do try (lchar '%' *> reserved "reflection");+ fnOpts (Reflection : opts)+ <|> do try (lchar '%' *> reserved "hint");+ fnOpts (AutoHint : opts)+ <|> do lchar '%'; reserved "specialise";+ lchar '['; ns <- sepBy nameTimes (lchar ','); lchar ']'+ fnOpts (Specialise ns : opts)+ <|> do reservedHL "implicit"; fnOpts (Implicit : opts)+ <|> return opts+ <?> "function modifier" where nameTimes :: IdrisParser (Name, Maybe Int) nameTimes = do n <- fst <$> fnName t <- option Nothing (do reds <- fmap fst natural@@ -532,16 +683,16 @@ opts <- fnOpts initOpts acc <- optional accessibility opts' <- fnOpts opts- n_in <- fst <$> fnName+ (n_in, nfc) <- fnName let n = expandNS syn n_in lchar ':' ty <- typeExpr (allowImp syn) fc <- getFC terminator addAcc n acc- return (PPostulate ext doc syn fc opts' n ty)+ return (PPostulate ext doc syn fc nfc opts' n ty) <?> "postulate"- where ppostDecl = do reserved "postulate"; return False+ where ppostDecl = do fc <- reservedHL "postulate"; return False <|> do lchar '%'; reserved "extern"; return True {- | Parses a using declaration @@ -553,7 +704,8 @@ -} using_ :: SyntaxInfo -> IdrisParser [PDecl] using_ syn =- do reserved "using"; lchar '('; ns <- usingDeclList syn; lchar ')'+ do reservedHL "using"+ lchar '('; ns <- usingDeclList syn; lchar ')' openBlock let uvars = using syn ds <- many (decl (syn { using = uvars ++ ns }))@@ -571,7 +723,7 @@ -} params :: SyntaxInfo -> IdrisParser [PDecl] params syn =- do reserved "parameters"; lchar '('; ns <- typeDeclList syn; lchar ')'+ do reservedHL "parameters"; lchar '('; ns <- typeDeclList syn; lchar ')' let ns' = [(n, ty) | (n, _, ty) <- ns] openBlock let pvars = syn_params syn@@ -591,7 +743,7 @@ -} mutual :: SyntaxInfo -> IdrisParser [PDecl] mutual syn =- do reserved "mutual"+ do reservedHL "mutual" openBlock let pvars = syn_params syn ds <- many (decl (syn { mut_nesting = mut_nesting syn + 1 } ))@@ -610,7 +762,7 @@ -} namespace :: SyntaxInfo -> IdrisParser [PDecl] namespace syn =- do reserved "namespace"+ do reservedHL "namespace" (n, nfc) <- identifier openBlock ds <- some (decl syn { syn_namespace = n : syn_namespace syn })@@ -625,7 +777,7 @@ @ -} instanceBlock :: SyntaxInfo -> IdrisParser [PDecl]-instanceBlock syn = do reserved "where"+instanceBlock syn = do reservedHL "where" openBlock ds <- many (fnDecl syn) closeBlock@@ -648,7 +800,7 @@ @ -} classBlock :: SyntaxInfo -> IdrisParser (Maybe (Name, FC), Docstring (Either Err PTerm), [PDecl])-classBlock syn = do reserved "where"+classBlock syn = do reservedHL "where" openBlock (cn, cd) <- option (Nothing, emptyDocstring) $ try (do (doc, _) <- option noDocs docComment@@ -664,7 +816,7 @@ where constructor :: IdrisParser (Name, FC)- constructor = reserved "constructor" *> fnName+ constructor = reservedHL "constructor" *> fnName annotate :: SyntaxInfo -> IState -> Docstring () -> Docstring (Either Err PTerm) annotate syn ist = annotCode $ tryFullExpr syn ist@@ -688,7 +840,7 @@ class_ syn = do (doc, argDocs, acc) <- try (do (doc, argDocs) <- docstring syn acc <- optional accessibility- reserved "class"+ reservedHL "class" return (doc, argDocs, acc)) fc <- getFC cons <- constraintList syn@@ -726,14 +878,14 @@ -} instance_ :: SyntaxInfo -> IdrisParser [PDecl] instance_ syn = do (doc, argDocs)- <- try (docstring syn <* reserved "instance")+ <- try (docstring syn <* reservedHL "instance") fc <- getFC en <- optional instanceName cs <- constraintList syn let cs' = [(c, ty) | (c, _, ty) <- cs] (cn, cnfc) <- fnName args <- many (simpleExpr syn)- let sc = PApp fc (PRef cnfc cn) (map pexp args)+ let sc = PApp fc (PRef cnfc [cnfc] cn) (map pexp args) let t = bindList (PPi constraint) cs sc ds <- option [] (instanceBlock syn) return [PInstance doc argDocs syn fc cs' cn cnfc args t en ds]@@ -827,10 +979,11 @@ @ -} caf :: SyntaxInfo -> IdrisParser PDecl-caf syn = do reserved "let"+caf syn = do reservedHL "let" n_in <- fst <$> fnName; let n = expandNS syn n_in+ pushIndent lchar '='- t <- expr syn+ t <- indented $ expr syn terminator fc <- getFC return (PCAF fc n t)@@ -925,7 +1078,7 @@ return ([], [])] return $ PClauseR fc wargs r wheres) <|> (do popIndent- reserved "with"+ reservedHL "with" wval <- simpleExpr syn pn <- optProof openBlock@@ -951,7 +1104,7 @@ let capp = PLet fc (sMN 0 "match") NoFC ty (PMatchApp fc n)- (PRef fc (sMN 0 "match"))+ (PRef fc [] (sMN 0 "match")) ist <- get put (ist { lastParse = Just n }) return $ PClause fc n capp [] r wheres@@ -974,18 +1127,18 @@ do terminator return ([], [])] ist <- get- let capp = PApp fc (PRef nfc n) [pexp l, pexp r]+ let capp = PApp fc (PRef nfc [nfc] n) [pexp l, pexp r] put (ist { lastParse = Just n }) return $ PClause fc n capp wargs rs wheres) <|> (do popIndent- reserved "with"+ reservedHL "with" wval <- bracketed syn pn <- optProof openBlock ds <- some $ fnDecl syn closeBlock ist <- get- let capp = PApp fc (PRef fc n) [pexp l, pexp r]+ let capp = PApp fc (PRef fc [] n) [pexp l, pexp r] let withs = map (fillLHSD n capp wargs) $ concat ds put (ist { lastParse = Just n }) return $ PWith fc n capp wargs wval pn withs)@@ -996,7 +1149,7 @@ args <- many (try (implicitArg (syn { inPattern = True } )) <|> (fmap pexp (argExpr syn))) wargs <- many (wExpr syn)- let capp = PApp fc (PRef nfc n)+ let capp = PApp fc (PRef nfc [nfc] n) (cargs ++ args) (do r <- rhs syn n ist <- get@@ -1010,7 +1163,7 @@ ist <- get put (ist { lastParse = Just n }) return $ PClause fc n capp wargs r wheres) <|> (do- reserved "with"+ reservedHL "with" ist <- get put (ist { lastParse = Just n }) wval <- bracketed syn@@ -1023,7 +1176,7 @@ return $ PWith fc n capp wargs wval pn withs) <?> "function clause" where- optProof = option Nothing (do reserved "proof"+ optProof = option Nothing (do reservedHL "proof" n <- fnName return (Just n)) @@ -1058,7 +1211,7 @@ -} whereBlock :: Name -> SyntaxInfo -> IdrisParser ([PDecl], [(Name, Name)]) whereBlock n syn- = do reserved "where"+ = do reservedHL "where" ds <- indentedBlock1 (decl syn) let dns = concatMap (concatMap declared) ds return (concat ds, map (\x -> (x, decoration syn x)) dns)@@ -1144,14 +1297,14 @@ libs <- sepBy1 (fmap fst stringLiteral) (lchar ',') return [PDirective (DDynamicLibs libs)] <|> do try (lchar '%' *> reserved "name")- ty <- fst <$> fnName- ns <- sepBy1 (fst <$> name) (lchar ',')- return [PDirective (DNameHint ty ns)]+ (ty, tyFC) <- fnName+ ns <- sepBy1 name (lchar ',')+ return [PDirective (DNameHint ty tyFC ns)] <|> do try (lchar '%' *> reserved "error_handlers")- fn <- fst <$> fnName- arg <- fst <$> fnName- ns <- sepBy1 (fst <$> name) (lchar ',')- return [PDirective (DErrorHandlers fn arg ns) ]+ (fn, nfc) <- fnName+ (arg, afc) <- fnName+ ns <- sepBy1 name (lchar ',')+ return [PDirective (DErrorHandlers fn nfc arg afc ns) ] <|> do try (lchar '%' *> reserved "language"); ext <- pLangExt; return [PDirective (DLanguage ext)] <|> do fc <- getFC@@ -1174,8 +1327,8 @@ -} totality :: IdrisParser Bool totality- = do reserved "total"; return True- <|> do reserved "partial"; return False+ = do reservedHL "total"; return True+ <|> do reservedHL "partial"; return False {- | Parses a type provider @@ -1186,24 +1339,26 @@ -} provider :: SyntaxInfo -> IdrisParser [PDecl] provider syn = do doc <- try (do (doc, _) <- docstring syn+ fc1 <- getFC lchar '%'- reserved "provide"+ fc2 <- reservedFC "provide"+ highlightP (spanFC fc1 fc2) AnnKeyword return doc) provideTerm doc <|> providePostulate doc <?> "type provider" where provideTerm doc =- do lchar '('; n <- fst <$> fnName; lchar ':'; t <- typeExpr syn; lchar ')'+ do lchar '('; (n, nfc) <- fnName; lchar ':'; t <- typeExpr syn; lchar ')' fc <- getFC- reserved "with"+ reservedHL "with" e <- expr syn <?> "provider expression"- return [PProvider doc syn fc (ProvTerm t e) n]+ return [PProvider doc syn fc nfc (ProvTerm t e) n] providePostulate doc =- do reserved "postulate"- n <- fst <$> fnName+ do reservedHL "postulate"+ (n, nfc) <- fnName fc <- getFC- reserved "with"+ reservedHL "with" e <- expr syn <?> "provider expression"- return [PProvider doc syn fc (ProvPostulate e) n]+ return [PProvider doc syn fc nfc (ProvPostulate e) n] {- | Parses a transform @@ -1224,7 +1379,23 @@ return [PTransform fc False l r] <?> "transform" +{- | Parses a top-level reflected elaborator script +@+RunElabDecl ::= '%' 'runElab' Expr+@+-}+runElabDecl :: SyntaxInfo -> IdrisParser PDecl+runElabDecl syn =+ do kwFC <- try (do fc <- getFC+ lchar '%'+ fc' <- reservedFC "runElab"+ return (spanFC fc fc'))+ script <- expr syn <?> "elaborator script"+ highlightP kwFC AnnKeyword+ return $ PRunElabDecl kwFC script (syn_namespace syn)+ <?> "top-level elaborator script"+ {- * Loading and parsing -} {- | Parses an expression from input -} parseExpr :: IState -> String -> Result PTerm@@ -1238,6 +1409,30 @@ parseTactic :: IState -> String -> Result PTactic parseTactic st = runparser (fullTactic defaultSyntax) st "(input)" +{- | Parses a do-step from input (used in the elab shell) -}+parseElabShellStep :: IState -> String -> Result (Either ElabShellCmd PDo)+parseElabShellStep ist = runparser (fmap Right (do_ defaultSyntax) <|> fmap Left elabShellCmd) ist "(input)"+ where elabShellCmd = char ':' >>+ (reserved "qed" >> pure EQED ) <|>+ (reserved "abandon" >> pure EAbandon ) <|>+ (reserved "undo" >> pure EUndo ) <|>+ (reserved "state" >> pure EProofState) <|>+ (reserved "term" >> pure EProofTerm ) <|>+ (expressionTactic ["e", "eval"] EEval ) <|>+ (expressionTactic ["t", "type"] ECheck) <|>+ (expressionTactic ["search"] ESearch ) <|>+ (do reserved "doc"+ doc <- (Right . fst <$> constant) <|> (Left . fst <$> fnName)+ eof+ return (EDocStr doc))+ <?> "elab command"+ expressionTactic cmds tactic =+ do asum (map reserved cmds)+ t <- spaced (expr defaultSyntax)+ i <- get+ return $ tactic (desugar defaultSyntax i t)+ spaced parser = indentPropHolds gtProp *> parser+ -- | Parse module header and imports parseImports :: FilePath -> String -> Idris (Maybe (Docstring ()), [String], [ImportInfo], Maybe Delta) parseImports fname input@@ -1271,12 +1466,18 @@ -- | There should be a better way of doing this... findFC :: Doc -> (FC, String)-findFC x = let s = show (plain x) in- case span (/= ':') s of- (failname, ':':rest) -> case span isDigit rest of- (line, ':':rest') -> case span isDigit rest' of- (col, ':':msg) -> let pos = (read line, read col) in- (FC failname pos pos, msg)+findFC x = let s = show (plain x) in findFC' s+ where findFC' s = case span (/= ':') s of+ -- Horrid kludge to prevent crashes on Windows+ (prefix, ':':'\\':rest) ->+ case findFC' rest of+ (NoFC, msg) -> (NoFC, msg)+ (FileFC f, msg) -> (FileFC (prefix ++ ":\\" ++ f), msg)+ (FC f start end, msg) -> (FC (prefix ++ ":\\" ++ f) start end, msg)+ (failname, ':':rest) -> case span isDigit rest of+ (line, ':':rest') -> case span isDigit rest' of+ (col, ':':msg) -> let pos = (read line, read col) in+ (FC failname pos pos, msg) -- | Check if the coloring matches the options and corrects if necessary fixColour :: Bool -> ANSI.Doc -> ANSI.Doc@@ -1331,7 +1532,7 @@ ids <- allImportDirs fp <- findImport ids ibcsd file if file `elem` imported i- then do iLOG $ "Already read " ++ file+ then do logLvl 1 $ "Already read " ++ file return Nothing else do putIState (i { imported = file : imported i }) case fp of@@ -1339,7 +1540,7 @@ LIDR fn -> loadSource True fn Nothing IBC fn src -> idrisCatch (loadIBC True fn)- (\c -> do iLOG $ fn ++ " failed " ++ pshow i c+ (\c -> do logLvl 1 $ fn ++ " failed " ++ pshow i c case src of IDR sfn -> loadSource False sfn Nothing LIDR sfn -> loadSource True sfn Nothing)@@ -1348,7 +1549,7 @@ {- | Load idris code from file -} loadFromIFile :: Bool -> IFileType -> Maybe Int -> Idris () loadFromIFile reexp i@(IBC fn src) maxline- = do iLOG $ "Skipping " ++ getSrcFile i+ = do logLvl 1 $ "Skipping " ++ getSrcFile i idrisCatch (loadIBC reexp fn) (\err -> ierror $ LoadingFailed fn err) where@@ -1372,7 +1573,7 @@ {- | Load Idris source code-} loadSource :: Bool -> FilePath -> Maybe Int -> Idris () loadSource lidr f toline- = do iLOG ("Reading " ++ f)+ = do logLvl 1 ("Reading " ++ f) i <- getIState let def_total = default_total i file_in <- runIO $ readSource f@@ -1399,6 +1600,7 @@ sendHighlighting [(nfc, AnnNamespace ns srcFnAbs)]) [(re, fn, ns, nfc) | ImportInfo re fn _ ns _ nfc <- imports] reportParserWarnings+ sendParserHighlighting -- process and check module aliases let modAliases = M.fromList@@ -1449,6 +1651,7 @@ ibc_write ist } _ -> return ()+ sendParserHighlighting -- Parsing done, now process declarations @@ -1468,17 +1671,20 @@ -- simplify every definition do give the totality checker -- a better chance mapM_ (\n -> do logLvl 5 $ "Simplifying " ++ show n- updateContext (simplifyCasedef n $ getErasureInfo i))+ ctxt' <-+ do ctxt <- getContext+ tclift $ simplifyCasedef n (getErasureInfo i) ctxt+ setContext ctxt') (map snd (idris_totcheck i)) -- build size change graph from simplified definitions- iLOG "Totality checking"+ logLvl 1 "Totality checking" i <- getIState mapM_ buildSCG (idris_totcheck i) mapM_ checkDeclTotality (idris_totcheck i) -- Redo totality check for deferred names let deftots = idris_defertotcheck i- iLOG $ "Totality checking " ++ show deftots+ logLvl 1 $ "Totality checking " ++ show deftots mapM_ (\x -> do tot <- getTotality x case tot of Total _ -> setTotality x Unchecked@@ -1486,9 +1692,9 @@ mapM_ buildSCG deftots mapM_ checkDeclTotality deftots - iLOG ("Finished " ++ f)+ logLvl 1 ("Finished " ++ f) ibcsd <- valIBCSubDir i- iLOG "Universe checking"+ logLvl 1 "Universe checking" iucheck let ibc = ibcPathNoFallback ibcsd f i <- getIState@@ -1501,11 +1707,16 @@ Just docs -> addModDoc syntax mname docs - -- Finally, write an ibc if checking was successful+ -- Finally, write an ibc and highlights if checking was successful ok <- noErrors when ok $- idrisCatch (do writeIBC f ibc; clearIBC)- (\c -> return ()) -- failure is harmless+ do idrisCatch (do writeIBC f ibc; clearIBC)+ (\c -> return ()) -- failure is harmless+ hl <- getDumpHighlighting+ when hl $+ idrisCatch (writeHighlights f)+ (const $ return ()) -- failure is harmless+ clearHighlights i <- getIState putIState (i { default_total = def_total, hide_list = [] })
src/Idris/PartialEval.hs view
@@ -8,6 +8,7 @@ import Idris.Delaborate import Idris.Core.TT+import Idris.Core.CaseTree import Idris.Core.Evaluate import Control.Monad.State@@ -197,6 +198,7 @@ dynArgs (_ : ns) (V _ : as) = dynArgs ns as dynArgs (_ : ns) (P _ _ _ : as) = dynArgs ns as dynArgs _ _ = False -- and now we'll get stuck + mkNewPats ist d ns newname sname lhs rhs = PEDecl lhs rhs (map mkClause d) False where @@ -204,8 +206,8 @@ mkClause (oldlhs, oldrhs) = let (_, as) = unApply oldlhs lhsargs = mkLHSargs [] ns as- lhs = PApp emptyFC (PRef emptyFC newname) lhsargs- rhs = PApp emptyFC (PRef emptyFC sname) + lhs = PApp emptyFC (PRef emptyFC [] newname) lhsargs+ rhs = PApp emptyFC (PRef emptyFC [] sname) (mkRHSargs ns lhsargs) in (lhs, rhs) @@ -235,7 +237,7 @@ mkSubst :: (Term, Term) -> Maybe (Name, Term) mkSubst (P _ n _, t) = Just (n, t) mkSubst _ = Nothing-+ -- | Creates a new declaration for a specialised function application. -- Simple version at the moment: just create a version which is a direct -- application of the function to be specialised.@@ -243,7 +245,7 @@ mkPE_TermDecl :: IState -> Name -> Name -> [(PEArgType, Term)] -> PEDecl mkPE_TermDecl ist newname sname ns - = let lhs = PApp emptyFC (PRef emptyFC newname) (map pexp (mkp ns)) + = let lhs = PApp emptyFC (PRef emptyFC [] newname) (map pexp (mkp ns)) rhs = eraseImps $ delab ist (mkApp (P Ref sname Erased) (map snd ns)) patdef = lookupCtxtExact sname (idris_patdefs ist) newpats = case patdef of@@ -297,7 +299,8 @@ case (lookupCtxtExact n (idris_statics ist), lookupCtxtExact n (idris_implicits ist)) of (Just statics, Just imps) ->- if (length statics == length args && or statics) then+ if (length statics == length args && or statics+ && specialisable (tt_ctxt ist) n) then case buildApp env statics imps args [0..] of args -> [(n, args)] -- _ -> []@@ -307,4 +310,29 @@ ga env (Bind n t sc) = ga (n : env) sc ga env t = [] + -- A function is only specialisable if there are no overlapping+ -- cases in the case tree (otherwise the partial evaluation could+ -- easily get stuck)+ specialisable :: Context -> Name -> Bool+ specialisable ctxt n = case lookupDefExact n ctxt of+ Just (CaseOp _ _ _ _ _ cds) ->+ noOverlap (snd (cases_compiletime cds))+ _ -> False++ noOverlap :: SC -> Bool+ noOverlap (Case _ _ [DefaultCase sc]) = noOverlap sc+ noOverlap (Case _ _ alts) = noOverlapAlts alts+ noOverlap _ = True++ -- There's an overlap if the case tree has a default case along with+ -- some other cases. It's fine if there's a default case on its own.+ noOverlapAlts (ConCase _ _ _ sc : rest) + = noOverlapAlts rest && noOverlap sc+ noOverlapAlts (FnCase _ _ sc : rest) = noOverlapAlts rest+ noOverlapAlts (ConstCase _ sc : rest)+ = noOverlapAlts rest && noOverlap sc+ noOverlapAlts (SucCase _ sc : rest)+ = noOverlapAlts rest && noOverlap sc+ noOverlapAlts (DefaultCase _ : _) = False+ noOverlapAlts _ = True
src/Idris/ProofSearch.hs view
@@ -1,9 +1,10 @@ {-# LANGUAGE PatternGuards #-} -module Idris.ProofSearch(trivial, trivialHoles, proofSearch) where+module Idris.ProofSearch(trivial, trivialHoles, proofSearch, resolveTC) where import Idris.Core.Elaborate hiding (Tactic(..)) import Idris.Core.TT+import Idris.Core.Unify import Idris.Core.Evaluate import Idris.Core.CaseTree import Idris.Core.Typecheck@@ -22,16 +23,18 @@ -- Pass in a term elaborator to avoid a cyclic dependency with ElabTerm trivial :: (PTerm -> ElabD ()) -> IState -> ElabD ()-trivial = trivialHoles []+trivial = trivialHoles [] [] -trivialHoles :: [(Name, Int)] -> (PTerm -> ElabD ()) -> IState -> ElabD ()-trivialHoles ok elab ist - = try' (do elab (PApp (fileFC "prf") (PRef (fileFC "prf") eqCon) [pimp (sUN "A") Placeholder False, pimp (sUN "x") Placeholder False])- return ())- (do env <- get_env- g <- goal- tryAll env- return ()) True+trivialHoles :: [Name] -> -- user visible names, when working+ -- in interactive mode+ [(Name, Int)] -> (PTerm -> ElabD ()) -> IState -> ElabD ()+trivialHoles psnames ok elab ist+ = try' (do elab (PApp (fileFC "prf") (PRef (fileFC "prf") [] eqCon) [pimp (sUN "A") Placeholder False, pimp (sUN "x") Placeholder False])+ return ())+ (do env <- get_env+ g <- goal+ tryAll env+ return ()) True where tryAll [] = fail "No trivial solution" tryAll ((x, b):xs)@@ -41,8 +44,8 @@ g <- goal -- anywhere but the top is okay for a hole, if holesOK set if -- all (\n -> not (n `elem` badhs)) (freeNames (binderTy b))- holesOK hs (binderTy b)- then try' (elab (PRef (fileFC "prf") x))+ (holesOK hs (binderTy b) && (null psnames || x `elem` psnames))+ then try' (elab (PRef (fileFC "prf") [] x)) (tryAll xs) True else tryAll xs @@ -60,6 +63,50 @@ | (n, p) `elem` ok = holeArgsOK hs n (p + 1) as | otherwise = holesOK hs a && holeArgsOK hs n (p + 1) as +trivialTCs :: [(Name, Int)] -> (PTerm -> ElabD ()) -> IState -> ElabD ()+trivialTCs ok elab ist+ = try' (do elab (PApp (fileFC "prf") (PRef (fileFC "prf") [] eqCon) [pimp (sUN "A") Placeholder False, pimp (sUN "x") Placeholder False])+ return ())+ (do env <- get_env+ g <- goal+ tryAll env+ return ()) True+ where+ tryAll [] = fail "No trivial solution"+ tryAll ((x, b):xs)+ = do -- if type of x has any holes in it, move on+ hs <- get_holes+ let badhs = hs -- filter (flip notElem holesOK) hs+ g <- goal+ env <- get_env+ -- anywhere but the top is okay for a hole, if holesOK set+ if -- all (\n -> not (n `elem` badhs)) (freeNames (binderTy b))+ (holesOK hs (binderTy b) && tcArg env (binderTy b))+ then try' (elab (PRef (fileFC "prf") [] x))+ (tryAll xs) True+ else tryAll xs+ + tcArg env ty + | (P _ n _, args) <- unApply (getRetTy (normalise (tt_ctxt ist) env ty))+ = case lookupCtxtExact n (idris_classes ist) of+ Just _ -> True+ _ -> False+ | otherwise = False++ holesOK hs ap@(App _ _ _)+ | (P _ n _, args) <- unApply ap+ = holeArgsOK hs n 0 args+ holesOK hs (App _ f a) = holesOK hs f && holesOK hs a+ holesOK hs (P _ n _) = not (n `elem` hs)+ holesOK hs (Bind n b sc) = holesOK hs (binderTy b) && + holesOK hs sc+ holesOK hs _ = True++ holeArgsOK hs n p [] = True+ holeArgsOK hs n p (a : as)+ | (n, p) `elem` ok = holeArgsOK hs n (p + 1) as+ | otherwise = holesOK hs a && holeArgsOK hs n (p + 1) as+ cantSolveGoal :: ElabD a cantSolveGoal = do g <- goal env <- get_env@@ -73,9 +120,11 @@ Bool -> -- ambiguity ok Bool -> -- defer on failure Int -> -- maximum depth- (PTerm -> ElabD ()) -> Maybe Name -> Name -> [Name] ->+ (PTerm -> ElabD ()) -> Maybe Name -> Name -> + [Name] ->+ [Name] -> IState -> ElabD ()-proofSearch False fromProver ambigok deferonfail depth elab _ nroot [fn] ist+proofSearch False fromProver ambigok deferonfail depth elab _ nroot psnames [fn] ist = do -- get all possible versions of the name, take the first one that -- works let all_imps = lookupCtxtName fn (idris_implicits ist)@@ -106,7 +155,7 @@ isImp (PImp p _ _ _ _) = (True, p) isImp arg = (True, priority arg) -- try to get all of them by unification-proofSearch rec fromProver ambigok deferonfail maxDepth elab fn nroot hints ist +proofSearch rec fromProver ambigok deferonfail maxDepth elab fn nroot psnames hints ist = do compute ty <- goal hs <- get_holes@@ -149,12 +198,20 @@ return $ and (map (notHole hs) (zip as cs)) Nothing -> fail "Can't happen" + -- if n is a metavariable, and c is a constructor form, we're not ready+ -- to run yet notHole hs (P _ n _, c) | (P _ cn _, _) <- unApply c, n `elem` hs && isConName cn (tt_ctxt ist) = False | Constant _ <- c = not (n `elem` hs)+ -- if fa is a metavariable applied to anything, we're not ready to run yet.+ notHole hs (fa, c)+ | (P _ fn _, args) <- unApply fa = fn `notElem` hs notHole _ _ = True + inHS hs (P _ n _) = n `elem` hs+ isHS _ _ = False+ toUN t@(P nt (MN i n) ty) | ('_':xs) <- str n = t | otherwise = P nt (UN n) ty@@ -177,7 +234,9 @@ ty <- goal when (S.member ty tys) $ fail "Been here before" let tys' = S.insert ty tys- try' (trivial elab ist)+ try' (try' (trivialHoles psnames [] elab ist)+ (resolveTC False False 20 ty nroot elab ist)+ True) (try' (try' (resolveByCon (d - 1) locs tys') (resolveByLocals (d - 1) locs tys') True)@@ -186,10 +245,15 @@ then fail "cantSolveGoal" else do attack; defer [] nroot; solve) True) True - getFn d Nothing = []- getFn d (Just f) | d < maxDepth-1 = [f]+ -- get recursive function name. Only user given names make sense.+ getFn d (Just f) | d < maxDepth-1 && usersname f = [f] | otherwise = []+ getFn d _ = [] + usersname (UN _) = True+ usersname (NS n _) = usersname n+ usersname _ = False+ resolveByCon d locs tys = do t <- goal let (f, _) = unApply t@@ -199,11 +263,14 @@ Nothing -> [] Just hs -> hs case lookupCtxtExact n (idris_datatypes ist) of- Just t -> tryCons d locs tys - (hints ++ - con_names t ++ - autohints ++ - getFn d fn)+ Just t -> do+ let others = hints ++ con_names t ++ autohints+ when (not fromProver && length (con_names t) > 1)+ -- in interactive mode,+ -- don't just guess (fine for 'auto',+ -- since that's part of the point...)+ $ checkConstructor ist others+ tryCons d locs tys (others ++ getFn d fn) Nothing -> fail "Not a data type" _ -> fail "Not a data type" @@ -215,7 +282,7 @@ tryLocals d locs tys [] = fail "Locals failed" tryLocals d locs tys ((x, t) : xs) - | x `elem` locs = tryLocals d locs tys xs+ | x `elem` locs || x `notElem` psnames = tryLocals d locs tys xs | otherwise = try' (tryLocal d (x : locs) tys x t) (tryLocals d locs tys xs) True @@ -227,7 +294,7 @@ = do let a = getPArity (delab ist (binderTy t)) tryLocalArg d locs tys n a - tryLocalArg d locs tys n 0 = elab (PRef (fileFC "prf") n)+ tryLocalArg d locs tys n 0 = elab (PRef (fileFC "prf") [] n) tryLocalArg d locs tys n i = simple_app False (tryLocalArg d locs tys n (i - 1)) (psRec True d locs tys) "proof search local apply"@@ -245,12 +312,206 @@ ps' <- get_probs hs' <- get_holes when (length ps < length ps') $ fail "Can't apply constructor"+ let newhs = filter (\ (x, y) -> not x) (zip (map fst imps) args) mapM_ (\ (_, h) -> do focus h aty <- goal- psRec True d locs tys)- (filter (\ (x, y) -> not x) (zip (map fst imps) args))+ psRec True d locs tys) newhs solve isImp (PImp p _ _ _ _) = (True, p) isImp arg = (False, priority arg) ++-- In interactive mode, only search for things if there is some +-- index to help pick a relevant constructor+checkConstructor :: IState -> [Name] -> ElabD ()+checkConstructor ist [] = return ()+checkConstructor ist (n : ns) =+ case lookupTyExact n (tt_ctxt ist) of+ Just t -> if not (conIndexed t)+ then fail "Overlapping constructor types"+ else checkConstructor ist ns+ where+ conIndexed t = let (_, args) = unApply (getRetTy t) in+ any conHead args+ conHead t | (P _ n _, _) <- unApply t = case lookupDefExact n (tt_ctxt ist) of+ Just _ -> True+ _ -> False+ | otherwise = False++-- | Resolve type classes. This will only pick up 'normal' instances, never+-- named instances (which is enforced by 'findInstances').+resolveTC :: Bool -- ^ using default Int+ -> Bool -- ^ allow metavariables in the goal+ -> Int -- ^ depth+ -> Term -- ^ top level goal, for error messages+ -> Name -- ^ top level function name, to prevent loops+ -> (PTerm -> ElabD ()) -- ^ top level elaborator+ -> IState -> ElabD ()+resolveTC def mvok depth top fn elab ist+ = do hs <- get_holes+ resTC' [] def hs depth top fn elab ist++resTC' tcs def topholes 0 topg fn elab ist = fail $ "Can't resolve type class"+resTC' tcs def topholes 1 topg fn elab ist = try' (trivial elab ist) (resolveTC def False 0 topg fn elab ist) True+resTC' tcs defaultOn topholes depth topg fn elab ist+ = do compute+ g <- goal+ -- Resolution can proceed only if there is something concrete in the+ -- determining argument positions. Keep track of the holes in the+ -- non-determining position, because it's okay for 'trivial' to solve+ -- those holes and no others.+ let (argsok, okholePos) = case tcArgsOK g topholes of+ Nothing -> (False, [])+ Just hs -> (True, hs)+ if not argsok -- && not mvok)+ then lift $ tfail $ CantResolve True topg+ else do+ ptm <- get_term+ ulog <- getUnifyLog+ hs <- get_holes+ env <- get_env+ t <- goal+ let (tc, ttypes) = unApply (getRetTy t)+ let okholes = case tc of+ P _ n _ -> zip (repeat n) okholePos+ _ -> []++ traceWhen ulog ("Resolving class " ++ show g ++ "\nin" ++ show env ++ "\n" ++ show okholes) $+ try' (trivialTCs okholes elab ist) + (do addDefault t tc ttypes+ let stk = map fst (filter snd $ elab_stack ist)+ let insts = findInstances ist t+ blunderbuss t depth stk (stk ++ insts)) True+ where+ -- returns Just hs if okay, where hs are holes which are okay in the+ -- goal, or Nothing if not okay to proceed+ tcArgsOK ty hs | (P _ nc _, as) <- unApply (getRetTy ty), nc == numclass && defaultOn+ = Just []+ tcArgsOK ty hs -- if any determining arguments are metavariables, postpone+ = let (f, as) = unApply (getRetTy ty) in+ case f of+ P _ cn _ -> case lookupCtxtExact cn (idris_classes ist) of+ Just ci -> tcDetArgsOK 0 (class_determiners ci) hs as+ Nothing -> if any (isMeta hs) as+ then Nothing+ else Just []+ _ -> if any (isMeta hs) as+ then Nothing+ else Just []++ -- return the list of argument positions which can safely be a hole+ -- or Nothing if one of the determining arguments is a hole+ tcDetArgsOK i ds hs (x : xs)+ | i `elem` ds = if isMeta hs x+ then Nothing+ else tcDetArgsOK (i + 1) ds hs xs+ | otherwise = do rs <- tcDetArgsOK (i + 1) ds hs xs+ case x of+ P _ n _ -> Just (i : rs)+ _ -> Just rs+ tcDetArgsOK _ _ _ [] = Just []++ isMeta :: [Name] -> Term -> Bool+ isMeta ns (P _ n _) = n `elem` ns + isMeta _ _ = False++ notHole hs (P _ n _, c)+ | (P _ cn _, _) <- unApply (getRetTy c),+ n `elem` hs && isConName cn (tt_ctxt ist) = False+ | Constant _ <- c = not (n `elem` hs)+ notHole _ _ = True++ -- HACK! Rather than giving a special name, better to have some kind+ -- of flag in ClassInfo structure+ chaser (UN nm)+ | ('@':'@':_) <- str nm = True -- old way+ chaser (SN (ParentN _ _)) = True+ chaser (NS n _) = chaser n+ chaser _ = False++ numclass = sNS (sUN "Num") ["Classes","Prelude"]++ addDefault t num@(P _ nc _) [P Bound a _] | nc == numclass && defaultOn+ = do focus a+ fill (RConstant (AType (ATInt ITBig))) -- default Integer+ solve+ addDefault t f as+ | all boundVar as = return () -- True -- fail $ "Can't resolve " ++ show t+ addDefault t f a = return () -- trace (show t) $ return ()++ boundVar (P Bound _ _) = True+ boundVar _ = False++ blunderbuss t d stk [] = do -- c <- get_env+ -- ps <- get_probs+ lift $ tfail $ CantResolve False topg+ blunderbuss t d stk (n:ns)+ | n /= fn -- && (n `elem` stk)+ = tryCatch (resolve n d)+ (\e -> case e of+ CantResolve True _ -> lift $ tfail e+ _ -> blunderbuss t d stk ns)+ | otherwise = blunderbuss t d stk ns++ introImps = do g <- goal+ case g of+ (Bind _ (Pi _ _ _) sc) -> do attack; intro Nothing+ num <- introImps+ return (num + 1)+ _ -> return 0++ solven 0 = return ()+ solven n = do solve; solven (n - 1)++ resolve n depth+ | depth == 0 = fail $ "Can't resolve type class"+ | otherwise+ = do lams <- introImps+ t <- goal+ let (tc, ttypes) = trace (show t) $ unApply (getRetTy t)+-- if (all boundVar ttypes) then resolveTC (depth - 1) fn insts ist+-- else do+ -- if there's a hole in the goal, don't even try+ let imps = case lookupCtxtName n (idris_implicits ist) of+ [] -> []+ [args] -> map isImp (snd args) -- won't be overloaded!+ xs -> error "The impossible happened - overloading is not expected here!"+ ps <- get_probs+ tm <- get_term+ args <- map snd <$> apply (Var n) imps+ solven lams -- close any implicit lambdas we introduced+ ps' <- get_probs+ when (length ps < length ps' || unrecoverable ps') $+ fail "Can't apply type class"+-- traceWhen (all boundVar ttypes) ("Progress: " ++ show t ++ " with " ++ show n) $+ mapM_ (\ (_,n) -> do focus n+ t' <- goal+ let (tc', ttype) = unApply (getRetTy t')+ let got = fst (unApply (getRetTy t))+ let depth' = if tc' `elem` tcs+ then depth - 1 else depth+ resTC' (got : tcs) defaultOn topholes depth' topg fn elab ist)+ (filter (\ (x, y) -> not x) (zip (map fst imps) args))+ -- if there's any arguments left, we've failed to resolve+ hs <- get_holes+ ulog <- getUnifyLog+ solve+ traceWhen ulog ("Got " ++ show n) $ return ()+ where isImp (PImp p _ _ _ _) = (True, p)+ isImp arg = (False, priority arg)++-- | Find the names of instances that have been designeated for+-- searching (i.e. non-named instances or instances from Elab scripts)+findInstances :: IState -> Term -> [Name]+findInstances ist t+ | (P _ n _, _) <- unApply (getRetTy t)+ = case lookupCtxt n (idris_classes ist) of+ [CI _ _ _ _ _ ins _] ->+ [n | (n, True) <- ins, accessible n]+ _ -> []+ | otherwise = []+ where accessible n = case lookupDefAccExact n False (tt_ctxt ist) of+ Just (_, Hidden) -> False+ _ -> True+
src/Idris/Prover.hs view
@@ -1,6 +1,14 @@ {-# LANGUAGE PatternGuards #-}-module Idris.Prover where+module Idris.Prover (prover, showProof, showRunElab) where +-- Hack for GHC 7.10 and earlier compat without CPP or warnings+-- This exludes (<$>) as fmap, because wl-pprint uses it for newline+import Prelude (Eq(..), Show(..),+ Bool(..), Either(..), Maybe(..), String,+ (.), ($), (++), (||),+ concatMap, id, elem, error, fst, flip, foldl, foldr, init,+ length, lines, map, not, null, repeat, reverse, tail, zip)+ import Idris.Core.Elaborate hiding (Tactic(..)) import Idris.Core.TT import Idris.Core.Evaluate@@ -35,15 +43,16 @@ import Util.Pretty import Debug.Trace -prover :: Bool -> Name -> Idris ()-prover lit x =+-- | Launch the proof shell+prover :: Bool -> Bool -> Name -> Idris ()+prover mode lit x = do ctxt <- getContext i <- getIState case lookupTy x ctxt of [t] -> if elem x (map fst (idris_metavars i))- then prove (idris_optimisation i) ctxt lit x t- else ifail $ show x ++ " is not a metavariable"- _ -> fail "No such metavariable"+ then prove mode (idris_optimisation i) ctxt lit x t+ else ifail $ show x ++ " is not a hole"+ _ -> fail "No such hole" showProof :: Bool -> Name -> [String] -> String showProof lit n ps@@ -53,6 +62,15 @@ where bird = if lit then "> " else "" break = "\n" ++ bird +showRunElab :: Bool -> Name -> [String] -> String+showRunElab lit n ps = birdify (displayS (renderPretty 1.0 80 doc) "")+ where doc = text (show n) <+> text "=" <+> text "%runElab" <+>+ enclose lparen rparen+ (text "do" <+> (align $ vsep (map text ps)))+ birdify = if lit+ then concatMap ("> " ++) . lines+ else id+ proverSettings :: ElabState EState -> Settings Idris proverSettings e = setComplete (proverCompletion (assumptionNames e)) defaultSettings @@ -64,18 +82,24 @@ names ((MN _ _, _) : bs) = names bs names ((n, _) : bs) = show n : names bs -prove :: Ctxt OptInfo -> Context -> Bool -> Name -> Type -> Idris ()-prove opt ctxt lit n ty+prove :: Bool -> Ctxt OptInfo -> Context -> Bool -> Name -> Type -> Idris ()+prove mode opt ctxt lit n ty = do ps <- fmap (\ist -> initElaborator n ctxt (idris_datatypes ist) ty) getIState idemodePutSExp "start-proof-mode" n- (tm, prf) <- ploop n True ("-" ++ show n) [] (ES (ps, initEState) "" Nothing) Nothing- iLOG $ "Adding " ++ show tm+ (tm, prf) <-+ if mode+ then elabloop n True ("-" ++ show n) [] (ES (ps, initEState) "" Nothing) [] Nothing []+ else ploop n True ("-" ++ show n) [] (ES (ps, initEState) "" Nothing) Nothing+ logLvl 1 $ "Adding " ++ show tm i <- getIState+ let shower = if mode+ then showRunElab+ else showProof case idris_outputmode i of- IdeMode _ _ -> idemodePutSExp "end-proof-mode" (n, showProof lit n prf)- _ -> iputStrLn $ showProof lit n prf+ IdeMode _ _ -> idemodePutSExp "end-proof-mode" (n, shower lit n prf)+ _ -> iputStrLn $ shower lit n prf let proofs = proof_list i- putIState (i { proof_list = (n, prf) : proofs })+ putIState (i { proof_list = (n, (mode, prf)) : proofs }) let tree = simpleCase False (STerm Erased) False CompileTime (fileFC "proof") [] [] [([], P Ref n ty, tm)] logLvl 3 (show tree) (ptm, pty) <- recheckC (fileFC "proof") id [] tm@@ -86,13 +110,16 @@ Error e -> ierror (CantUnify False (ty, Nothing) (pty, Nothing) e [] 0) ptm' <- applyOpts ptm ei <- getErasureInfo `fmap` getIState- updateContext (addCasedef n ei (CaseInfo True True False) False (STerm Erased) True False- [] [] -- argtys, inaccArgs- [Right (P Ref n ty, ptm)]- [([], P Ref n ty, ptm)]- [([], P Ref n ty, ptm)]- [([], P Ref n ty, ptm)]- [([], P Ref n ty, ptm')] ty)+ ctxt' <- do ctxt <- getContext+ tclift $ addCasedef n ei (CaseInfo True True False) False (STerm Erased) True False+ [] [] -- argtys, inaccArgs+ [Right (P Ref n ty, ptm)]+ [([], P Ref n ty, ptm)]+ [([], P Ref n ty, ptm)]+ [([], P Ref n ty, ptm)]+ [([], P Ref n ty, ptm')] ty+ ctxt+ setContext ctxt' solveDeferred n case idris_outputmode i of IdeMode n h ->@@ -114,16 +141,17 @@ return res ((_,_,_,_,e,_,_):_) -> lift $ Error e -dumpState :: IState -> ProofState -> Idris ()-dumpState ist ps | [] <- holes ps =+dumpState :: IState -> [(Name, Type, Term)] -> ProofState -> Idris ()+dumpState ist menv ps | [] <- holes ps = do let nm = thname ps rendered <- iRender $ prettyName True False [] nm <> colon <+> text "No more goals." iputGoal rendered-dumpState ist ps | (h : hs) <- holes ps = do+dumpState ist menv ps | (h : hs) <- holes ps = do let OK ty = goalAtFocus ps let OK env = envAtFocus ps let state = prettyOtherGoals hs <> line <>- prettyAssumptions env <> line <>+ prettyAssumptions ty env <> line <>+ prettyMetaValues (reverse menv) <> prettyGoal (zip (assumptionNames env) (repeat False)) ty rendered <- iRender state iputGoal rendered@@ -140,19 +168,37 @@ assumptionNames :: Env -> [Name] assumptionNames = map fst - prettyPs :: [(Name, Bool)] -> Env -> Doc OutputAnnotation- prettyPs bnd [] = empty- prettyPs bnd ((n@(MN _ r), _) : bs)- | r == txt "rewrite_rule" = prettyPs ((n, False):bnd) bs- prettyPs bnd ((n@(MN _ _), _) : bs)- | not (n `elem` freeEnvNames bs) = prettyPs bnd bs- prettyPs bnd ((n, Let t v) : bs) =+ prettyPs :: Binder Type -> [(Name, Bool)] -> Env -> Doc OutputAnnotation+ prettyPs g bnd [] = empty+ prettyPs g bnd ((n@(MN _ r), _) : bs)+ | r == txt "rewrite_rule" = prettyPs g ((n, False):bnd) bs+ prettyPs g bnd ((n@(MN _ _), _) : bs)+ | not (n `elem` freeEnvNames bs || n `elem` goalNames g) = prettyPs g bnd bs+ prettyPs g bnd ((n, Let t v) : bs) = line <> bindingOf n False <+> text "=" <+> tPretty bnd v <+> colon <+>- align (tPretty bnd t) <> prettyPs ((n, False):bnd) bs- prettyPs bnd ((n, b) : bs) =+ align (tPretty bnd t) <> prettyPs g ((n, False):bnd) bs+ prettyPs g bnd ((n, b) : bs) = line <> bindingOf n False <+> colon <+>- align (tPretty bnd (binderTy b)) <> prettyPs ((n, False):bnd) bs+ align (tPretty bnd (binderTy b)) <> prettyPs g ((n, False):bnd) bs + prettyMetaValues [] = empty+ prettyMetaValues mvs =+ text "---------- Meta-values: ----------" <$$>+ prettyMetaValues' [] mvs <> line <> line+ prettyMetaValues' _ [] = empty+ prettyMetaValues' bnd [mv] = ppMv bnd mv+ prettyMetaValues' bnd ((mv@(n, ty, tm)) : mvs) =+ ppMv bnd mv <$>+ prettyMetaValues' ((n, False):bnd) mvs++ ppMv bnd (n, ty, tm) = kwd "let" <+> bindingOf n False <+> colon <+>+ tPretty bnd ty <+> text "=" <+> tPretty bnd tm++ kwd = annotate AnnKeyword . text++ goalNames (Guess t v) = freeNames t ++ freeNames v+ goalNames b = freeNames (binderTy b)+ prettyG bnd (Guess t v) = tPretty bnd t <+> text "=?=" <+> tPretty bnd v prettyG bnd b = tPretty bnd $ binderTy b @@ -160,12 +206,12 @@ text "---------- Goal: ----------" <$$> bindingOf h False <+> colon <+> align (prettyG bnd ty) - prettyAssumptions env =+ prettyAssumptions g env = if length env == 0 then empty else text "---------- Assumptions: ----------" <>- nest nestingSize (prettyPs [] $ reverse env)+ nest nestingSize (prettyPs g [] $ reverse env) prettyOtherGoals hs = if length hs == 0 then@@ -205,11 +251,141 @@ Just (IdeMode.DocsFor str _) -> return (Just (":doc " ++ str)) _ -> return Nothing +data ElabShellHistory = ElabStep | LetStep | BothStep++undoStep :: [String] -> [(Name, Type, Term)] -> ElabState EState -> ElabShellHistory -> Idris ([String], [(Name, Type, Term)], ElabState EState)+undoStep prf env st ElabStep = do (_, st') <- elabStep st loadState+ return (init prf, env, st')+undoStep prf env st LetStep = return (init prf, tail env, st)+undoStep prf env st BothStep = do (_, st') <- elabStep st loadState+ return (init prf, tail env, st')++undoElab :: [String] -> [(Name, Type, Term)] -> ElabState EState -> [ElabShellHistory] -> Idris ([String], [(Name, Type, Term)], ElabState EState, [ElabShellHistory])+undoElab prf env st [] = ifail "Nothing to undo"+undoElab prf env st (h:hs) = do (prf', env', st') <- undoStep prf env st h+ return (prf', env', st', hs)++elabloop :: Name -> Bool -> String -> [String] -> ElabState EState -> [ElabShellHistory] -> Maybe History -> [(Name, Type, Term)] -> Idris (Term, [String])+elabloop fn d prompt prf e prev h env+ = do ist <- getIState+ when d $ dumpState ist env (proof e)+ (x, h') <-+ case idris_outputmode ist of+ RawOutput _ ->+ runInputT (proverSettings e) $+ do case h of+ Just history -> putHistory history+ Nothing -> return ()+ l <- getInputLine (prompt ++ "> ")+ h' <- getHistory+ return (l, Just h')+ IdeMode _ handle ->+ do isetPrompt prompt+ i <- receiveInput handle e+ return (i, h)+ (cmd, step) <- case x of+ Nothing -> do iPrintError "" ; ifail "Abandoned"+ Just input -> return (parseElabShellStep ist input, input)++ -- if we're abandoning, it has to be outside the scope of the catch+ case cmd of+ Success (Left EAbandon) -> do iPrintError ""; ifail "Abandoned"+ _ -> return ()++ (d, prev', st, done, prf', env', res) <-+ idrisCatch+ (case cmd of+ Failure err ->+ return (False, prev, e, False, prf, env, Left . Msg . show . fixColour (idris_colourRepl ist) $ err)+ Success (Left cmd') ->+ case cmd' of+ EQED -> do hs <- lifte e get_holes+ when (not (null hs)) $ ifail "Incomplete proof"+ iputStrLn "Proof completed!"+ return (False, prev, e, True, prf, env, Right $ iPrintResult "")+ EUndo -> do (prf', env', st', prev') <- undoElab prf env e prev+ return (True, prev', st', False, prf', env', Right $ iPrintResult "")+ EAbandon ->+ error "the impossible happened - should have been matched on outer scope"+ EProofState -> return (True, prev, e, False, prf, env, Right $ iPrintResult "")+ EProofTerm ->+ do tm <- lifte e get_term+ return (False, prev, e, False, prf, env, Right $ iRenderResult (text "TT:" <+> pprintTT [] tm))+ EEval tm -> do (d', st', done, prf', go) <- evalTerm e prf tm+ return (d', prev, st', done, prf', env, go)+ ECheck (PRef _ _ n) ->+ do (d', st', done, prf', go) <- checkNameType e prf n+ return (d', prev, st', done, prf', env, go)+ ECheck tm -> do (d', st', done, prf', go) <- checkType e prf tm+ return (d', prev, st', done, prf', env, go)+ ESearch ty -> do (d', st', done, prf', go) <- search e prf ty+ return (d', prev, st', done, prf', env, go)+ EDocStr d -> do (d', st', done, prf', go) <- docStr e prf d+ return (d', prev, st', done, prf', env, go)+ Success (Right cmd') ->+ case cmd' of+ DoLetP _ _ _ -> ifail "Pattern-matching let not supported here"+ DoBindP _ _ _ _ -> ifail "Pattern-matching <- not supported here"+ DoLet fc i ifc Placeholder expr ->+ do (tm, ty) <- elabVal recinfo ERHS (inLets ist env expr)+ ctxt <- getContext+ let tm' = normaliseAll ctxt [] tm+ ty' = normaliseAll ctxt [] ty+ return (True, LetStep:prev, e, False, prf ++ [step], (i, ty', tm' ) : env, Right (iPrintResult ""))+ DoLet fc i ifc ty expr ->+ do (tm, ty) <- elabVal recinfo ERHS+ (PApp NoFC (PRef NoFC [] (sUN "the"))+ [ pexp (inLets ist env ty)+ , pexp (inLets ist env expr)+ ])+ ctxt <- getContext+ let tm' = normaliseAll ctxt [] tm+ ty' = normaliseAll ctxt [] ty+ return (True, LetStep:prev, e, False, prf ++ [step], (i, ty', tm' ) : env, Right (iPrintResult ""))+ DoBind fc i ifc expr ->+ do (tm, ty) <- elabVal recinfo ERHS (inLets ist env expr)+ (_, e') <- elabStep e saveState -- enable :undo+ (res, e'') <- elabStep e' $+ runElabAction ist NoFC [] tm ["Shell"]+ ctxt <- getContext+ (v, vty) <- tclift $ check ctxt [] (forget res)+ let v' = normaliseAll ctxt [] v+ vty' = normaliseAll ctxt [] vty+ return (True, BothStep:prev, e'', False, prf ++ [step], (i, vty', v') : env, Right (iPrintResult ""))+ DoExp fc expr ->+ do (tm, ty) <- elabVal recinfo ERHS (inLets ist env expr)+ -- TODO: call elaborator with Elab () as goal here+ (_, e') <- elabStep e saveState -- enable :undo+ (_, e'') <- elabStep e' $+ runElabAction ist NoFC [] tm ["Shell"]+ return (True, ElabStep:prev, e'', False, prf ++ [step], env, Right (iPrintResult "")))+ (\err -> return (False, prev, e, False, prf, env, Left err))+ idemodePutSExp "write-proof-state" (prf', length prf')+ case res of+ Left err -> do ist <- getIState+ iRenderError $ pprintErr ist err+ elabloop fn d prompt prf' st prev' h' env'+ Right ok ->+ if done then do (tm, _) <- elabStep st get_term+ return (tm, prf')+ else do ok+ elabloop fn d prompt prf' st prev' h' env'++ where + -- A bit of a hack: wrap the value up in a let binding, which will+ -- normalise away. It would be better to figure out how to call+ -- the elaborator with a custom environment here to avoid the+ -- delab step.+ inLets :: IState -> [(Name, Type, Term)] -> PTerm -> PTerm+ inLets ist lets tm = foldr (\(n, ty, v) b -> PLet NoFC n NoFC (delab ist ty) (delab ist v) b) tm (reverse lets)+++ ploop :: Name -> Bool -> String -> [String] -> ElabState EState -> Maybe History -> Idris (Term, [String]) ploop fn d prompt prf e h = do i <- getIState let autoSolve = opt_autoSolve (idris_options i)- when d $ dumpState i (proof e)+ when d $ dumpState i [] (proof e) (x, h') <- case idris_outputmode i of RawOutput _ ->@@ -244,11 +420,11 @@ when (not (null hs)) $ ifail "Incomplete proof" iputStrLn "Proof completed!" return (False, e, True, prf, Right $ iPrintResult "")- Success (TCheck (PRef _ n)) -> checkNameType n- Success (TCheck t) -> checkType t- Success (TEval t) -> evalTerm t e- Success (TDocStr x) -> docStr x- Success (TSearch t) -> search t+ Success (TCheck (PRef _ _ n)) -> checkNameType e prf n+ Success (TCheck t) -> checkType e prf t+ Success (TEval t) -> evalTerm e prf t+ Success (TDocStr x) -> docStr e prf x+ Success (TSearch t) -> search e prf t Success tac -> do (_, e) <- elabStep e saveState (_, st) <- elabStep e (runTac autoSolve i (Just proverFC) fn tac)@@ -264,80 +440,87 @@ return (tm, prf') else do ok ploop fn d prompt prf' st h'- where envCtxt env ctxt = foldl (\c (n, b) -> addTyDecl n Bound (binderTy b) c) ctxt env- checkNameType n = do- ctxt <- getContext- ist <- getIState- imp <- impShow- idrisCatch (do- let OK env = envAtFocus (proof e)- ctxt' = envCtxt env ctxt- bnd = map (\x -> (fst x, False)) env- ist' = ist { tt_ctxt = ctxt' }- putIState ist'- -- Unlike the REPL, metavars have no special treatment, to- -- make it easier to see how to prove with them.- let action = case lookupNames n ctxt' of- [] -> iPrintError $ "No such variable " ++ show n- ts -> iPrintFunTypes bnd n (map (\n -> (n, pprintDelabTy ist' n)) ts)- putIState ist- return (False, e, False, prf, Right action))- (\err -> do putIState ist ; ierror err) - checkType t = do- ist <- getIState- ctxt <- getContext- idrisCatch (do- let OK env = envAtFocus (proof e)- ctxt' = envCtxt env ctxt- putIState ist { tt_ctxt = ctxt' }- (tm, ty) <- elabVal recinfo ERHS t- let ppo = ppOptionIst ist- ty' = normaliseC ctxt [] ty- infixes = idris_infixes ist- action = case tm of- TType _ ->- iPrintTermWithType (prettyImp ppo (PType emptyFC)) type1Doc- _ -> let bnd = map (\x -> (fst x, False)) env in- iPrintTermWithType (pprintPTerm ppo bnd [] infixes (delab ist tm))- (pprintPTerm ppo bnd [] infixes (delab ist ty))- putIState ist- return (False, e, False, prf, Right action))- (\err -> do putIState ist { tt_ctxt = ctxt } ; ierror err) - proverFC = FC "(prover shell)" (0, 0) (0, 0)+envCtxt env ctxt = foldl (\c (n, b) -> addTyDecl n Bound (binderTy b) c) ctxt env - evalTerm t e = withErrorReflection $- do ctxt <- getContext- ist <- getIState- idrisCatch (do- let OK env = envAtFocus (proof e)- ctxt' = envCtxt env ctxt- ist' = ist { tt_ctxt = ctxt' }- bnd = map (\x -> (fst x, False)) env- putIState ist'- (tm, ty) <- elabVal recinfo ERHS t- let tm' = force (normaliseAll ctxt' env tm)- ty' = force (normaliseAll ctxt' env ty)- ppo = ppOption (idris_options ist')- infixes = idris_infixes ist- tmDoc = pprintPTerm ppo bnd [] infixes (delab ist' tm')- tyDoc = pprintPTerm ppo bnd [] infixes (delab ist' ty')- action = iPrintTermWithType tmDoc tyDoc- putIState ist- return (False, e, False, prf, Right action))- (\err -> do putIState ist ; ierror err)- docStr :: Either Name Const -> Idris (Bool, ElabState EState, Bool, [String], Either Err (Idris ()))- docStr (Left n) = do ist <- getIState- idrisCatch (case lookupCtxtName n (idris_docstrings ist) of- [] -> return (False, e, False, prf,- Left . Msg $ "No documentation for " ++ show n)- ns -> do toShow <- mapM (showDoc ist) ns- return (False, e, False, prf,- Right $ iRenderResult (vsep toShow)))- (\err -> do putIState ist ; ierror err)- where showDoc ist (n, d) = do doc <- getDocs n FullDocs- return $ pprintDocs ist doc- docStr (Right c) = do ist <- getIState- return (False, e, False, prf, Right . iRenderResult $ pprintConstDocs ist c (constDocs c))- search t = return (False, e, False, prf, Right $ searchByType [] t)+checkNameType :: ElabState EState -> [String] -> Name -> Idris (Bool, ElabState EState, Bool, [String], Either Err (Idris ()))+checkNameType e prf n = do+ ctxt <- getContext+ ist <- getIState+ imp <- impShow+ idrisCatch (do+ let OK env = envAtFocus (proof e)+ ctxt' = envCtxt env ctxt+ bnd = map (\x -> (fst x, False)) env+ ist' = ist { tt_ctxt = ctxt' }+ putIState ist'+ -- Unlike the REPL, metavars have no special treatment, to+ -- make it easier to see how to prove with them.+ let action = case lookupNames n ctxt' of+ [] -> iPrintError $ "No such variable " ++ show n+ ts -> iPrintFunTypes bnd n (map (\n -> (n, pprintDelabTy ist' n)) ts)+ putIState ist+ return (False, e, False, prf, Right action))+ (\err -> do putIState ist ; ierror err)++checkType :: ElabState EState -> [String] -> PTerm -> Idris (Bool, ElabState EState, Bool, [String], Either Err (Idris ()))+checkType e prf t = do+ ist <- getIState+ ctxt <- getContext+ idrisCatch (do+ let OK env = envAtFocus (proof e)+ ctxt' = envCtxt env ctxt+ putIState ist { tt_ctxt = ctxt' }+ (tm, ty) <- elabVal recinfo ERHS t+ let ppo = ppOptionIst ist+ ty' = normaliseC ctxt [] ty+ infixes = idris_infixes ist+ action = case tm of+ TType _ ->+ iPrintTermWithType (prettyImp ppo (PType emptyFC)) type1Doc+ _ -> let bnd = map (\x -> (fst x, False)) env in+ iPrintTermWithType (pprintPTerm ppo bnd [] infixes (delab ist tm))+ (pprintPTerm ppo bnd [] infixes (delab ist ty))+ putIState ist+ return (False, e, False, prf, Right action))+ (\err -> do putIState ist { tt_ctxt = ctxt } ; ierror err)++proverFC = FC "(prover shell)" (0, 0) (0, 0)++evalTerm :: ElabState EState -> [String] -> PTerm -> Idris (Bool, ElabState EState, Bool, [String], Either Err (Idris ()))+evalTerm e prf t = withErrorReflection $+ do ctxt <- getContext+ ist <- getIState+ idrisCatch (do+ let OK env = envAtFocus (proof e)+ ctxt' = envCtxt env ctxt+ ist' = ist { tt_ctxt = ctxt' }+ bnd = map (\x -> (fst x, False)) env+ putIState ist'+ (tm, ty) <- elabVal recinfo ERHS t+ let tm' = force (normaliseAll ctxt' env tm)+ ty' = force (normaliseAll ctxt' env ty)+ ppo = ppOption (idris_options ist')+ infixes = idris_infixes ist+ tmDoc = pprintPTerm ppo bnd [] infixes (delab ist' tm')+ tyDoc = pprintPTerm ppo bnd [] infixes (delab ist' ty')+ action = iPrintTermWithType tmDoc tyDoc+ putIState ist+ return (False, e, False, prf, Right action))+ (\err -> do putIState ist ; ierror err)++docStr :: ElabState EState -> [String] -> Either Name Const -> Idris (Bool, ElabState EState, Bool, [String], Either Err (Idris ()))+docStr e prf (Left n) = do ist <- getIState+ idrisCatch (case lookupCtxtName n (idris_docstrings ist) of+ [] -> return (False, e, False, prf,+ Left . Msg $ "No documentation for " ++ show n)+ ns -> do toShow <- mapM (showDoc ist) ns+ return (False, e, False, prf,+ Right $ iRenderResult (vsep toShow)))+ (\err -> do putIState ist ; ierror err)+ where showDoc ist (n, d) = do doc <- getDocs n FullDocs+ return $ pprintDocs ist doc+docStr e prf (Right c) = do ist <- getIState+ return (False, e, False, prf, Right . iRenderResult $ pprintConstDocs ist c (constDocs c))+search e prf t = return (False, e, False, prf, Right $ searchByType [] t)
src/Idris/Providers.hs view
@@ -10,7 +10,7 @@ -- | Wrap a type provider in the type of type providers providerTy :: FC -> PTerm -> PTerm providerTy fc tm- = PApp fc (PRef fc $ sNS (sUN "Provider" ) ["Providers", "Prelude"]) [PExp 0 [] (sMN 0 "pvarg") tm]+ = PApp fc (PRef fc [] $ sNS (sUN "Provider" ) ["Providers", "Prelude"]) [PExp 0 [] (sMN 0 "pvarg") tm] ioret :: Name ioret = sUN "prim_io_return"
src/Idris/REPL.hs view
@@ -1,7 +1,9 @@ {-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, DeriveFunctor, PatternGuards, CPP #-} -module Idris.REPL where+module Idris.REPL(getClient, getPkg, getPkgCheck, getPkgClean, getPkgMkDoc,+ getPkgREPL, getPkgTest, getPort, idris, idrisMain, loadInputs,+ opt, runClient, runMain, ver) where import Idris.AbsSyntax import Idris.ASTUtils@@ -52,6 +54,7 @@ import Idris.Core.Execute (execute) import Idris.Core.TT import Idris.Core.Unify+import Idris.Core.WHNF import Idris.Core.Constraints import IRTS.Compiler@@ -68,10 +71,6 @@ import Text.Trifecta.Result(Result(..)) --- import RTS.SC--- import RTS.Bytecode--- import RTS.PreC--- import RTS.CodegenC import System.Console.Haskeline as H import System.FilePath import System.Exit@@ -115,7 +114,9 @@ then "" else showMVs colour theme mvs ++ let str = mkPrompt mods ++ ">" in- (if colour then colourisePrompt theme str else str) ++ " "+ (if colour && not isWindows+ then colourisePrompt theme str+ else str) ++ " " x <- H.catch (getInputLine prompt) (ctrlC (return Nothing)) case x of@@ -137,7 +138,7 @@ act -- repl orig mods showMVs c thm [] = ""- showMVs c thm ms = "Metavariables: " +++ showMVs c thm ms = "Holes: " ++ show' 4 c thm (map fst ms) ++ "\n" show' 0 c thm ms = let l = length ms in@@ -296,9 +297,9 @@ i <- getIState case parseCmd i "(input)" cmd of Failure err -> iPrintError $ show (fixColour False err)- Success (Right (Prove n')) ->+ Success (Right (Prove mode n')) -> idrisCatch- (do process fn (Prove n')+ (do process fn (Prove mode n') isetPrompt (mkPrompt mods) case idris_outputmode i of IdeMode n h -> -- signal completion of proof to ide@@ -347,7 +348,7 @@ case splitName name of Left err -> iPrintError err Right n -> process "(idemode)"- (Check (PRef (FC "(idemode)" (0,0) (0,0)) n))+ (Check (PRef (FC "(idemode)" (0,0) (0,0)) [] n)) runIdeModeCommand h id orig fn mods (IdeMode.DocsFor name w) = case parseConst orig name of Success c -> process "(idemode)" (DocStr (Right c) (howMuch w))@@ -367,6 +368,8 @@ process fn (AddMissing False line (sUN name)) runIdeModeCommand h id orig fn mods (IdeMode.MakeWithBlock line name) = process fn (MakeWith False line (sUN name))+runIdeModeCommand h id orig fn mods (IdeMode.MakeCaseBlock line name) =+ process fn (MakeCase False line (sUN name)) runIdeModeCommand h id orig fn mods (IdeMode.ProofSearch r line name hints depth) = doProofSearch fn False r line (sUN name) (map sUN hints) depth runIdeModeCommand h id orig fn mods (IdeMode.MakeLemma line name) =@@ -496,7 +499,7 @@ runIdeModeCommand h id orig fn modes (IdeMode.TermNormalise bnd tm) = do ctxt <- getContext ist <- getIState- let tm' = force (normaliseAll ctxt [] tm)+ let tm' = normaliseAll ctxt [] tm ptm = annotate (AnnTerm bnd tm') (pprintPTerm (ppOptionIst ist) bnd@@ -573,15 +576,17 @@ idemodeProcess :: FilePath -> Command -> Idris () idemodeProcess fn Warranty = process fn Warranty idemodeProcess fn Help = process fn Help-idemodeProcess fn (ChangeDirectory f) = do process fn (ChangeDirectory f)- iPrintResult "changed directory to"+idemodeProcess fn (ChangeDirectory f) =+ do process fn (ChangeDirectory f)+ dir <- runIO $ getCurrentDirectory+ iPrintResult $ "changed directory to " ++ dir idemodeProcess fn (ModImport f) = process fn (ModImport f) idemodeProcess fn (Eval t) = process fn (Eval t) idemodeProcess fn (NewDefn decls) = do process fn (NewDefn decls) iPrintResult "defined" idemodeProcess fn (Undefine n) = process fn (Undefine n) idemodeProcess fn (ExecVal t) = process fn (ExecVal t)-idemodeProcess fn (Check (PRef x n)) = process fn (Check (PRef x n))+idemodeProcess fn (Check (PRef x hls n)) = process fn (Check (PRef x hls n)) idemodeProcess fn (Check t) = process fn (Check t) idemodeProcess fn (Core t) = process fn (Core t) idemodeProcess fn (DocStr n w) = process fn (DocStr n w)@@ -595,7 +600,7 @@ idemodeProcess fn (Spec t) = process fn (Spec t) -- RmProof and AddProof not supported! idemodeProcess fn (ShowProof n') = process fn (ShowProof n')-idemodeProcess fn (HNF t) = process fn (HNF t)+idemodeProcess fn (WHNF t) = process fn (WHNF t) --idemodeProcess fn TTShell = process fn TTShell -- need some prove mode! idemodeProcess fn (TestInline t) = process fn (TestInline t) @@ -631,9 +636,12 @@ idemodeProcess fn (AddClauseFrom False pos str) = process fn (AddClauseFrom False pos str) idemodeProcess fn (AddMissing False pos str) = process fn (AddMissing False pos str) idemodeProcess fn (MakeWith False pos str) = process fn (MakeWith False pos str)+idemodeProcess fn (MakeCase False pos str) = process fn (MakeCase False pos str) idemodeProcess fn (DoProofSearch False r pos str xs) = process fn (DoProofSearch False r pos str xs) idemodeProcess fn (SetConsoleWidth w) = do process fn (SetConsoleWidth w) iPrintResult ""+idemodeProcess fn (SetPrinterDepth d) = do process fn (SetPrinterDepth d)+ iPrintResult "" idemodeProcess fn (Apropos pkg a) = do process fn (Apropos pkg a) iPrintResult "" idemodeProcess fn (WhoCalls n) = process fn (WhoCalls n)@@ -767,21 +775,23 @@ Just pr -> isetPrompt pr Nothing -> iPrintError $ "Can't find import " ++ f process fn (Eval t)- = withErrorReflection $ do logLvl 5 $ show t- getIState >>= flip warnDisamb t- (tm, ty) <- elabVal recinfo ERHS t- ctxt <- getContext- let tm' = force (normaliseAll ctxt [] tm)- let ty' = force (normaliseAll ctxt [] ty)- -- Add value to context, call it "it"- updateContext (addCtxtDef (sUN "it") (Function ty' tm'))- ist <- getIState- logLvl 3 $ "Raw: " ++ show (tm', ty')- logLvl 10 $ "Debug: " ++ showEnvDbg [] tm'- let tmDoc = pprintDelab ist tm'- tyDoc = pprintDelab ist ty'- iPrintTermWithType tmDoc tyDoc-+ = withErrorReflection $+ do logLvl 5 $ show t+ getIState >>= flip warnDisamb t+ (tm, ty) <- elabREPL recinfo ERHS t+ ctxt <- getContext+ let tm' = perhapsForce $ normaliseAll ctxt [] tm+ let ty' = perhapsForce $ normaliseAll ctxt [] ty+ -- Add value to context, call it "it"+ updateContext (addCtxtDef (sUN "it") (Function ty' tm'))+ ist <- getIState+ logLvl 3 $ "Raw: " ++ show (tm', ty')+ logLvl 10 $ "Debug: " ++ showEnvDbg [] tm'+ let tmDoc = pprintDelab ist tm'+ tyDoc = pprintDelab ist ty'+ iPrintTermWithType tmDoc tyDoc+ where perhapsForce tm | termSmallerThan 100 tm = force tm+ | otherwise = tm process fn (NewDefn decls) = do logLvl 3 ("Defining names using these decls: " ++ show (showDecls verbosePPOption decls))@@ -889,15 +899,15 @@ prettyIst ist (delab ist ty')) iPrintTermWithType resOut tyOut -process fn (Check (PRef _ n))+process fn (Check (PRef _ _ n)) = do ctxt <- getContext ist <- getIState let ppo = ppOptionIst ist case lookupNames n ctxt of ts@(t:_) -> case lookup t (idris_metavars ist) of- Just (_, i, _) -> iRenderResult . fmap (fancifyAnnots ist True) $- showMetavarInfo ppo ist n i+ Just (_, i, _, _) -> iRenderResult . fmap (fancifyAnnots ist True) $+ showMetavarInfo ppo ist n i Nothing -> iPrintFunTypes [] n (map (\n -> (n, pprintDelabTy ist n)) ts) [] -> iPrintError $ "No such variable " ++ show n where@@ -925,23 +935,27 @@ process fn (Check t)- = do (tm, ty) <- elabVal recinfo ERHS t+ = do (tm, ty) <- elabREPL recinfo ERHS t ctxt <- getContext ist <- getIState let ppo = ppOptionIst ist- ty' = normaliseC ctxt [] ty+ ty' = if opt_evaltypes (idris_options ist)+ then normaliseC ctxt [] ty+ else ty case tm of TType _ -> iPrintTermWithType (prettyIst ist (PType emptyFC)) type1Doc _ -> iPrintTermWithType (pprintDelab ist tm)- (pprintDelab ist ty)+ (pprintDelab ist ty') process fn (Core t)- = do (tm, ty) <- elabVal recinfo ERHS t+ = do (tm, ty) <- elabREPL recinfo ERHS t iPrintTermWithType (pprintTT [] tm) (pprintTT [] ty) process fn (DocStr (Left n) w)- = do ist <- getIState+ | UN ty <- n, ty == T.pack "Type" = getIState >>= iRenderResult . pprintTypeDoc + | otherwise = do + ist <- getIState let docs = lookupCtxtName n (idris_docstrings ist) ++ map (\(n,d)-> (n, (d, []))) (lookupCtxtName (modDocN n) (idris_moduledocs ist))@@ -1040,6 +1054,8 @@ = addMissing fn updatefile l n process fn (MakeWith updatefile l n) = makeWith fn updatefile l n+process fn (MakeCase updatefile l n)+ = makeCase fn updatefile l n process fn (MakeLemma updatefile l n) = makeLemma fn updatefile l n process fn (DoProofSearch updatefile rec l n hints)@@ -1065,7 +1081,7 @@ insertMetavar n = do i <- getIState let ms = idris_metavars i- putIState $ i { idris_metavars = (n, (Nothing, 0, False)) : ms }+ putIState $ i { idris_metavars = (n, (Nothing, 0, [], False)) : ms } process fn' (AddProof prf) = do fn <- do@@ -1086,16 +1102,20 @@ n' <- case prf of Nothing -> case proofs of [] -> ifail "No proof to add"- ((x, p) : _) -> return x+ ((x, _) : _) -> return x Just nm -> return nm n <- resolveProof n' case lookup n proofs of Nothing -> iputStrLn "No proof to add"- Just p -> do let prog' = insertScript (showProof (lit fn) n p) ls- runIO $ writeSource fn (unlines prog')- removeProof n- iputStrLn $ "Added proof " ++ show n- where ls = (lines prog)+ Just (mode, prf) ->+ do let script = if mode+ then showRunElab (lit fn) n prf+ else showProof (lit fn) n prf+ let prog' = insertScript script ls+ runIO $ writeSource fn (unlines prog')+ removeProof n+ iputStrLn $ "Added proof " ++ show n+ where ls = (lines prog) process fn (ShowProof n') = do i <- getIState@@ -1103,19 +1123,21 @@ let proofs = proof_list i case lookup n proofs of Nothing -> iPrintError "No proof to show"- Just p -> iPrintResult $ showProof False n p+ Just (m, p) -> iPrintResult $ if m+ then showRunElab False n p+ else showProof False n p -process fn (Prove n')+process fn (Prove mode n') = do ctxt <- getContext ist <- getIState let ns = lookupNames n' ctxt let metavars = mapMaybe (\n -> do c <- lookup n (idris_metavars ist); return (n, c)) ns n <- case metavars of [] -> ierror (Msg $ "Cannot find metavariable " ++ show n')- [(n, (_,_,False))] -> return n- [(_, (_,_,True))] -> ierror (Msg $ "Declarations not solvable using prover")+ [(n, (_,_,_,False))] -> return n+ [(_, (_,_,_,True))] -> ierror (Msg $ "Declarations not solvable using prover") ns -> ierror (CantResolveAlts (map fst ns))- prover (lit fn) n+ prover mode (lit fn) n -- recheck totality i <- getIState totcheck (fileFC "(input)", n)@@ -1123,11 +1145,11 @@ mapM_ checkDeclTotality (idris_totcheck i) warnTotality -process fn (HNF t)+process fn (WHNF t) = do (tm, ty) <- elabVal recinfo ERHS t ctxt <- getContext ist <- getIState- let tm' = hnf ctxt [] tm+ let tm' = whnf ctxt tm iPrintResult (show (delab ist tm')) process fn (TestInline t) = do (tm, ty) <- elabVal recinfo ERHS t@@ -1161,8 +1183,8 @@ let iface = Interface `elem` opts m <- if iface then return Nothing else do (m', _) <- elabVal recinfo ERHS- (PApp fc (PRef fc (sUN "run__IO"))- [pexp $ PRef fc (sNS (sUN "main") ["Main"])])+ (PApp fc (PRef fc [] (sUN "run__IO"))+ [pexp $ PRef fc [] (sNS (sUN "main") ["Main"])]) return (Just m') ir <- compile codegen f m i <- getIState@@ -1191,7 +1213,7 @@ Nothing -> iPrintError $ "Could not load dynamic lib \"" ++ l ++ "\"" Just x -> do let libs = idris_dynamic_libs i if x `elem` libs- then do iLOG ("Tried to load duplicate library " ++ lib_name x)+ then do logLvl 1 ("Tried to load duplicate library " ++ lib_name x) return () else putIState $ i { idris_dynamic_libs = x:libs } where trim = reverse . dropWhile isSpace . reverse . dropWhile isSpace@@ -1205,8 +1227,8 @@ = do ist <- getIState let mvs = map fst (idris_metavars ist) \\ primDefs case mvs of- [] -> iPrintError "No global metavariables to solve"- _ -> iPrintResult $ "Global metavariables:\n\t" ++ show mvs+ [] -> iPrintError "No global holes to solve"+ _ -> iPrintResult $ "Global holes:\n\t" ++ show mvs process fn NOP = return () process fn (SetOpt ErrContext) = setErrContext True@@ -1221,6 +1243,8 @@ process fn (UnsetOpt NoBanner) = setNoBanner False process fn (SetOpt WarnReach) = fmodifyState opts_idrisCmdline $ nub . (WarnReach:) process fn (UnsetOpt WarnReach) = fmodifyState opts_idrisCmdline $ delete WarnReach+process fn (SetOpt EvalTypes) = setEvalTypes True+process fn (UnsetOpt EvalTypes) = setEvalTypes False process fn (SetOpt _) = iPrintError "Not a valid option" process fn (UnsetOpt _) = iPrintError "Not a valid option"@@ -1237,7 +1261,7 @@ [] -> "No registered error handlers" handlers -> "Registered error handlers: " ++ (concat . intersperse ", " . map show) handlers process fn (SetConsoleWidth w) = setWidth w-+process fn (SetPrinterDepth d) = setDepth d process fn (Apropos pkgs a) = do orig <- getIState when (not (null pkgs)) $@@ -1333,7 +1357,7 @@ -- iputStrLn "---------------" -- showTrans i ts -process fn (PPrint fmt width (PRef _ n))+process fn (PPrint fmt width (PRef _ _ n)) = do outs <- pprintDef n iPrintResult =<< renderExternal fmt width (vsep outs) @@ -1462,8 +1486,8 @@ (map snd (take (num-1) ninputs)) input let ifiles = getModuleFiles modTree- iLOG ("MODULE TREE : " ++ show modTree)- iLOG ("RELOAD: " ++ show ifiles)+ logLvl 1 ("MODULE TREE : " ++ show modTree)+ logLvl 1 ("RELOAD: " ++ show ifiles) when (not (all ibc ifiles) || loadCode) $ tryLoad False (filter (not . ibc) ifiles) -- return the files that need rechecking@@ -1588,6 +1612,8 @@ let cgn = case opt getCodegen opts of [] -> Via "c" xs -> last xs+ let cgFlags = opt getCodegenArgs opts+ -- Now set/unset specifically chosen optimisations sequence_ (opt getOptimisation opts) script <- case opt getExecScript opts of@@ -1600,7 +1626,8 @@ when (DefaultTotal `elem` opts) $ do i <- getIState putIState (i { default_total = True })- setColourise $ not quiet && last ((not isWindows) : opt getColour opts)+ tty <- runIO $ isATTY+ setColourise $ not quiet && last (tty : opt getColour opts) @@ -1612,6 +1639,7 @@ setOutputTy outty setNoBanner nobanner setCodegen cgn+ mapM_ (addFlag cgn) cgFlags mapM_ makeOption opts -- if we have the --bytecode flag, drop into the bytecode assembler case bcs of@@ -1682,7 +1710,7 @@ -- Create Idris data dir + repl history and config dir idrisCatch (do dir <- getIdrisUserDataDir exists <- runIO $ doesDirectoryExist dir- unless exists $ iLOG ("Creating " ++ dir)+ unless exists $ logLvl 1 ("Creating " ++ dir) runIO $ createDirectoryIfMissing True (dir </> "repl")) (\e -> return ()) @@ -1826,6 +1854,9 @@ getCodegen (UseCodegen x) = Just x getCodegen _ = Nothing +getCodegenArgs :: Opt -> Maybe String+getCodegenArgs (CodegenArgs args) = Just args+getCodegenArgs _ = Nothing getConsoleWidth :: Opt -> Maybe ConsoleWidth getConsoleWidth (UseConsoleWidth x) = Just x
src/Idris/REPLParser.hs view
@@ -25,7 +25,9 @@ import qualified Data.ByteString.UTF8 as UTF8 parseCmd :: IState -> String -> String -> Result (Either String Command)-parseCmd i inputname = P.runparser pCmd i inputname . dropWhile isSpace+parseCmd i inputname = P.runparser pCmd i inputname . trim+ where trim = f . f+ where f = reverse . dropWhile isSpace type CommandTable = [ ( [String], CmdArg, String , String -> P.IdrisParser (Either String Command) ) ]@@ -39,7 +41,7 @@ | (names, args, text, _) <- parserCommandsForHelp ++ parserCommands ] parserCommandsForHelp :: CommandTable-parserCommandsForHelp = +parserCommandsForHelp = [ exprArgCmd ["t", "type"] Check "Check the type of an expression" , exprArgCmd ["core"] Core "View the core language representation of a term" , nameArgCmd ["miss", "missing"] Missing "Show missing clauses"@@ -61,9 +63,11 @@ , strArg ChangeDirectory) , (["module"], ModuleArg, "Import an extra module", moduleArg ModImport) -- NOTE: dragons , noArgCmd ["e", "edit"] Edit "Edit current file using $EDITOR or $VISUAL"- , noArgCmd ["m", "metavars"] Metavars "Show remaining proof obligations (metavariables)"+ , noArgCmd ["m", "metavars"] Metavars "Show remaining proof obligations (metavariables or holes)" , (["p", "prove"], MetaVarArg, "Prove a metavariable"- , nameArg Prove)+ , nameArg (Prove False))+ , (["elab"], MetaVarArg, "Build a metavariable using the elaboration shell"+ , nameArg (Prove True)) , (["a", "addproof"], NameArg, "Add proof to source file", cmd_addproof) , (["rmproof"], NameArg, "Remove proof from proof stack" , nameArg RmProof)@@ -82,6 +86,7 @@ , "Turn REPL colours on or off; set a specific colour" , cmd_colour) , (["consolewidth"], ConsoleWidthArg, "Set the width of the console", cmd_consolewidth)+ , (["printerdepth"], OptionalArg NumberArg, "Set the maximum pretty-printer depth (no arg for infinite)", cmd_printdepth) , noArgCmd ["q", "quit"] Quit "Exit the Idris system" , noArgCmd ["w", "warranty"] Warranty "Displays warranty information" , (["let"], ManyArgs DeclArg@@ -96,7 +101,7 @@ , cmd_pprint) ] -parserCommands = +parserCommands = [ noArgCmd ["u", "universes"] Universes "Display universe constraints" , noArgCmd ["errorhandlers"] ListErrorHandlers "List registered error handlers" @@ -106,7 +111,7 @@ , exprArgCmd ["patt"] Pattelab "(Debugging) Elaborate pattern expression" , exprArgCmd ["spec"] Spec "?"- , exprArgCmd ["hnf"] HNF "?"+ , exprArgCmd ["whnf"] WHNF "(Debugging) Show weak head normal form of an expression" , exprArgCmd ["inline"] TestInline "?" , proofArgCmd ["cs", "casesplit"] CaseSplitAt ":cs <line> <name> splits the pattern variable on the line"@@ -118,6 +123,8 @@ ":am <line> <name> adds all missing pattern matches for the name on the line" , proofArgCmd ["mw", "makewith"] MakeWith ":mw <line> <name> adds a with clause for the definition of the name on the line"+ , proofArgCmd ["mc", "makecase"] MakeCase+ ":mc <line> <name> adds a case block for the definition of the metavariable on the line" , proofArgCmd ["ml", "makelemma"] MakeLemma "?" , (["log"], NumberArg, "Set logging verbosity level", cmd_log) , (["lto", "loadto"], SeqArgs NumberArg FileArg@@ -252,6 +259,7 @@ <|> do discard (P.symbol "autosolve"); return AutoSolve <|> do discard (P.symbol "nobanner") ; return NoBanner <|> do discard (P.symbol "warnreach"); return WarnReach+ <|> do discard (P.symbol "evaltypes"); return EvalTypes proofArg :: (Bool -> Int -> Name -> Command) -> String -> P.IdrisParser (Either String Command) proofArg cmd name = do@@ -268,10 +276,15 @@ c <- fmap fst P.constant eof return $ Right (DocStr (Right c) FullDocs)+ + let pType = do+ P.reserved "Type"+ eof+ return $ Right (DocStr (Left $ P.mkName ("Type", "")) FullDocs) let fnName = fnNameArg (\n -> DocStr (Left n) FullDocs) name - try constant <|> fnName+ try constant <|> pType <|> fnName cmd_consolewidth :: String -> P.IdrisParser (Either String Command) cmd_consolewidth name = do@@ -285,24 +298,28 @@ <|> do n <- fmap (fromInteger . fst) P.natural return (ColsWide n) +cmd_printdepth :: String -> P.IdrisParser (Either String Command)+cmd_printdepth _ = do d <- optional (fmap (fromInteger . fst) P.natural)+ return (Right $ SetPrinterDepth d)+ cmd_execute :: String -> P.IdrisParser (Either String Command) cmd_execute name = do tm <- option maintm (P.fullExpr defaultSyntax) return (Right (Execute tm)) where- maintm = PRef (fileFC "(repl)") (sNS (sUN "main") ["Main"])+ maintm = PRef (fileFC "(repl)") [] (sNS (sUN "main") ["Main"]) cmd_dynamic :: String -> P.IdrisParser (Either String Command) cmd_dynamic name = do- let emptyArgs = noArgs ListDynamic name-- let oneArg = do l <- many anyChar- return $ Right (DynamicLink l)+ let optArg = do l <- many anyChar+ if (l /= "")+ then return $ Right (DynamicLink l)+ else return $ Right ListDynamic let failure = return $ Left $ "Usage is :" ++ name ++ " [<library>]" - try emptyArgs <|> try oneArg <|> failure+ try optArg <|> failure cmd_pprint :: String -> P.IdrisParser (Either String Command) cmd_pprint name = do@@ -443,14 +460,14 @@ packageBasedCmd :: P.IdrisParser a -> ([String] -> a -> Command) -> String -> P.IdrisParser (Either String Command)-packageBasedCmd valParser cmd name = do- pkgs <- option [] . try $ do- P.lchar '('- pks <- sepBy (some idChar) (P.lchar ',')- P.lchar ')'- return pks- val <- valParser- return (Right (cmd pkgs val))+packageBasedCmd valParser cmd name =+ try (do P.lchar '('+ pkgs <- sepBy (some idChar) (P.lchar ',')+ P.lchar ')'+ val <- valParser+ return (Right (cmd pkgs val)))+ <|> do val <- valParser+ return (Right (cmd [] val)) cmd_search :: String -> P.IdrisParser (Either String Command) cmd_search = packageBasedCmd
src/Idris/Reflection.hs view
@@ -6,38 +6,51 @@ module Idris.Reflection where import Control.Applicative ((<$>), (<*>), pure)-import Control.Monad (liftM, liftM2)+import Control.Monad (liftM, liftM2, liftM4) import Data.Maybe (catMaybes)-import Data.List ((\\))+import Data.List ((\\), findIndex) import qualified Data.Text as T import Idris.Core.Elaborate (claim, fill, focus, getNameFrom, initElaborator, movelast, runElab, solve)-import Idris.Core.Evaluate (Context, Def(TyDecl), initContext, lookupDefExact, lookupTyExact)+import Idris.Core.Evaluate (Def(TyDecl), initContext, lookupDefExact, lookupTyExact) import Idris.Core.TT -import Idris.AbsSyntaxTree (ElabD, IState, PArg'(..), PArg, PTactic, PTactic'(..),- PTerm(..), initEState, pairCon, pairTy)+import Idris.AbsSyntaxTree (ArgOpt(..),ElabD, IState(tt_ctxt, idris_implicits,idris_datatypes),+ PArg'(..), PArg, PTactic, PTactic'(..), PTerm(..), Fixity (..),+ initEState, pairCon, pairTy) import Idris.Delaborate (delab) -data RArg = RExplicit { argName :: Name, argTy :: Raw }- | RImplicit { argName :: Name, argTy :: Raw }- | RConstraint { argName :: Name, argTy :: Raw }+data RErasure = RErased | RNotErased deriving Show++data RPlicity = RExplicit | RImplicit | RConstraint deriving Show++data RFunArg = RFunArg { argName :: Name+ , argTy :: Raw+ , argPlicity :: RPlicity+ , erasure :: RErasure+ } deriving Show -data RTyDecl = RDeclare Name [RArg] Raw deriving Show+data RTyDecl = RDeclare Name [RFunArg] Raw deriving Show -data RTyConArg = RParameter { tcArgName :: Name, tcArgTy :: Raw }- | RIndex { tcArgName :: Name, tcArgTy :: Raw }+data RTyConArg = RParameter RFunArg+ | RIndex RFunArg deriving Show -data RDatatype = RDatatype Name [RTyConArg] Raw [(Name, Raw)] deriving Show+data RCtorArg = RCtorParameter RFunArg | RCtorField RFunArg deriving Show -rArgToPArg :: RArg -> PArg-rArgToPArg (RExplicit n _) = PExp 0 [] n Placeholder-rArgToPArg (RImplicit n _) = PImp 0 False [] n Placeholder-rArgToPArg (RConstraint n _) = PConstraint 0 [] n Placeholder+data RDatatype = RDatatype Name [RTyConArg] Raw [(Name, [RCtorArg], Raw)] deriving Show +rArgOpts :: RErasure -> [ArgOpt]+rArgOpts RErased = [InaccessibleArg]+rArgOpts _ = []++rFunArgToPArg :: RFunArg -> PArg+rFunArgToPArg (RFunArg n _ RExplicit e) = PExp 0 (rArgOpts e) n Placeholder+rFunArgToPArg (RFunArg n _ RImplicit e) = PImp 0 False (rArgOpts e) n Placeholder+rFunArgToPArg (RFunArg n _ RConstraint e) = PConstraint 0 (rArgOpts e) n Placeholder+ data RFunClause = RMkFunClause Raw Raw | RMkImpossibleClause Raw deriving Show@@ -69,7 +82,7 @@ reifyApp :: IState -> Name -> [Term] -> ElabD PTactic reifyApp ist t [l, r] | t == reflm "Try" = liftM2 Try (reify ist l) (reify ist r) reifyApp _ t [Constant (I i)]- | t == reflm "Search" = return (ProofSearch True True i Nothing [])+ | t == reflm "Search" = return (ProofSearch True True i Nothing [] []) reifyApp _ t [x] | t == reflm "Refine" = do n <- reifyTTName x return $ Refine n []@@ -81,7 +94,7 @@ | t == reflm "GoalType" = liftM (GoalType n) (reify ist x) reifyApp _ t [n] | t == reflm "Intro" = liftM (Intro . (:[])) (reifyTTName n) reifyApp ist t [t'] | t == reflm "Induction" = liftM (Induction . delab ist) (reifyTT t')-reifyApp ist t [t'] | t == reflm "Case" = liftM (Induction . delab ist) (reifyTT t')+reifyApp ist t [t'] | t == reflm "Case" = liftM (CaseTac . delab ist) (reifyTT t') reifyApp ist t [t'] | t == reflm "ApplyTactic" = liftM (ApplyTactic . delab ist) (reifyTT t') reifyApp ist t [t']@@ -109,6 +122,26 @@ | t == reflm "Fail" = fmap TFail (reifyReportParts errs) reifyApp _ f args = fail ("Unknown tactic " ++ show (f, args)) -- shouldn't happen +reifyBool :: Term -> ElabD Bool+reifyBool (P _ n _) | n == sNS (sUN "True") ["Bool", "Prelude"] = return True+ | n == sNS (sUN "False") ["Bool", "Prelude"] = return False+reifyBool tm = fail $ "Not a Boolean: " ++ show tm++reifyInt :: Term -> ElabD Int+reifyInt (Constant (I i)) = return i+reifyInt tm = fail $ "Not an Int: " ++ show tm++reifyPair :: (Term -> ElabD a) -> (Term -> ElabD b) -> Term -> ElabD (a, b)+reifyPair left right (App _ (App _ (App _ (App _ (P _ n _) _) _) x) y)+ | n == pairCon = liftM2 (,) (left x) (right y)+reifyPair left right tm = fail $ "Not a pair: " ++ show tm++reifyList :: (Term -> ElabD a) -> Term -> ElabD [a]+reifyList getElt lst =+ case unList lst of+ Nothing -> fail "Couldn't reify a list"+ Just xs -> mapM getElt xs+ reifyReportParts :: Term -> ElabD [ErrorReportPart] reifyReportParts errs = case unList errs of@@ -154,8 +187,16 @@ return $ Proj t'' i reifyTTApp t [tt] | t == reflm "TType" = liftM TType (reifyTTUExp tt)+reifyTTApp t [tt]+ | t == reflm "UType" = liftM UType (reifyUniverse tt) reifyTTApp t args = fail ("Unknown reflection term: " ++ show (t, args)) +reifyUniverse :: Term -> ElabD Universe+reifyUniverse (P _ n _) | n == reflm "AllTypes" = return AllTypes+ | n == reflm "UniqueType" = return UniqueType+ | n == reflm "NullType" = return NullType+reifyUniverse tm = fail ("Unknown reflection universe: " ++ show tm)+ -- | Reify raw terms from their reflected representation reifyRaw :: Term -> ElabD Raw reifyRaw t@(App _ _ _)@@ -272,7 +313,7 @@ reifyTTBinderApp reif f [t] | f == reflm "Hole" = liftM Hole (reif t) reifyTTBinderApp reif f [t]- | f == reflm "GHole" = liftM (GHole 0) (reif t)+ | f == reflm "GHole" = liftM (GHole 0 []) (reif t) reifyTTBinderApp reif f [x, y] | f == reflm "Guess" = liftM2 Guess (reif x) (reif y) reifyTTBinderApp reif f [t]@@ -298,7 +339,7 @@ | f == reflm "BI" = return $ c reifyTTConstApp f (Constant c@(Fl _)) | f == reflm "Fl" = return $ c-reifyTTConstApp f (Constant c@(I _))+reifyTTConstApp f (Constant c@(Ch _)) | f == reflm "Ch" = return $ c reifyTTConstApp f (Constant c@(Str _)) | f == reflm "Str" = return $ c@@ -352,11 +393,24 @@ reflectRaw :: Raw -> Raw reflectRaw = reflectRawQuote [] -claimTT :: Name -> ElabD Name-claimTT n = do n' <- getNameFrom n- claim n' (Var (sNS (sUN "TT") ["Reflection", "Language"]))- return n'+claimTy :: Name -> Raw -> ElabD Name+claimTy n ty = do n' <- getNameFrom n+ claim n' ty+ return n' +intToReflectedNat :: Int -> Raw+intToReflectedNat i = if i <= 0+ then Var (natN "Z")+ else RApp (Var (natN "S")) (intToReflectedNat (i - 1))+ where natN :: String -> Name+ natN n = sNS (sUN n) ["Nat", "Prelude"]++reflectFixity :: Fixity -> Raw+reflectFixity (Infixl p) = RApp (Var (tacN "Infixl")) (intToReflectedNat p)+reflectFixity (Infixr p) = RApp (Var (tacN "Infixr")) (intToReflectedNat p)+reflectFixity (InfixN p) = RApp (Var (tacN "InfixN")) (intToReflectedNat p)+reflectFixity (PrefixN p) = RApp (Var (tacN "PrefixN")) (intToReflectedNat p)+ -- | Convert a reflected term to a more suitable form for pattern-matching. -- In particular, the less-interesting bits are elaborated to _ patterns. This -- happens to NameTypes, universe levels, names that are bound but not used,@@ -366,7 +420,7 @@ | n `elem` unq = -- the unquoted names have been claimed as TT already - just use them do fill (Var n) ; solve | otherwise =- do tyannot <- claimTT (sMN 0 "pTyAnnot")+ do tyannot <- claimTy (sMN 0 "pTyAnnot") (Var (reflm "TT")) movelast tyannot -- use a _ pattern here nt <- getNameFrom (sMN 0 "nt") claim nt (Var (reflm "NameType"))@@ -380,7 +434,7 @@ = do fill $ reflCall "V" [RConstant (I n)] solve reflectTTQuotePattern unq (Bind n b x)- = do x' <- claimTT (sMN 0 "sc")+ = do x' <- claimTy (sMN 0 "sc") (Var (reflm "TT")) movelast x' b' <- getNameFrom (sMN 0 "binder") claim b' (RApp (Var (sNS (sUN "Binder") ["Reflection", "Language"]))@@ -400,10 +454,10 @@ Var x'] solve focus x'; reflectTTQuotePattern unq x- focus b'; reflectBinderQuotePattern reflectTTQuotePattern unq b+ focus b'; reflectBinderQuotePattern reflectTTQuotePattern (Var $ reflm "TT") unq b reflectTTQuotePattern unq (App _ f x)- = do f' <- claimTT (sMN 0 "f"); movelast f'- x' <- claimTT (sMN 0 "x"); movelast x'+ = do f' <- claimTy (sMN 0 "f") (Var (reflm "TT")) ; movelast f'+ x' <- claimTy (sMN 0 "x") (Var (reflm "TT")) ; movelast x' fill $ reflCall "App" [Var f', Var x'] solve focus f'; reflectTTQuotePattern unq f@@ -412,12 +466,12 @@ = do fill $ reflCall "TConst" [reflectConstant c] solve reflectTTQuotePattern unq (Proj t i)- = do t' <- claimTT (sMN 0 "t"); movelast t'+ = do t' <- claimTy (sMN 0 "t") (Var (reflm "TT")) ; movelast t' fill $ reflCall "Proj" [Var t', RConstant (I i)] solve focus t'; reflectTTQuotePattern unq t reflectTTQuotePattern unq (Erased)- = do erased <- claimTT (sMN 0 "erased")+ = do erased <- claimTy (sMN 0 "erased") (Var (reflm "TT")) movelast erased fill $ (Var erased) solve@@ -466,7 +520,7 @@ fill $ reflCall "RBind" [Var any, Var bH, Var scH] solve focus scH; reflectRawQuotePattern unq sc- focus bH; reflectBinderQuotePattern reflectRawQuotePattern unq b+ focus bH; reflectBinderQuotePattern reflectRawQuotePattern (Var $ reflm "Raw") unq b where freeNamesR (Var n) = [n] freeNamesR (RBind n (Let t v) body) = concat [freeNamesR v, freeNamesR body \\ [n],@@ -514,57 +568,57 @@ focus cH fill (reflectConstant c); solve -reflectBinderQuotePattern :: ([Name] -> a -> ElabD ()) -> [Name] -> Binder a -> ElabD ()-reflectBinderQuotePattern q unq (Lam t)- = do t' <- claimTT (sMN 0 "ty"); movelast t'- fill $ reflCall "Lam" [Var (reflm "TT"), Var t']+reflectBinderQuotePattern :: ([Name] -> a -> ElabD ()) -> Raw -> [Name] -> Binder a -> ElabD ()+reflectBinderQuotePattern q ty unq (Lam t)+ = do t' <- claimTy (sMN 0 "ty") ty; movelast t'+ fill $ reflCall "Lam" [ty, Var t'] solve focus t'; q unq t-reflectBinderQuotePattern q unq (Pi _ t k)- = do t' <- claimTT (sMN 0 "ty") ; movelast t'- k' <- claimTT (sMN 0 "k"); movelast k';- fill $ reflCall "Pi" [Var (reflm "TT"), Var t', Var k']+reflectBinderQuotePattern q ty unq (Pi _ t k)+ = do t' <- claimTy (sMN 0 "ty") ty; movelast t'+ k' <- claimTy (sMN 0 "k") ty; movelast k';+ fill $ reflCall "Pi" [ty, Var t', Var k'] solve focus t'; q unq t-reflectBinderQuotePattern q unq (Let x y)- = do x' <- claimTT (sMN 0 "ty"); movelast x';- y' <- claimTT (sMN 0 "v"); movelast y';- fill $ reflCall "Let" [Var (reflm "TT"), Var x', Var y']+reflectBinderQuotePattern q ty unq (Let x y)+ = do x' <- claimTy (sMN 0 "ty") ty; movelast x';+ y' <- claimTy (sMN 0 "v")ty; movelast y';+ fill $ reflCall "Let" [ty, Var x', Var y'] solve focus x'; q unq x focus y'; q unq y-reflectBinderQuotePattern q unq (NLet x y)- = do x' <- claimTT (sMN 0 "ty"); movelast x'- y' <- claimTT (sMN 0 "v"); movelast y'- fill $ reflCall "NLet" [Var (reflm "TT"), Var x', Var y']+reflectBinderQuotePattern q ty unq (NLet x y)+ = do x' <- claimTy (sMN 0 "ty") ty; movelast x'+ y' <- claimTy (sMN 0 "v") ty; movelast y'+ fill $ reflCall "NLet" [ty, Var x', Var y'] solve focus x'; q unq x focus y'; q unq y-reflectBinderQuotePattern q unq (Hole t)- = do t' <- claimTT (sMN 0 "ty"); movelast t'- fill $ reflCall "Hole" [Var (reflm "TT"), Var t']+reflectBinderQuotePattern q ty unq (Hole t)+ = do t' <- claimTy (sMN 0 "ty") ty; movelast t'+ fill $ reflCall "Hole" [ty, Var t'] solve focus t'; q unq t-reflectBinderQuotePattern q unq (GHole _ t)- = do t' <- claimTT (sMN 0 "ty"); movelast t'- fill $ reflCall "GHole" [Var (reflm "TT"), Var t']+reflectBinderQuotePattern q ty unq (GHole _ _ t)+ = do t' <- claimTy (sMN 0 "ty") ty; movelast t'+ fill $ reflCall "GHole" [ty, Var t'] solve focus t'; q unq t-reflectBinderQuotePattern q unq (Guess x y)- = do x' <- claimTT (sMN 0 "ty"); movelast x'- y' <- claimTT (sMN 0 "v"); movelast y'- fill $ reflCall "Guess" [Var (reflm "TT"), Var x', Var y']+reflectBinderQuotePattern q ty unq (Guess x y)+ = do x' <- claimTy (sMN 0 "ty") ty; movelast x'+ y' <- claimTy (sMN 0 "v") ty; movelast y'+ fill $ reflCall "Guess" [ty, Var x', Var y'] solve focus x'; q unq x focus y'; q unq y-reflectBinderQuotePattern q unq (PVar t)- = do t' <- claimTT (sMN 0 "ty"); movelast t'- fill $ reflCall "PVar" [Var (reflm "TT"), Var t']+reflectBinderQuotePattern q ty unq (PVar t)+ = do t' <- claimTy (sMN 0 "ty") ty; movelast t'+ fill $ reflCall "PVar" [ty, Var t'] solve focus t'; q unq t-reflectBinderQuotePattern q unq (PVTy t)- = do t' <- claimTT (sMN 0 "ty"); movelast t'- fill $ reflCall "PVTy" [Var (reflm "TT"), Var t']+reflectBinderQuotePattern q ty unq (PVTy t)+ = do t' <- claimTy (sMN 0 "ty") ty; movelast t'+ fill $ reflCall "PVTy" [ty, Var t'] solve focus t'; q unq t @@ -696,7 +750,7 @@ = reflCall "NLet" [Var ty, q unq x, q unq y] reflectBinderQuote q ty unq (Hole t) = reflCall "Hole" [Var ty, q unq t]-reflectBinderQuote q ty unq (GHole _ t)+reflectBinderQuote q ty unq (GHole _ _ t) = reflCall "GHole" [Var ty, q unq t] reflectBinderQuote q ty unq (Guess x y) = reflCall "Guess" [Var ty, q unq x, q unq y]@@ -760,6 +814,9 @@ emptyEnvList = raw_apply (Var (sNS (sUN "Nil") ["List", "Prelude"])) [envTupleType] +reifyEnv :: Term -> ElabD Env+reifyEnv = reifyList (reifyPair reifyTTName (reifyTTBinder reifyTT (reflm "TT")))+ -- | Reflect an error into the internal datatype of Idris -- TODO rawBool :: Bool -> Raw rawBool True = Var (sNS (sUN "True") ["Bool", "Prelude"])@@ -780,6 +837,13 @@ rawPair :: (Raw, Raw) -> (Raw, Raw) -> Raw rawPair (a, b) (x, y) = raw_apply (Var pairCon) [a, b, x, y] +-- | Idris tuples nest to the right+rawTripleTy :: Raw -> Raw -> Raw -> Raw+rawTripleTy a b c = rawPairTy a (rawPairTy b c)++rawTriple :: (Raw, Raw, Raw) -> (Raw, Raw, Raw) -> Raw+rawTriple (a, b, c) (x, y, z) = rawPair (a, rawPairTy b c) (x, rawPair (b, c) (y, z))+ reflectCtxt :: [(Name, Type)] -> Raw reflectCtxt ctxt = rawList (rawPairTy (Var $ reflm "TTName") (Var $ reflm "TT")) (map (\ (n, t) -> (rawPair (Var $ reflm "TTName", Var $ reflm "TT")@@ -914,6 +978,14 @@ " when reflecting an error:" ++ show e OK (tm', _) -> Right $ TermPart tm' reifyReportPart (App _ (P (DCon _ _ _) n _) tm)+ | n == reflm "RawPart" =+ case runElab initEState (reifyRaw tm) (initElaborator NErased initContext emptyContext Erased) of+ Error e -> Left . InternalMsg $+ "could not reify reflected raw term " +++ show tm +++ " when reflecting an error: " ++ show e+ OK (tm', _) -> Right $ RawPart tm'+reifyReportPart (App _ (P (DCon _ _ _) n _) tm) | n == reflm "SubReport" = case unList tm of Just xs -> do subParts <- mapM reifyReportPart xs@@ -921,26 +993,37 @@ Nothing -> Left . InternalMsg $ "could not reify subreport " ++ show tm reifyReportPart x = Left . InternalMsg $ "could not reify " ++ show x +reifyErasure :: Term -> ElabD RErasure+reifyErasure (P (DCon _ _ _) n _)+ | n == tacN "Erased" = return RErased+ | n == tacN "NotErased" = return RNotErased+reifyErasure tm = fail $ "Can't reify " ++ show tm ++ " as erasure info."++reifyPlicity :: Term -> ElabD RPlicity+reifyPlicity (P (DCon _ _ _) n _)+ | n == tacN "Explicit" = return RExplicit+ | n == tacN "Implicit" = return RImplicit+ | n == tacN "Constraint" = return RConstraint+reifyPlicity tm = fail $ "Couldn't reify " ++ show tm ++ " as RPlicity."++reifyRFunArg :: Term -> ElabD RFunArg+reifyRFunArg (App _ (App _ (App _ (App _ (P (DCon _ _ _) n _) argN) argTy) argPl) argE)+ | n == tacN "MkFunArg" = liftM4 RFunArg+ (reifyTTName argN)+ (reifyRaw argTy)+ (reifyPlicity argPl)+ (reifyErasure argE)+reifyRFunArg aTm = fail $ "Couldn't reify " ++ show aTm ++ " as an RArg."+ reifyTyDecl :: Term -> ElabD RTyDecl reifyTyDecl (App _ (App _ (App _ (P (DCon _ _ _) n _) tyN) args) ret) | n == tacN "Declare" = do tyN' <- reifyTTName tyN args' <- case unList args of Nothing -> fail $ "Couldn't reify " ++ show args ++ " as an arglist."- Just xs -> mapM reifyRArg xs+ Just xs -> mapM reifyRFunArg xs ret' <- reifyRaw ret return $ RDeclare tyN' args' ret'- where reifyRArg :: Term -> ElabD RArg- reifyRArg (App _ (App _ (P (DCon _ _ _) n _) argN) argTy)- | n == tacN "Explicit" = liftM2 RExplicit- (reifyTTName argN)- (reifyRaw argTy)- | n == tacN "Implicit" = liftM2 RImplicit- (reifyTTName argN)- (reifyRaw argTy) | n == tacN "Constraint" = liftM2 RConstraint- (reifyTTName argN)- (reifyRaw argTy)- reifyRArg aTm = fail $ "Couldn't reify " ++ show aTm ++ " as an RArg." reifyTyDecl tm = fail $ "Couldn't reify " ++ show tm ++ " as a type declaration." reifyFunDefn :: Term -> ElabD RFunDefn@@ -967,38 +1050,113 @@ , (RApp (Var $ reflm "Binder") (Var $ reflm "TT")) ] +-- | Apply Idris's implicit info to get a signature. The [PArg] should+-- come from a lookup in idris_implicits on IState.+getArgs :: [PArg] -> Raw -> ([RFunArg], Raw)+getArgs [] r = ([], r)+getArgs (a:as) (RBind n (Pi _ ty _) sc) =+ let (args, res) = getArgs as sc+ erased = if InaccessibleArg `elem` argopts a then RErased else RNotErased+ arg' = case a of+ PImp {} -> RFunArg n ty RImplicit erased+ PExp {} -> RFunArg n ty RExplicit erased+ PConstraint {} -> RFunArg n ty RConstraint erased+ PTacImplicit {} -> RFunArg n ty RImplicit erased+ in (arg':args, res)+getArgs _ r = ([], r)++unApplyRaw :: Raw -> (Raw, [Raw])+unApplyRaw tm = ua [] tm+ where+ ua args (RApp f a) = ua (a:args) f+ ua args t = (t, args)+ -- | Build the reflected datatype definition(s) that correspond(s) to -- a provided unqualified name-buildDatatypes :: Context -> Ctxt TypeInfo -> Name -> [RDatatype]-buildDatatypes ctxt datatypes n =+buildDatatypes :: IState -> Name -> [RDatatype]+buildDatatypes ist n = catMaybes [ mkDataType dn ti | (dn, ti) <- lookupCtxtName n datatypes ]- where mkDataType name (TI {param_pos = params, con_names = constrs}) =+ where datatypes = idris_datatypes ist+ ctxt = tt_ctxt ist+ impls = idris_implicits ist++ ctorSig params cn = do cty <- fmap forget (lookupTyExact cn ctxt)+ argInfo <- lookupCtxtExact cn impls+ let (args, res) = getArgs argInfo cty+ return (cn, ctorArgsStatus args res params, res)++ argPos n [] res = findPos n res+ where findPos n app = case unApplyRaw app of+ (_, argL) -> findIndex (== Var n) argL+ argPos n (arg:args) res = if n == argName arg+ then Nothing+ else argPos n args res++ ctorArgsStatus :: [RFunArg] -> Raw -> [Int] -> [RCtorArg]+ ctorArgsStatus [] _ _ = []+ ctorArgsStatus (arg:args) res params =+ case argPos (argName arg) args res of+ Nothing -> RCtorField arg : ctorArgsStatus args res params+ Just i -> if i `elem` params+ then RCtorParameter arg : ctorArgsStatus args res params+ else RCtorField arg : ctorArgsStatus args res params++ mkDataType name (TI {param_pos = params, con_names = constrs}) = do (TyDecl (TCon _ _) ty) <- lookupDefExact name ctxt- let (tcargs, tcres) = getArgs params (forget ty) 0- conTys <- mapM (fmap forget . flip lookupTyExact ctxt) constrs- return $ RDatatype name tcargs tcres $ zip constrs conTys+ implInfo <- lookupCtxtExact name impls+ let (tcargs, tcres) = getTCArgs params implInfo (forget ty)+ ctors <- mapM (ctorSig params) constrs+ return $ RDatatype name tcargs tcres ctors - getArgs params (RBind an (Pi _ ty _) body) i =- let (args, res) = getArgs params body (i+1)- in if i `elem` params- then (RParameter an ty : args, res )- else (RIndex an ty : args, res)- getArgs _ tm _ = ([], tm)+ getTCArgs :: [Int] -> [PArg] -> Raw -> ([RTyConArg], Raw)+ getTCArgs params implInfo tcTy =+ let (args, res) = getArgs implInfo tcTy+ in (tcArg args 0, res)+ where tcArg [] _ = []+ tcArg (arg:args) i | i `elem` params = RParameter arg : tcArg args (i+1)+ | otherwise = RIndex arg : tcArg args (i+1) ++reflectErasure :: RErasure -> Raw+reflectErasure RErased = Var (tacN "Erased")+reflectErasure RNotErased = Var (tacN "NotErased")++reflectPlicity :: RPlicity -> Raw+reflectPlicity RExplicit = Var (tacN "Explicit")+reflectPlicity RImplicit = Var (tacN "Implicit")+reflectPlicity RConstraint = Var (tacN "Constraint")++reflectArg :: RFunArg -> Raw+reflectArg (RFunArg n ty plic erasure) =+ RApp (RApp (RApp (RApp (Var $ tacN "MkFunArg") (reflectName n))+ (reflectRaw ty))+ (reflectPlicity plic))+ (reflectErasure erasure)++reflectCtorArg :: RCtorArg -> Raw+reflectCtorArg (RCtorParameter arg) = RApp (Var $ tacN "CtorParameter") (reflectArg arg)+reflectCtorArg (RCtorField arg) = RApp (Var $ tacN "CtorField") (reflectArg arg)+ reflectDatatype :: RDatatype -> Raw reflectDatatype (RDatatype tyn tyConArgs tyConRes constrs) = raw_apply (Var $ tacN "MkDatatype") [ reflectName tyn , rawList (Var $ tacN "TyConArg") (map reflectConArg tyConArgs) , reflectRaw tyConRes- , rawList (rawPairTy (Var $ reflm "TTName") (Var $ reflm "Raw"))- [ rawPair ((Var $ reflm "TTName"), (Var $ reflm "Raw"))- (reflectName cn, reflectRaw cty)- | (cn, cty) <- constrs+ , rawList (rawTripleTy (Var $ reflm "TTName")+ (RApp (Var (sNS (sUN "List") ["List", "Prelude"])) (Var $ tacN "CtorArg"))+ (Var $ reflm "Raw"))+ [ rawTriple ((Var $ reflm "TTName"),+ (RApp (Var (sNS (sUN "List") ["List", "Prelude"])) (Var $ tacN "CtorArg")),+ (Var $ reflm "Raw"))+ (reflectName cn,+ rawList (Var $ tacN "CtorArg") (map reflectCtorArg cargs),+ reflectRaw cty)+ | (cn, cargs, cty) <- constrs ] ]- where reflectConArg (RParameter n t) =- raw_apply (Var $ tacN "Parameter") [reflectName n, reflectRaw t]- reflectConArg (RIndex n t) =- raw_apply (Var $ tacN "Index") [reflectName n, reflectRaw t]+ where reflectConArg (RParameter a) =+ RApp (Var $ tacN "TyConParameter") (reflectArg a)+ reflectConArg (RIndex a) =+ RApp (Var $ tacN "TyConIndex") (reflectArg a)
src/Pkg/PParser.hs view
@@ -66,10 +66,7 @@ pClause = do reserved "executable"; lchar '='; exec <- fst <$> iName [] st <- get- put (st { execout = Just (if isWindows- then ((show exec) ++ ".exe")- else ( show exec )- ) })+ put (st { execout = Just (show exec) }) <|> do reserved "main"; lchar '='; main <- fst <$> iName [] st <- get
src/Pkg/Package.hs view
@@ -42,20 +42,19 @@ buildPkg :: Bool -> (Bool, FilePath) -> IO () buildPkg warnonly (install, fp) = do pkgdesc <- parseDesc fp+ dir <- getCurrentDirectory let idx = PkgIndex (pkgIndex (pkgname pkgdesc)) ok <- mapM (testLib warnonly (pkgname pkgdesc)) (libdeps pkgdesc) when (and ok) $- do dir <- getCurrentDirectory- setCurrentDirectory $ dir </> sourcedir pkgdesc- make (makefile pkgdesc)- m_ist <- case (execout pkgdesc) of- Nothing -> buildMods (idx : NoREPL : Verbose : idris_opts pkgdesc)- (modules pkgdesc)- Just o -> do let exec = dir </> o- buildMods- (idx : NoREPL : Verbose : Output exec : idris_opts pkgdesc)- [idris_main pkgdesc]- setCurrentDirectory dir+ do m_ist <- inPkgDir pkgdesc $+ do make (makefile pkgdesc)+ case (execout pkgdesc) of+ Nothing -> buildMods (idx : NoREPL : Verbose : idris_opts pkgdesc)+ (modules pkgdesc)+ Just o -> do let exec = dir </> o+ buildMods+ (idx : NoREPL : Verbose : Output exec : idris_opts pkgdesc)+ [idris_main pkgdesc] case m_ist of Nothing -> exitWith (ExitFailure 1) Just ist -> do@@ -77,12 +76,10 @@ = do pkgdesc <- parseDesc fpath ok <- mapM (testLib warnonly (pkgname pkgdesc)) (libdeps pkgdesc) when (and ok) $- do dir <- getCurrentDirectory- setCurrentDirectory $ dir </> sourcedir pkgdesc- make (makefile pkgdesc)- res <- buildMods (NoREPL : Verbose : idris_opts pkgdesc)- (modules pkgdesc)- setCurrentDirectory dir+ do res <- inPkgDir pkgdesc $+ do make (makefile pkgdesc)+ buildMods (NoREPL : Verbose : idris_opts pkgdesc)+ (modules pkgdesc) when quit $ case res of Nothing -> exitWith (ExitFailure 1) Just res' -> do@@ -115,13 +112,13 @@ cleanPkg fp = do pkgdesc <- parseDesc fp dir <- getCurrentDirectory- setCurrentDirectory $ dir </> sourcedir pkgdesc- clean (makefile pkgdesc)- mapM_ rmIBC (modules pkgdesc)- rmIdx (pkgname pkgdesc)- case execout pkgdesc of- Nothing -> return ()- Just s -> rmFile $ dir </> s+ inPkgDir pkgdesc $+ do clean (makefile pkgdesc)+ mapM_ rmIBC (modules pkgdesc)+ rmIdx (pkgname pkgdesc)+ case execout pkgdesc of+ Nothing -> return ()+ Just s -> rmFile $ dir </> s -- | Generate IdrisDoc for package -- TODO: Handle case where module does not contain a matching namespace@@ -135,17 +132,17 @@ do pkgdesc <- parseDesc fp cd <- getCurrentDirectory let pkgDir = cd </> takeDirectory fp- outputDir = cd </> (pkgname pkgdesc) ++ "_doc"+ outputDir = cd </> pkgname pkgdesc ++ "_doc" opts = NoREPL : Verbose : idris_opts pkgdesc mods = modules pkgdesc fs = map (foldl1' (</>) . splitOn "." . showCG) mods setCurrentDirectory $ pkgDir </> sourcedir pkgdesc make (makefile pkgdesc)- setCurrentDirectory $ pkgDir+ setCurrentDirectory pkgDir let run l = runExceptT . execStateT l load [] = return () load (f:fs) = do loadModule f; load fs- loader = do idrisMain opts; load fs+ loader = do idrisMain opts; addImportDir (sourcedir pkgdesc); load fs idrisInstance <- run loader idrisInit setCurrentDirectory cd case idrisInstance of@@ -163,26 +160,25 @@ = do pkgdesc <- parseDesc fp ok <- mapM (testLib True (pkgname pkgdesc)) (libdeps pkgdesc) when (and ok) $- do dir <- getCurrentDirectory- setCurrentDirectory $ dir </> sourcedir pkgdesc- make (makefile pkgdesc)- -- Get a temporary file to save the tests' source in- (tmpn, tmph) <- tempIdr- hPutStrLn tmph $- "module Test_______\n" ++- concat ["import " ++ show m ++ "\n"- | m <- modules pkgdesc] ++- "namespace Main\n" ++- " main : IO ()\n" ++- " main = do " ++- concat [show t ++ "\n "- | t <- idris_tests pkgdesc]- hClose tmph- (tmpn', tmph') <- tempfile- hClose tmph'- m_ist <- idris (Filename tmpn : NoREPL : Verbose : Output tmpn' : idris_opts pkgdesc)- rawSystem tmpn' []- setCurrentDirectory dir+ do m_ist <- inPkgDir pkgdesc $+ do make (makefile pkgdesc)+ -- Get a temporary file to save the tests' source in+ (tmpn, tmph) <- tempIdr+ hPutStrLn tmph $+ "module Test_______\n" +++ concat ["import " ++ show m ++ "\n"+ | m <- modules pkgdesc] +++ "namespace Main\n" +++ " main : IO ()\n" +++ " main = do " +++ concat [show t ++ "\n "+ | t <- idris_tests pkgdesc]+ hClose tmph+ (tmpn', tmph') <- tempfile+ hClose tmph'+ m_ist <- idris (Filename tmpn : NoREPL : Verbose : Output tmpn' : idris_opts pkgdesc)+ rawSystem tmpn' []+ return m_ist case m_ist of Nothing -> exitWith (ExitFailure 1) Just ist -> do@@ -197,13 +193,12 @@ -- | Install package installPkg :: PkgDesc -> IO () installPkg pkgdesc- = do dir <- getCurrentDirectory- setCurrentDirectory $ dir </> sourcedir pkgdesc- case (execout pkgdesc) of+ = inPkgDir pkgdesc $+ do case (execout pkgdesc) of Nothing -> do mapM_ (installIBC (pkgname pkgdesc)) (modules pkgdesc) installIdx (pkgname pkgdesc) Just o -> return () -- do nothing, keep executable locally, for noe- mapM_ (installObj (pkgname pkgdesc)) (objs pkgdesc)+ mapM_ (installObj (pkgname pkgdesc)) (objs pkgdesc) -- ---------------------------------------------------------- [ Helper Methods ] -- Methods for building, testing, installing, and removal of idris@@ -274,6 +269,18 @@ #else mkDirCmd = "mkdir -p " #endif++inPkgDir :: PkgDesc -> IO a -> IO a+inPkgDir pkgdesc action =+ do dir <- getCurrentDirectory+ when (sourcedir pkgdesc /= "") $+ do putStrLn $ "Entering directory `" ++ ("." </> sourcedir pkgdesc) ++ "'"+ setCurrentDirectory $ dir </> sourcedir pkgdesc+ res <- action+ when (sourcedir pkgdesc /= "") $+ do putStrLn $ "Leaving directory `" ++ ("." </> sourcedir pkgdesc) ++ "'"+ setCurrentDirectory dir+ return res -- ------------------------------------------------------- [ Makefile Commands ] -- | Invoke a Makefile's default target.
src/Util/ScreenSize.hs view
@@ -1,5 +1,5 @@ {-# LANGUAGE CPP #-}-module Util.ScreenSize where+module Util.ScreenSize(getScreenWidth) where import Debug.Trace
src/Util/System.hs view
@@ -1,9 +1,17 @@-{-# LANGUAGE CPP #-}+{-# LANGUAGE CPP, ForeignFunctionInterface #-} module Util.System(tempfile,withTempdir,rmFile,catchIO, isWindows,- writeSource, readSource, setupBundledCC) where+ writeSource, writeSourceText, readSource,+ setupBundledCC, isATTY) where -- System helper functions.++import Control.Exception as CE import Control.Monad (when)+import qualified Data.Text as T+import qualified Data.Text.IO as TIO++import Foreign.C+ import System.Directory (getTemporaryDirectory , removeFile , removeDirectoryRecursive@@ -14,7 +22,6 @@ import System.IO import System.Info import System.IO.Error-import Control.Exception as CE #ifdef FREESTANDING import Tools_idris@@ -43,6 +50,17 @@ -- | Write a source file, same as writeFile except the encoding is set to utf-8 writeSource :: FilePath -> String -> IO () writeSource f s = withFile f WriteMode (\h -> hSetEncoding h utf8 >> hPutStr h s)++-- | Write a utf-8 source file from Text+writeSourceText :: FilePath -> T.Text -> IO ()+writeSourceText f s = withFile f WriteMode (\h -> hSetEncoding h utf8 >> TIO.hPutStr h s)++foreign import ccall "isatty" isATTYRaw :: CInt -> IO CInt++isATTY :: IO Bool+isATTY = do+ tty <- isATTYRaw 1 -- fd stdout+ return $ tty /= 0 withTempdir :: String -> (FilePath -> IO a) -> IO a withTempdir subdir callback
− src/Util/Zlib.hs
@@ -1,15 +0,0 @@-module Util.Zlib (decompressEither) where---- From http://stackoverflow.com/questions/10043102/how-to-catch-the-decompress-ioerror/10045963#10045963-import Codec.Compression.Zlib.Internal-import Data.ByteString.Lazy (ByteString, fromChunks)-import Control.Arrow (right)--decompressEither :: ByteString -> Either (DecompressError, String) ByteString-decompressEither = finalise- . foldDecompressStream cons nil err- . decompressWithErrors zlibFormat defaultDecompressParams- where err errorCode errorString = Left (errorCode, errorString)- nil = Right []- cons chunk = right (chunk :)- finalise = right fromChunks
test/Makefile view
@@ -8,7 +8,7 @@ @perl ./runtest.pl $(patsubst %.test,%,$@) test_js:- @perl ./runtest.pl without disambig001 sugar004 reg029 reg052 io001 dsl002 io003 effects001 effects002 effects003 effects004 basic007 basic011 primitives004 ffi006 --codegen node+ @perl ./runtest.pl without sugar004 reg029 reg052 io001 dsl002 io003 effects001 effects002 basic007 basic011 ffi006 --codegen node update: /usr/bin/env perl ./runtest.pl all -u
test/basic006/expected view
@@ -1,8 +1,8 @@-test020a.idr:16:18:When elaborating right hand side of foo:-When elaborating an application of function Prelude.List.reverse:- Can't unify+test020a.idr:16:18:When checking right hand side of foo:+When checking an application of function Prelude.List.reverse:+ Type mismatch between Vect n a (Type of xs)- with+ and List a (Expected type) [3, 2, 1] "Number 42"
test/basic009/expected view
@@ -1,4 +1,4 @@ MAIN-PASS-Faulty.idr:6:7:When elaborating type of Faulty.fault:+Faulty.idr:6:7:When checking type of Faulty.fault: Can't disambiguate name: A.num, B.C.num Multiple.idr:3:1:import alias not unique: "X"
test/classes001/expected view
@@ -8,6 +8,7 @@ myShow : MyShow a => (x : a) -> String The shower + The function is Total Instance constructor: MkMyShow : (myShow : a -> String) -> MyShow a Build a MyShow@@ -25,3 +26,4 @@ myShow : a -> String -- The shower + The function is Total
− test/disambig001/disambig001.idr
@@ -1,12 +0,0 @@-module Main--import Prelude.Monad--import System-import Effect.System--main : IO ()-main = do - args <- System.getArgs- putStrLn (concat (drop 1 args))-
− test/disambig001/expected
@@ -1,1 +0,0 @@-foobar
− test/disambig001/run
@@ -1,4 +0,0 @@-#!/usr/bin/env bash-idris $@ disambig001.idr -p effects -o disambig001-./disambig001 foo bar-rm -f disambig001 *.ibc
test/docs001/expected view
@@ -8,6 +8,7 @@ m : C t => t member of class + The function is Total Instances: C A instance of class
test/docs002/expected view
@@ -1,9 +1,12 @@ T1 : Type Some documentation + The function is Total T2 : Type Some other documentation + The function is Total T3 : Int Some provided postulate + The function is not yet checked for totality
test/docs003/expected view
@@ -8,13 +8,14 @@ map : Functor f => (m : a -> b) -> f a -> f b The action of the functor on morphisms + The function is Total Instances: Functor List+ Functor (IO' ffi) Functor Stream Functor Provider Functor Binder Functor PrimIO- Functor (IO' ffi) Functor Maybe Functor (Either e) @@ -27,10 +28,10 @@ Traversable f Applicative f Named instance:- mine : Functor List+ docs003.mine : Functor List Named instance:- another : Functor List+ docs003.another : Functor List More functors!
test/dsl002/Resimp.idr view
@@ -1,6 +1,6 @@ module Resimp -import Data.Vect+import public Data.Vect import public Data.Fin -- IO operations which read a resource
+ test/dsl004/Door0.idr view
@@ -0,0 +1,33 @@+import IOu++data Result : (a : Type) -> (a -> Type) -> Type* where+ Res : {k : a -> Type} -> (val : a) -> k val -> Result a k++++++++------+data DoorState = OPEN | CLOSED++data DoorH : DoorState -> Type where+ MkDH : {s : DoorState} -> DoorH s++data DoorCmd : Type -> Type where+ Open : DoorH CLOSED -> DoorCmd (DoorH OPEN)+ Knock : DoorH CLOSED -> DoorCmd (DoorH CLOSED)+ Close : DoorH OPEN -> DoorCmd (DoorH CLOSED)++data DoorLang : Type -> Type where+ Return : a -> DoorLang a+ Action : DoorCmd a -> DoorLang a+ (>>=) : DoorLang a -> (a -> DoorLang b) -> DoorLang b++testProg : DoorH CLOSED -> DoorLang ()+testProg h = do h <- Action (Knock h)+ h <- Action (Open h)+ h <- Action (Close h)+ Return ()+
+ test/dsl004/Door1.idr view
@@ -0,0 +1,37 @@+import IOu++import Data.Vect++data Result : (a : AnyType) -> (a -> AnyType) -> AnyType where+ Res : {k : a -> AnyType} -> (val : a) -> (h : k val) -> Result a k++++++------+data DoorState = OPEN | CLOSED++data DoorH : DoorState -> UniqueType where+ MkDH : DoorH s++data DoorCmd : AnyType -> AnyType where+ Open : DoorH CLOSED -> DoorCmd (DoorH OPEN)+ Knock : DoorH CLOSED -> DoorCmd (DoorH CLOSED)+ Close : DoorH OPEN -> DoorCmd (DoorH CLOSED)++data DoorLang : AnyType -> AnyType where+ Return : {a : AnyType} -> a -> DoorLang a+ Action : DoorCmd a -> DoorLang a+ (>>=) : DoorLang a -> (a -> DoorLang b) -> DoorLang b++implicit+action : DoorCmd a -> DoorLang a+action = Action++testProg : DoorH CLOSED -> DoorLang ()+testProg h = with Main, Show do -- h <- Knock h+ h <- Open h+ -- h <- Close h+ Return ()+
+ test/dsl004/Door2.idr view
@@ -0,0 +1,37 @@+import IOu++data DoorState = OPEN | CLOSED++data DoorH : DoorState -> UniqueType where+ MkDH : DoorH s++infix 5 @@++data Res : (a : AnyType) -> (a -> AnyType) -> AnyType where+ (@@) : (val : a) -> (h : k val) -> Res a k++data DoorCmd : AnyType -> AnyType where+ Open : DoorH CLOSED -> + DoorCmd (Res Bool (\ok => case ok of+ True => DoorH OPEN+ False => DoorH CLOSED))+ Knock : DoorH CLOSED -> DoorCmd (DoorH CLOSED)+ Close : DoorH OPEN -> DoorCmd (DoorH CLOSED)++data DoorLang : AnyType -> AnyType where+ Return : a -> DoorLang a+ Action : DoorCmd a -> DoorLang a+ (>>=) : DoorLang a -> (a -> DoorLang b) -> DoorLang b++implicit+action : DoorCmd a -> DoorLang a+action = Action++covering+testProg : DoorH CLOSED -> DoorLang ()+testProg h = do h <- Action (Knock h)+ (True @@ h) <- Action (Open h) + | (False @@ h) => testProg h + h <- Action (Close h)+ Return ()+
+ test/dsl004/Door3.idr view
@@ -0,0 +1,30 @@+import IOu++data DoorState = OPEN | CLOSED++data DoorH : DoorState -> UniqueType where+ MkDH : DoorH s++infix 5 @@++data Res : (a : AnyType) -> (a -> AnyType) -> AnyType where+ (@@) : {k : a -> AnyType} -> (val : a) -> k val -> Res a k++data DoorCmd : AnyType -> AnyType where+ Open : DoorH CLOSED -> + DoorCmd (Res Bool (\ok => if ok then DoorH OPEN+ else DoorH CLOSED))+ Knock : DoorH CLOSED -> DoorCmd (DoorH CLOSED)+ Close : DoorH OPEN -> DoorCmd (DoorH CLOSED)++data DoorLang : AnyType -> AnyType where+ Return : {a : AnyType} -> a -> DoorLang a+ Action : DoorCmd a -> DoorLang a+ (>>=) : DoorLang a -> (a -> DoorLang b) -> DoorLang b++testProg : DoorH CLOSED -> DoorLang (DoorH CLOSED)+testProg h = do h <- Action (Knock h)+ (True @@ h) <- Action (Open h) + | (False @@ h) => Return h+ Action (Close h)+
+ test/dsl004/IOu.idr view
@@ -0,0 +1,19 @@+module IOu++-------- An IO type supporting possibly unique values++data IOu : AnyType -> AnyType where+ MkIOu : IO a -> IOu a++(>>=) : {a,b: AnyType} -> IOu a -> (a -> IOu b) -> IOu b+(>>=) (MkIOu x) k = MkIOu (do x' <- x+ case k x' of+ MkIOu k' => k')++pure : {a : AnyType} -> a -> IOu a+pure x = MkIOu (pure x)++run : IOu a -> IO a+run (MkIOu x) = x++
+ test/dsl004/expected view
+ test/dsl004/run view
@@ -0,0 +1,5 @@+#!/usr/bin/env bash+idris $@ Door0.idr --check+idris $@ Door1.idr --check+idris $@ Door2.idr --check+rm -f *.ibc
+ test/effects005/defaultlog.idr view
@@ -0,0 +1,18 @@+import Effects+import Effect.Logging.Default++func : Nat -> Eff () [LOG String]+func x = do+ log WARN Nil $ unwords ["I do nothing with", show x]+ pure ()++doubleFunc : Nat -> Eff Nat [LOG String]+doubleFunc x = do+ log WARN ["NumOPS"] $ unwords ["Doing the double with", show x ]+ func x+ pure (x+x)++main : IO ()+main = do+ x <- runInit [(ALL,["NumOPS"])] (doubleFunc 3)+ printLn x
+ test/effects005/expected view
@@ -0,0 +1,5 @@+"3 : Doing the double with 3"+6+8+"3 : [\"NumOPS\"] : Doing the double with 3"+6
+ test/effects005/run view
@@ -0,0 +1,6 @@+#!/usr/bin/env bash+idris $@ simplelog.idr -o simple -p effects+./simple+idris $@ defaultlog.idr -o default -p effects+./default+rm -f simple default *.ibc
+ test/effects005/simplelog.idr view
@@ -0,0 +1,14 @@+import Effects+import Effect.Logging.Simple++doubleFunc : Nat -> Eff Nat [LOG]+doubleFunc x = do+ log WARN $ unwords ["Doing the double with", show x ]+ pure (x+x)++main : IO ()+main = do+ x <- runInit [ALL] (doubleFunc 3)+ printLn x+ y <- runInit [OFF] (doubleFunc 4)+ printLn y
test/error003/expected view
@@ -1,3 +1,2 @@-ErrorReflection.idr:68:5:-When elaborating right hand side of bad:+ErrorReflection.idr:68:5:When checking right hand side of bad: DSL type error: (t(503) => t'(504)) doesn't match ()
test/error004/FunErrTest.idr view
@@ -8,16 +8,16 @@ total cadr : (xs : List a)- -> {auto cons1 : isCons xs = True}- -> {auto cons2 : isCons (tail xs) = True}+ -> {auto cons1 : NonEmpty xs}+ -> {auto cons2 : NonEmpty (tail xs)} -> a-cadr (x :: (y :: _)) {cons1=Refl} {cons2=Refl} = y-cadr (x :: []) {cons1=Refl} {cons2=Refl} impossible-cadr [] {cons1=Refl} {cons2=Refl} impossible+cadr (x :: (y :: _)) {cons1=IsNonEmpty} {cons2=IsNonEmpty} = y+cadr (x :: []) {cons1=IsNonEmpty} {cons2=IsNonEmpty} impossible+cadr [] {cons1=IsNonEmpty} {cons2=IsNonEmpty} impossible extractList : TT -> Maybe TT-extractList (App (App reflCon (App isCons lst)) _) = Just lst-extractList _ = Nothing+extractList (App (App neType _) lst) = Just lst+extractList t = Just t -- Nothing total has2elts : Err -> Maybe (List ErrorReportPart)@@ -39,3 +39,4 @@ goodCadr : Int goodCadr = cadr [1, 2]+
test/error004/expected view
@@ -1,9 +1,6 @@-FunErrTest.idr:35:10:-When elaborating right hand side of badCadr1:-When elaborating argument cons1 to function FunErrTest.cadr:+FunErrTest.idr:35:10:When checking right hand side of badCadr1:+When checking argument cons1 to function FunErrTest.cadr: Could not prove that [] has at least two elements.-FunErrTest.idr:38:10:-When elaborating right hand side of badCadr2:-When elaborating argument cons2 to function FunErrTest.cadr:- Could not prove that tail [(fromInteger 1)] has at least two- elements.+FunErrTest.idr:38:10:When checking right hand side of badCadr2:+When checking argument cons2 to function FunErrTest.cadr:+ Could not prove that tail [1] has at least two elements.
+ test/error004/idx.idr view
@@ -0,0 +1,4 @@+idx : (n : Nat) -> (l : List a) -> {auto ok : n < length l = True} -> a+idx Z (x::xs) {ok=p} = x+idx (S n) (x::xs) {ok=p} = idx n xs {ok=rewrite p in Refl}+idx _ [] {ok=Refl} impossible -- = ?foo
test/error005/expected view
@@ -1,21 +1,21 @@-error005.idr:13:1:When elaborating right hand side of two:-When elaborating argument prf to function Data.Fin.fromInteger:+error005.idr:13:1:When checking right hand side of two:+When checking argument prf to function Data.Fin.fromInteger: When using 2 as a literal for a Fin 2 2 is not strictly less than 2-error005.idr:16:1:When elaborating right hand side of hahaha:-When elaborating argument prf to function Data.Fin.fromInteger:+error005.idr:16:1:When checking right hand side of hahaha:+When checking argument prf to function Data.Fin.fromInteger: When using 0 as a literal for a Fin n 0 is not strictly less than n-error005.idr:22:1:When elaborating right hand side of notOk:-When elaborating argument prf to function Data.Fin.fromInteger:+error005.idr:22:1:When checking right hand side of notOk:+When checking argument prf to function Data.Fin.fromInteger: When using 2 as a literal for a Fin (S (S n)) 2 is not strictly less than S (S n)-error005.idr:23:24:When elaborating right hand side of b0rken:-When elaborating argument prf to function Data.Fin.fromInteger:+error005.idr:23:24:When checking right hand side of b0rken:+When checking argument prf to function Data.Fin.fromInteger: When using n as a literal for a Fin 3 Could not show that n is less than 3 because n is a bound variable instead of a constant Integer-error005.idr:28:1:When elaborating right hand side of x:-When elaborating argument prf to function Data.Fin.fromInteger:+error005.idr:28:1:When checking right hand side of x:+When checking argument prf to function Data.Fin.fromInteger: When using 5 as a literal for a Fin 4 5 is not strictly less than 4
test/idrisdoc009/expected view
@@ -1,4 +1,4 @@-Data type Test : Type+Data type Test.Test : Type Docs for datatype Test. Constructors:
test/interactive003/expected view
@@ -2,3 +2,4 @@ x :: app xs ys [] f x y :: vzipWith f xs ys+?word_length_rhs_3 :: word_length xs
test/interactive003/input view
@@ -2,3 +2,4 @@ :ps 5 app_rhs_2 :ps 8 vzipWith_rhs_3 :ps 9 vzipWith_rhs_1+:ps 13 word_length_rhs_2
test/interactive003/interactive003.idr view
@@ -8,3 +8,8 @@ vzipWith f [] [] = ?vzipWith_rhs_3 vzipWith f (x :: xs) (y :: ys) = ?vzipWith_rhs_1 +word_length : Vect n String -> Vect n Nat+word_length [] = []+word_length (x :: xs) = ?word_length_rhs_2++
test/interactive005/expected view
@@ -1,13 +1,14 @@ 3 : Nat Hello, World-main : IO ()+Main.main : IO () This is a docstring + The function is Total Main.main is Total Hello, World-Prelude.Basics.id : a -> a-Prelude.Basics.id : {a : Type} -> (__pi_arg : a) -> a-Prelude.Basics.id : a -> a+id : a -> a+Prelude.Basics.id : {a : Type} -> a -> a+id : a -> a THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -21,13 +22,15 @@ OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -main : IO ()+Main.main : IO () This is a docstring -main : IO ()+ The function is Total+Main.main : IO () This is a docstring + The function is Total Nat2 : Type Invalid filename for compiler output "Test.idr"
+ test/interactive008/expected view
@@ -0,0 +1,204 @@+Idris> Idris> Idris> 1 ::+2 :: 3 :: 4 :: 5 :: ... : List Integer+Idris> Idris> [1,+ 2,+ 3,+ 4,+ 5,+ 6,+ 7,+ 8,+ 9,+ 10,+ 11,+ 12,+ 13,+ 14,+ 15,+ 16,+ 17,+ 18,+ 19,+ 20,+ 21,+ 22,+ 23,+ 24,+ 25,+ 26,+ 27,+ 28,+ 29,+ 30,+ 31,+ 32,+ 33,+ 34,+ 35,+ 36,+ 37,+ 38,+ 39,+ 40,+ 41,+ 42,+ 43,+ 44,+ 45,+ 46,+ 47,+ 48,+ 49,+ 50,+ 51,+ 52,+ 53,+ 54,+ 55,+ 56,+ 57,+ 58,+ 59,+ 60,+ 61,+ 62,+ 63,+ 64,+ 65,+ 66,+ 67,+ 68,+ 69,+ 70,+ 71,+ 72,+ 73,+ 74,+ 75,+ 76,+ 77,+ 78,+ 79,+ 80,+ 81,+ 82,+ 83,+ 84,+ 85,+ 86,+ 87,+ 88,+ 89,+ 90,+ 91,+ 92,+ 93,+ 94,+ 95,+ 96,+ 97,+ 98,+ 99,+ 100] : List Integer+Idris> Idris> ... : ...+Idris> Idris> [1,+ 2,+ 3,+ 4,+ 5,+ 6,+ 7,+ 8,+ 9,+ 10,+ 11,+ 12,+ 13,+ 14,+ 15,+ 16,+ 17,+ 18,+ 19,+ 20,+ 21,+ 22,+ 23,+ 24,+ 25,+ 26,+ 27,+ 28,+ 29,+ 30,+ 31,+ 32,+ 33,+ 34,+ 35,+ 36,+ 37,+ 38,+ 39,+ 40,+ 41,+ 42,+ 43,+ 44,+ 45,+ 46,+ 47,+ 48,+ 49,+ 50,+ 51,+ 52,+ 53,+ 54,+ 55,+ 56,+ 57,+ 58,+ 59,+ 60,+ 61,+ 62,+ 63,+ 64,+ 65,+ 66,+ 67,+ 68,+ 69,+ 70,+ 71,+ 72,+ 73,+ 74,+ 75,+ 76,+ 77,+ 78,+ 79,+ 80,+ 81,+ 82,+ 83,+ 84,+ 85,+ 86,+ 87,+ 88,+ 89,+ 90,+ 91,+ 92,+ 93,+ 94,+ 95,+ 96,+ 97,+ 98,+ 99,+ 100] : List Integer+Idris> Bye bye
+ test/interactive008/input view
@@ -0,0 +1,9 @@+:consolewidth 50+:printerdepth 5+the (List Integer) [1..20]+:printerdepth 1000+the (List Integer) [1..100]+:printerdepth 0+the (List Integer) [1..100]+:printerdepth+the (List Integer) [1..100]
+ test/interactive008/run view
@@ -0,0 +1,2 @@+#!/usr/bin/env bash+idris --nobanner --nocolor < input
+ test/interactive009/expected view
@@ -0,0 +1,1 @@+IsSetCons pf prfRec
+ test/interactive009/input view
@@ -0,0 +1,1 @@+:ps 26 rec
+ test/interactive009/interactive009.idr view
@@ -0,0 +1,27 @@+import Data.Vect++%default total++data ElemBool : Eq t => t -> Vect n t -> Bool -> Type where+ ElemBoolNil : Eq t => ElemBool {t=t} a [] False+ ElemBoolCons : Eq t => ElemBool {t=t} x1 xs b -> ElemBool x1 (x2 :: xs) ((x1 == x2) || b)++data IsSet : Eq t => Vect n t -> Type where+ IsSetNil : Eq t => IsSet {t=t} []+ IsSetCons : Eq t => ElemBool {t=t} x xs False -> IsSet xs -> IsSet (x :: xs)++fun_1 : Eq t => (x : t) -> (xs : Vect n t) -> (b : Bool ** ElemBool x xs b)+fun_1 x [] = (False ** ElemBoolNil)+fun_1 x1 (x2 :: xs) = + let (b ** prfRec) = fun_1 x1 xs+ in (((x1 == x2) || b) ** (ElemBoolCons prfRec)) ++fun_2 : Eq t => (xs : Vect n t) -> Maybe (IsSet xs)+fun_2 [] = Just IsSetNil+fun_2 (x :: xs) with (fun_1 x xs)+ fun_2 (x :: xs) | (True ** pf) = Nothing + fun_2 (x :: xs) | (False ** pf) with (fun_2 xs)+ fun_2 (x :: xs) | (False ** pf) | Nothing = Nothing + fun_2 (x :: xs) | (False ** pf) | (Just prfRec) + = Just ?rec +
+ test/interactive009/run view
@@ -0,0 +1,3 @@+#!/usr/bin/env bash+idris --quiet interactive009.idr < input+rm -f *.ibc
test/io003/test018.idr view
@@ -11,9 +11,11 @@ putStrLn x putStrLn "Received" sendToThread sender "Hello to you too!"+ return () ping : Ptr -> IO ()-ping thread = sendToThread thread (prim__vm, "Hello!")+ping thread = do sendToThread thread (prim__vm, "Hello!")+ return () pingpong : IO () pingpong
test/io003/test018a.idr view
@@ -11,12 +11,14 @@ msg <- recv Lift (putStrLn ("Reply: " ++ show msg)) send main "Done"+ return () pong : Process String () pong = do -- Lift (putStrLn "Waiting for message") (sender, m) <- recvWithSender Lift $ putStrLn ("Received " ++ m) send sender ("Hello back!")+ return () mainProc : Process String () mainProc = do mainID <- myID
test/meta001/Finite.idr view
@@ -27,42 +27,44 @@ mkFin (S k) (S j) = do i <- mkFin k j return `(FS {k=~(quote k)} ~i) -mkToClause : TTName -> (size, i : Nat) -> (constr : (TTName, Raw)) -> Elab FunClause-mkToClause fn size i (n, Var ty) =+mkToClause : TTName -> (size, i : Nat) ->+ (constr : (TTName, List CtorArg, Raw)) ->+ Elab FunClause+mkToClause fn size i (n, [], Var ty) = MkFunClause (RApp (Var fn) (Var n)) <$> mkFin size i-mkToClause fn size i (n, ty) =+mkToClause fn size i (n, _, ty) = fail [TextPart "unsupported constructor", NamePart n] mkFromClause : TTName -> (size, i : Nat) ->- (constr : (TTName, Raw)) ->+ (constr : (TTName, List CtorArg, Raw)) -> Elab FunClause-mkFromClause fn size i (n, Var ty) =+mkFromClause fn size i (n, [], Var ty) = return $ MkFunClause (RApp (Var fn) !(mkFin size i)) (Var n)-mkFromClause fn size i (n, ty) =+mkFromClause fn size i (n, _, ty) = fail [TextPart "unsupported constructor", NamePart n] -mkOk1Clause : TTName -> (size, i : Nat) -> (constr : (TTName, Raw)) -> Elab FunClause-mkOk1Clause fn size i (n, Var ty) =+mkOk1Clause : TTName -> (size, i : Nat) -> (constr : (TTName, List CtorArg, Raw)) -> Elab FunClause+mkOk1Clause fn size i (n, [], Var ty) = return $ MkFunClause (RApp (Var fn) (Var n)) [| (Var (UN "Refl")) (Var ty) (Var n) |]-mkOk1Clause fn size i (n, ty) =+mkOk1Clause fn size i (n, _, ty) = fail [TextPart "unsupported constructor", NamePart n] -mkOk2Clause : TTName -> (size, i : Nat) -> (constr : (TTName, Raw)) -> Elab FunClause-mkOk2Clause fn size i (n, Var ty) =+mkOk2Clause : TTName -> (size, i : Nat) -> (constr : (TTName, List CtorArg, Raw)) -> Elab FunClause+mkOk2Clause fn size i (n, [], Var ty) = return $ MkFunClause (RApp (Var fn) !(mkFin size i)) [| (Var "Refl") `(Fin ~(quote size)) !(mkFin size i) |]-mkOk2Clause fn size i (n, ty) =+mkOk2Clause fn size i (n, _, ty) = fail [TextPart "unsupported constructor", NamePart n] -mkToClauses : TTName -> Nat -> List (TTName, Raw) -> Elab (List FunClause)+mkToClauses : TTName -> Nat -> List (TTName, List CtorArg, Raw) -> Elab (List FunClause) mkToClauses fn size xs = mkToClauses' Z xs- where mkToClauses' : Nat -> List (TTName, Raw) -> Elab (List FunClause)+ where mkToClauses' : Nat -> List (TTName, List CtorArg, Raw) -> Elab (List FunClause) mkToClauses' k [] = return [] mkToClauses' k (x :: xs) = do rest <- mkToClauses' (S k) xs clause <- mkToClause fn size k x@@ -90,26 +92,26 @@ mkFromClauses : TTName -> TTName -> Nat ->- List (TTName, Raw) -> Elab (List FunClause)+ List (TTName, List CtorArg, Raw) -> Elab (List FunClause) mkFromClauses fn ty size xs = mkFromClauses' Z xs- where mkFromClauses' : Nat -> List (TTName, Raw) -> Elab (List FunClause)+ where mkFromClauses' : Nat -> List (TTName, List CtorArg, Raw) -> Elab (List FunClause) mkFromClauses' k [] = return [!(mkAbsurdFinClause fn (const (Var ty)) size)] mkFromClauses' k (x :: xs) = do rest <- mkFromClauses' (S k) xs clause <- mkFromClause fn size k x return $ clause :: rest -mkOk1Clauses : TTName -> Nat -> List (TTName, Raw) -> Elab (List FunClause)+mkOk1Clauses : TTName -> Nat -> List (TTName, List CtorArg, Raw) -> Elab (List FunClause) mkOk1Clauses fn size xs = mkOk1Clauses' Z xs- where mkOk1Clauses' : Nat -> List (TTName, Raw) -> Elab (List FunClause)+ where mkOk1Clauses' : Nat -> List (TTName, List CtorArg, Raw) -> Elab (List FunClause) mkOk1Clauses' k [] = return [] mkOk1Clauses' k (x :: xs) = do rest <- mkOk1Clauses' (S k) xs clause <- mkOk1Clause fn size k x return $ clause :: rest -mkOk2Clauses : TTName -> Nat -> List (TTName, Raw) -> (Raw -> Raw) -> Elab (List FunClause)+mkOk2Clauses : TTName -> Nat -> List (TTName, List CtorArg, Raw) -> (Raw -> Raw) -> Elab (List FunClause) mkOk2Clauses fn size xs resTy = mkOk2Clauses' Z xs- where mkOk2Clauses' : Nat -> List (TTName, Raw) -> Elab (List FunClause)+ where mkOk2Clauses' : Nat -> List (TTName, List CtorArg, Raw) -> Elab (List FunClause) mkOk2Clauses' k [] = return [!(mkAbsurdFinClause fn resTy size)] mkOk2Clauses' k (x :: xs) = do rest <- mkOk2Clauses' (S k) xs clause <- mkOk2Clause fn size k x@@ -121,19 +123,19 @@ do (MkDatatype famn tcargs tcres constrs) <- lookupDatatypeExact ty let size = length constrs argn <- gensym "arg"- declareType $ Declare to [Explicit argn (Var ty)]+ declareType $ Declare to [MkFunArg argn (Var ty) Explicit NotErased] `(Fin ~(quote size)) toClauses <- mkToClauses to size constrs defineFunction $ DefineFun to toClauses argn' <- gensym "arg"- declareType $ Declare from [Explicit argn' `(Fin ~(quote size))]+ declareType $ Declare from [MkFunArg argn' `(Fin ~(quote size)) Explicit NotErased ] (Var ty) fromClauses <- mkFromClauses from ty size constrs defineFunction $ DefineFun from fromClauses argn'' <- gensym "arg"- declareType $ Declare ok1 [Explicit argn'' (Var ty)]+ declareType $ Declare ok1 [MkFunArg argn'' (Var ty) Explicit NotErased] `((=) {A=~(Var ty)} {B=~(Var ty)} ~(RApp (Var from) (RApp (Var to) (Var argn''))) ~(Var argn''))@@ -146,7 +148,7 @@ (\n => `((=) {A=~fty} {B=~fty} ~(RApp (Var to) (RApp (Var from) n)) ~n))- declareType $ Declare ok2 [Explicit argn''' fty]+ declareType $ Declare ok2 [MkFunArg argn''' fty Explicit NotErased] (ok2ResTy (Var argn''')) ok2Clauses <- mkOk2Clauses ok2 size constrs ok2ResTy defineFunction $ DefineFun ok2 ok2Clauses
test/meta002/Tacs.idr view
@@ -24,11 +24,11 @@ intros : Elab () intros = do g <- getGoal case snd g of- `(~_ -> ~_) => intro Nothing+ `(~_ -> ~_) => intro' _ => return () foo : Nat -> Nat-foo = %runElab (do intro (Just (UN "fnord"))+foo = %runElab (do intro (UN "fnord") fill `(plus ~(Var (UN "fnord")) ~(Var (UN "fnord"))) solve) @@ -181,7 +181,7 @@ mkIx : Fin n -> Elab () mkIx FZ = do envH <- mkEnvH tH <- mkTyH- apply `(Z {t=~(Var tH)} {env=~(Var envH)})+ apply `(Z {t=~(Var tH)} {env=~(Var envH)}) [] solve mkIx (FS i) = do envH <- mkEnvH tH <- mkTyH@@ -189,7 +189,7 @@ argH <- gensym "arg" claim argH `(Ix ~(Var envH) ~(Var tH)) unfocus argH- apply `(S {env=~(Var envH)} {t=~(Var tH)} {t'=~(Var vH)} ~(Var argH))+ apply `(S {env=~(Var envH)} {t=~(Var tH)} {t'=~(Var vH)} ~(Var argH)) [] solve focus argH mkIx i@@ -203,6 +203,7 @@ apply `(Lam {env=~(Var envH)} {t=~(Var tH)} {t'=~(Var tH')} ~(Var bodyH))+ [] solve focus bodyH@@ -219,6 +220,7 @@ apply `(App {env=~(Var envH)} {t=~(Var tH)} {t'=~(Var tH')} ~(Var fH) ~(Var argH))+ [] solve focus fH mkTerm xs tm@@ -230,11 +232,13 @@ claim ixH `(Ix ~(Var envH) ~(Var tH)) unfocus ixH apply `(Var {env=~(Var envH)} {t=~(Var tH)} ~(Var ixH))+ [] solve focus ixH mkIx i mkTerm xs UnitCon = do envH <- mkEnvH apply `(UnitCon {env=~(Var envH)})+ [] solve testElab : Sigma Ty (Tm []) testElab = %runElab (elaborateSTLC (App (Lam "x" UnitCon) UnitCon))
test/meta002/expected view
@@ -1,3 +1,3 @@-Tacs.idr:247:15:-When elaborating right hand side of testElab3:+Tacs.idr:251:15:+When checking right hand side of testElab3: Unifying ty and ARR ty t would lead to infinite value
test/primitives002/expected view
@@ -1,15 +1,15 @@ prim__floatToStr 0.0-"0.0"-prim__strToFloat "0.0"-0.0+"0"+prim__strToFloat 0.0+0 prim__addFloat 1.0 1.0-2.0+2 prim__subFloat 1.0 1.0-0.0+0 prim__mulFloat 1.0 1.0-1.0+1 prim__divFloat 1.0 1.0-1.0+1 prim__slteFloat 1.0 1.0 1 prim__sltFloat 1.0 1.0@@ -21,13 +21,13 @@ prim__eqFloat 1.0 1.0 1 prim__floatACos 1.0-0.0+0 prim__floatATan 1.0 0.78539816 prim__floatCos 1.0 0.54030230 prim__floatFloor 1.0-1.0+1 prim__floatSin 1.0 0.84147098 prim__floatTan 1.0@@ -35,12 +35,12 @@ prim__floatASin 1.0 1.57079632 prim__floatCeil 1.0-1.0+1 prim__floatExp 1.0 2.71828182 prim__floatLog 1.0-0.0+0 prim__floatSqrt 1.0-1.0+1 prim__negFloat 1.0--1.0+-1
test/primitives002/run view
@@ -1,37 +1,41 @@ #!/usr/bin/env bash -HEAD="module Main+HEAD='module Main import Data.Floats strtake : Nat -> String -> String strtake n str = pack (take n (unpack str)) -main : IO ()"+getf : IO Double+getf = map cast getLine -TESTS=("prim__floatToStr 0.0"-"prim__strToFloat \"0.0\""-"prim__addFloat 1.0 1.0"-"prim__subFloat 1.0 1.0"-"prim__mulFloat 1.0 1.0"-"prim__divFloat 1.0 1.0"-"prim__slteFloat 1.0 1.0"-"prim__sltFloat 1.0 1.0"-"prim__sgteFloat 1.0 1.0"-"prim__sgtFloat 1.0 1.0"-"prim__eqFloat 1.0 1.0"-"prim__floatACos 1.0"-"prim__floatATan 1.0"-"prim__floatCos 1.0"-"prim__floatFloor 1.0"-"prim__floatSin 1.0"-"prim__floatTan 1.0"-"prim__floatASin 1.0"-"prim__floatCeil 1.0"-"prim__floatExp 1.0"-"prim__floatLog 1.0"-"prim__floatSqrt 1.0"-"prim__negFloat 1.0"+main : IO ()'++# code separated from input with '#'+TESTS=('prim__floatToStr !getf#0.0'+ 'prim__strToFloat !getLine#0.0'+$'prim__addFloat !getf !getf#1.0\n1.0'+$'prim__subFloat !getf !getf#1.0\n1.0'+$'prim__mulFloat !getf !getf#1.0\n1.0'+$'prim__divFloat !getf !getf#1.0\n1.0'+$'prim__slteFloat !getf !getf#1.0\n1.0'+$'prim__sltFloat !getf !getf#1.0\n1.0'+$'prim__sgteFloat !getf !getf#1.0\n1.0'+$'prim__sgtFloat !getf !getf#1.0\n1.0'+$'prim__eqFloat !getf !getf#1.0\n1.0'+ 'prim__floatACos !getf#1.0'+ 'prim__floatATan !getf#1.0'+ 'prim__floatCos !getf#1.0'+ 'prim__floatFloor !getf#1.0'+ 'prim__floatSin !getf#1.0'+ 'prim__floatTan !getf#1.0'+ 'prim__floatASin !getf#1.0'+ 'prim__floatCeil !getf#1.0'+ 'prim__floatExp !getf#1.0'+ 'prim__floatLog !getf#1.0'+ 'prim__floatSqrt !getf#1.0'+ 'prim__negFloat !getf#1.0' ) generate_testfile()@@ -44,9 +48,9 @@ for T in "${TESTS[@]}" do- echo ${T}- generate_testfile "tmptest.idr" "${T}"- idris $@ --quiet tmptest.idr -o tmptest || echo "missing primitive in ${CG}"- ./tmptest+ echo ${T%% *} ${T##*#}+ generate_testfile "tmptest.idr" "${T%%#*}"+ idris "$@" --quiet tmptest.idr -o tmptest || echo "missing primitive in ${CG}"+ ./tmptest <<<"${T##*#}" rm tmptest.idr tmptest.ibc tmptest done
test/proof001/test029.idr view
@@ -29,7 +29,7 @@ simple.append_lemma_2 = proof { intros; compute;- rewrite (plusSuccRightSucc m n);+ rewrite (plusSuccRightSucc m k); trivial; }
test/proof002/expected view
@@ -1,13 +1,13 @@-Reflect.idr:208:38:-When elaborating right hand side of testReflect1:-When elaborating an application of function Reflect.getJust:- Can't unify+test030a.idr:12:26-14:1:+When checking right hand side of testReflect1:+When checking an application of function Reflect.getJust:+ Type mismatch between IsJust (Just x1) (Type of ItIsJust)- with+ and IsJust (prove (getProof x)) (Expected type) Specifically:- Can't unify+ Type mismatch between Just x- with+ and Nothing
test/proof003/test015.idr view
@@ -106,9 +106,7 @@ -- There is almost certainly an easier proof. I don't care, for now :) Main.adc_lemma_2 = proof {- intro w,v,num0,bit0- intro b0,v1,num1,bit1,b1- intro c,bc,x,bX,x1,bX1+ intro w,v,num0,v1,num1,x,bx,x1,bx1,bit0,b0,bit1,b1,c,bc rewrite sym (plusZeroRightNeutral x); rewrite sym (plusZeroRightNeutral v1); rewrite sym (plusZeroRightNeutral (plus (plus x v) v1));
test/proof007/expected view
@@ -1,4 +1,4 @@ DefaultArgUnknownName.idr:9:6:-When elaborating right hand side of test:-When elaborating argument arg to function DefaultArgUnknownName.funWithBadDefArg:+When checking right hand side of test:+When checking argument arg to function DefaultArgUnknownName.funWithBadDefArg: No such variable sadgjhsag
test/quasiquote001/expected view
@@ -1,5 +1,5 @@-(App (App (App (P (DCon 1 3) (NS (UN "::") ["List", "Prelude"]) (Bind (UN "a") (Pi (TType (UVar -1))) (Bind (MN 0 "_t") (Pi (V 0)) (Bind (MN 2 "_t") (Pi (App (P (TCon 0 0) (NS (UN "List") ["List", "Prelude"]) Erased) (V 1))) (App (P (TCon 0 0) (NS (UN "List") ["List", "Prelude"]) Erased) (V 2)))))) (P (TCon 8 0) (UN "Unit") (TType (UVar -1)))) (P (DCon 0 0) (UN "MkUnit") (P (TCon 0 0) (UN "Unit") Erased))) (App (App (App (P (DCon 1 3) (NS (UN "::") ["List", "Prelude"]) (Bind (UN "a") (Pi (TType (UVar -1))) (Bind (MN 0 "_t") (Pi (V 0)) (Bind (MN 2 "_t") (Pi (App (P (TCon 0 0) (NS (UN "List") ["List", "Prelude"]) Erased) (V 1))) (App (P (TCon 0 0) (NS (UN "List") ["List", "Prelude"]) Erased) (V 2)))))) (P (TCon 8 0) (UN "Unit") (TType (UVar -1)))) (P (DCon 0 0) (UN "MkUnit") (P (TCon 0 0) (UN "Unit") Erased))) (App (P (DCon 0 1) (NS (UN "Nil") ["List", "Prelude"]) (Bind (UN "a") (Pi (TType (UVar -1))) (App (P (TCon 0 0) (NS (UN "List") ["List", "Prelude"]) Erased) (V 0)))) (P (TCon 8 0) (UN "Unit") (TType (UVar -1))))))+App (App (App (P (DCon 1 3) (NS (UN "::") ["List", "Prelude"]) (Bind (UN "elem") (Pi (TType (UVar (-1))) (TType (UVar (-1)))) (Bind (MN 0 "_t") (Pi (V 0) (TType (UVar (-1)))) (Bind (MN 2 "_t") (Pi (App (P (TCon 0 0) (NS (UN "List") ["List", "Prelude"]) Erased) (V 1)) (TType (UVar (-1)))) (App (P (TCon 0 0) (NS (UN "List") ["List", "Prelude"]) Erased) (V 2)))))) (P (TCon 8 0) (UN "Unit") (TType (UVar (-1))))) (P (DCon 0 0) (UN "MkUnit") (P (TCon 0 0) (UN "Unit") Erased))) (App (App (App (P (DCon 1 3) (NS (UN "::") ["List", "Prelude"]) (Bind (UN "elem") (Pi (TType (UVar (-1))) (TType (UVar (-1)))) (Bind (MN 0 "_t") (Pi (V 0) (TType (UVar (-1)))) (Bind (MN 2 "_t") (Pi (App (P (TCon 0 0) (NS (UN "List") ["List", "Prelude"]) Erased) (V 1)) (TType (UVar (-1)))) (App (P (TCon 0 0) (NS (UN "List") ["List", "Prelude"]) Erased) (V 2)))))) (P (TCon 8 0) (UN "Unit") (TType (UVar (-1))))) (P (DCon 0 0) (UN "MkUnit") (P (TCon 0 0) (UN "Unit") Erased))) (App (P (DCon 0 1) (NS (UN "Nil") ["List", "Prelude"]) (Bind (UN "elem") (Pi (TType (UVar (-1))) (TType (UVar (-1)))) (App (P (TCon 0 0) (NS (UN "List") ["List", "Prelude"]) Erased) (V 0)))) (P (TCon 8 0) (UN "Unit") (TType (UVar (-1)))))) ---------------(App (App (App (P (DCon 1 3) (NS (UN "::") ["List", "Prelude"]) (Bind (UN "a") (Pi (TType (UVar -1))) (Bind (MN 0 "_t") (Pi (V 0)) (Bind (MN 2 "_t") (Pi (App (P (TCon 0 0) (NS (UN "List") ["List", "Prelude"]) Erased) (V 1))) (App (P (TCon 0 0) (NS (UN "List") ["List", "Prelude"]) Erased) (V 2)))))) (TType (UVar 24))) (TType (UVar 25))) (App (App (App (P (DCon 1 3) (NS (UN "::") ["List", "Prelude"]) (Bind (UN "a") (Pi (TType (UVar -1))) (Bind (MN 0 "_t") (Pi (V 0)) (Bind (MN 2 "_t") (Pi (App (P (TCon 0 0) (NS (UN "List") ["List", "Prelude"]) Erased) (V 1))) (App (P (TCon 0 0) (NS (UN "List") ["List", "Prelude"]) Erased) (V 2)))))) (TType (UVar 26))) (App (App (App (App (P (DCon 0 4) (NS (UN "MkPair") ["Builtins"]) (Bind (UN "A") (Pi (TType (UVar -1))) (Bind (UN "B") (Pi (TType (UVar -1))) (Bind (UN "a") (Pi (V 1)) (Bind (UN "b") (Pi (V 1)) (App (App (P (TCon 0 0) (NS (UN "Pair") ["Builtins"]) Erased) (V 3)) (V 2))))))) (TType (UVar 22))) (TType (UVar 23))) (P (TCon 8 0) (NS (UN "Nat") ["Nat", "Prelude"]) (TType (UVar -1)))) (P (TCon 8 0) (NS (UN "Nat") ["Nat", "Prelude"]) (TType (UVar -1))))) (App (P (DCon 0 1) (NS (UN "Nil") ["List", "Prelude"]) (Bind (UN "a") (Pi (TType (UVar -1))) (App (P (TCon 0 0) (NS (UN "List") ["List", "Prelude"]) Erased) (V 0)))) (TType (UVar 27)))))+App (App (App (P (DCon 1 3) (NS (UN "::") ["List", "Prelude"]) (Bind (UN "elem") (Pi (TType (UVar (-1))) (TType (UVar (-1)))) (Bind (MN 0 "_t") (Pi (V 0) (TType (UVar (-1)))) (Bind (MN 2 "_t") (Pi (App (P (TCon 0 0) (NS (UN "List") ["List", "Prelude"]) Erased) (V 1)) (TType (UVar (-1)))) (App (P (TCon 0 0) (NS (UN "List") ["List", "Prelude"]) Erased) (V 2)))))) (TType (UVar 24))) (TType (UVar 25))) (App (App (App (P (DCon 1 3) (NS (UN "::") ["List", "Prelude"]) (Bind (UN "elem") (Pi (TType (UVar (-1))) (TType (UVar (-1)))) (Bind (MN 0 "_t") (Pi (V 0) (TType (UVar (-1)))) (Bind (MN 2 "_t") (Pi (App (P (TCon 0 0) (NS (UN "List") ["List", "Prelude"]) Erased) (V 1)) (TType (UVar (-1)))) (App (P (TCon 0 0) (NS (UN "List") ["List", "Prelude"]) Erased) (V 2)))))) (TType (UVar 26))) (App (App (App (App (P (DCon 0 4) (NS (UN "MkPair") ["Builtins"]) (Bind (UN "A") (Pi (TType (UVar (-1))) (TType (UVar (-1)))) (Bind (UN "B") (Pi (TType (UVar (-1))) (TType (UVar (-1)))) (Bind (UN "a") (Pi (V 1) (TType (UVar (-1)))) (Bind (UN "b") (Pi (V 1) (TType (UVar (-1)))) (App (App (P (TCon 0 0) (NS (UN "Pair") ["Builtins"]) Erased) (V 3)) (V 2))))))) (TType (UVar 22))) (TType (UVar 23))) (P (TCon 8 0) (NS (UN "Nat") ["Nat", "Prelude"]) (TType (UVar (-1))))) (P (TCon 8 0) (NS (UN "Nat") ["Nat", "Prelude"]) (TType (UVar (-1)))))) (App (P (DCon 0 1) (NS (UN "Nil") ["List", "Prelude"]) (Bind (UN "elem") (Pi (TType (UVar (-1))) (TType (UVar (-1)))) (App (P (TCon 0 0) (NS (UN "List") ["List", "Prelude"]) Erased) (V 0)))) (TType (UVar 27)))) ---------------(App (App (App (App (P (DCon 0 4) (NS (UN "MkPair") ["Builtins"]) (Bind (UN "A") (Pi (TType (UVar -1))) (Bind (UN "B") (Pi (TType (UVar -1))) (Bind (UN "a") (Pi (V 1)) (Bind (UN "b") (Pi (V 1)) (App (App (P (TCon 0 0) (NS (UN "Pair") ["Builtins"]) Erased) (V 3)) (V 2))))))) (TType (UVar 22))) (TType (UVar 23))) (App (App (App (App (P (DCon 0 4) (NS (UN "MkPair") ["Builtins"]) (Bind (UN "A") (Pi (TType (UVar -1))) (Bind (UN "B") (Pi (TType (UVar -1))) (Bind (UN "a") (Pi (V 1)) (Bind (UN "b") (Pi (V 1)) (App (App (P (TCon 0 0) (NS (UN "Pair") ["Builtins"]) Erased) (V 3)) (V 2))))))) (TType (UVar 22))) (TType (UVar 23))) (TType (UVar 24))) (TType (UVar 24)))) (App (App (App (App (P (DCon 0 4) (NS (UN "MkPair") ["Builtins"]) (Bind (UN "A") (Pi (TType (UVar -1))) (Bind (UN "B") (Pi (TType (UVar -1))) (Bind (UN "a") (Pi (V 1)) (Bind (UN "b") (Pi (V 1)) (App (App (P (TCon 0 0) (NS (UN "Pair") ["Builtins"]) Erased) (V 3)) (V 2))))))) (TType (UVar 22))) (TType (UVar 23))) (TType (UVar 24))) (TType (UVar 24))))+App (App (App (App (P (DCon 0 4) (NS (UN "MkPair") ["Builtins"]) (Bind (UN "A") (Pi (TType (UVar (-1))) (TType (UVar (-1)))) (Bind (UN "B") (Pi (TType (UVar (-1))) (TType (UVar (-1)))) (Bind (UN "a") (Pi (V 1) (TType (UVar (-1)))) (Bind (UN "b") (Pi (V 1) (TType (UVar (-1)))) (App (App (P (TCon 0 0) (NS (UN "Pair") ["Builtins"]) Erased) (V 3)) (V 2))))))) (TType (UVar 22))) (TType (UVar 23))) (App (App (App (App (P (DCon 0 4) (NS (UN "MkPair") ["Builtins"]) (Bind (UN "A") (Pi (TType (UVar (-1))) (TType (UVar (-1)))) (Bind (UN "B") (Pi (TType (UVar (-1))) (TType (UVar (-1)))) (Bind (UN "a") (Pi (V 1) (TType (UVar (-1)))) (Bind (UN "b") (Pi (V 1) (TType (UVar (-1)))) (App (App (P (TCon 0 0) (NS (UN "Pair") ["Builtins"]) Erased) (V 3)) (V 2))))))) (TType (UVar 22))) (TType (UVar 23))) (TType (UVar 24))) (TType (UVar 24)))) (App (App (App (App (P (DCon 0 4) (NS (UN "MkPair") ["Builtins"]) (Bind (UN "A") (Pi (TType (UVar (-1))) (TType (UVar (-1)))) (Bind (UN "B") (Pi (TType (UVar (-1))) (TType (UVar (-1)))) (Bind (UN "a") (Pi (V 1) (TType (UVar (-1)))) (Bind (UN "b") (Pi (V 1) (TType (UVar (-1)))) (App (App (P (TCon 0 0) (NS (UN "Pair") ["Builtins"]) Erased) (V 3)) (V 2))))))) (TType (UVar 22))) (TType (UVar 23))) (TType (UVar 24))) (TType (UVar 24)))
test/quasiquote003/expected view
@@ -1,2 +1,2 @@-NoInfer.idr:11:5:When elaborating right hand side of zzz:+NoInfer.idr:11:5:When checking right hand side of zzz: No such variable k
test/quasiquote004/expected view
@@ -1,3 +1,3 @@ Quasiquote004.idr:50:25:-When elaborating right hand side of Quasiquote004.getMeNat':+When checking right hand side of Quasiquote004.getMeNat': Not a Nat goal
test/quasiquote006/expected view
@@ -1,12 +1,12 @@ quasiquote006.idr:9:3:-When elaborating right hand side of b:+When checking right hand side of b: Can't disambiguate name: ForeignEnv.Nil, Prelude.List.Nil quasiquote006.idr:12:3:-When elaborating right hand side of c:+When checking right hand side of c: No such variable alsdkjflkj quasiquote006.idr:15:3:-When elaborating right hand side of d:+When checking right hand side of d: Can't disambiguate name: ForeignEnv.::, Prelude.List.::, Prelude.Stream.::
test/reg001/reg001.idr view
@@ -6,3 +6,4 @@ testVal : Imp testVal = MkImp (apply id Z)+
test/reg003/expected view
@@ -1,6 +1,6 @@-reg003a.idr:4:11:When elaborating type of Main.ECons:+reg003a.idr:4:11:When checking type of Main.ECons: No such variable OddList-reg003a.idr:7:11:When elaborating type of Main.OCons:+reg003a.idr:7:11:When checking type of Main.OCons: No such variable EvenList-reg003a.idr:9:6:When elaborating type of Main.test:+reg003a.idr:9:6:When checking type of Main.test: No such variable EvenList
test/reg007/expected view
@@ -1,12 +1,12 @@ reg007.lidr:8:1:A.n is already defined-reg007.lidr:12:11-17:When elaborating right hand side of hurrah:-Can't unify+reg007.lidr:12:11-17:When checking right hand side of hurrah:+Type mismatch between n = lala (Type of isSame)-with+and 0 = 1 (Expected type) Specifically:- Can't unify+ Type mismatch between 1- with+ and 0
test/reg010/expected view
@@ -1,3 +1,3 @@ reg010.idr:5:15:-When elaborating left hand side of with block in usubst.unsafeSubst:+When checking left hand side of with block in usubst.unsafeSubst: Can't match on with block in usubst.unsafeSubst warg a P x x px
test/reg023/expected view
@@ -1,5 +1,5 @@-reg023.idr:7:5:When elaborating right hand side of bad:-Can't unify+reg023.idr:7:5:When checking right hand side of bad:+Type mismatch between Nat (Type of 0)-with+and f Nat (Expected type)
test/reg034/expected view
@@ -1,4 +1,4 @@-reg034.idr:6:5:When elaborating left hand side of bar:+reg034.idr:6:5:When checking left hand side of bar: Can't match on bar xs xs Refl-reg034.idr:9:5:When elaborating left hand side of foo:+reg034.idr:9:5:When checking left hand side of foo: Can't match on foo f x x Refl
test/reg044/expected view
@@ -1,11 +1,11 @@-reg044.idr:4:4:When elaborating right hand side of Main.pf:-Can't unify+reg044.idr:4:4:When checking right hand side of Main.pf:+Type mismatch between b = b (Type of Refl)-with+and a = b (Expected type) Specifically:- Can't unify+ Type mismatch between b- with+ and a
test/reg049/expected view
@@ -1,4 +1,4 @@-reg049.idr:2:9:When elaborating constructor Main.Bogus:+reg049.idr:2:9:When checking constructor Main.Bogus: Void is not Main.Foo-reg049.idr:5:6:When elaborating right hand side of uhOh:+reg049.idr:5:6:When checking right hand side of uhOh: No such variable Bogus
test/reg054/expected view
@@ -1,12 +1,13 @@-reg054.idr:18:5:When elaborating left hand side of inf:-When elaborating an application of constructor Main.MkInfer:+reg054.idr:18:5:When checking left hand side of inf:+When checking an application of constructor Main.MkInfer: Attempting concrete match on polymorphic argument: 0-reg054.idr:34:7:When elaborating left hand side of weird:-When elaborating argument x to Main.weird:- No explicit types on left hand side: Char-reg054.idr:37:1-8:When elaborating left hand side of tctrick:-When elaborating an application of Main.tctrick:- Can't unify+reg054.idr:34:7:When checking left hand side of weird:+No explicit types on left hand side: Char+reg054.idr:37:8:When checking left hand side of weird':+No explicit types on left hand side: Nat+reg054.idr:40:1-8:When checking left hand side of tctrick:+When checking an application of Main.tctrick:+ Type mismatch between Maybe a1 (Type of Just x)- with+ and a (Expected type)
test/reg054/reg054.idr view
@@ -33,6 +33,9 @@ weird : Weird x -> x weird {x = Char} y = '5' +weird' : Weird x -> x+weird' {x = Prelude.Nat.Nat} y = Z+ tctrick : a -> Int tctrick (Just x) = x tctrick Nothing = 42
test/reg055/expected view
@@ -1,9 +1,9 @@-reg055.idr:5:3:When elaborating left hand side of g:+reg055.idr:5:3:When checking left hand side of g: Can't match on g (f 0)-reg055.idr:8:3:When elaborating left hand side of h:+reg055.idr:8:3:When checking left hand side of h: Can't match on h x x-reg055a.idr:8:5:When elaborating left hand side of foo:-When elaborating an application of constructor Foo.CAny:+reg055a.idr:8:5:When checking left hand side of foo:+When checking an application of constructor Foo.CAny: Attempting concrete match on polymorphic argument: Nothing-reg055a.idr:13:7:When elaborating left hand side of Foo.apply:+reg055a.idr:13:7:When checking left hand side of Foo.apply: Can't match on apply (\x => \y => x) a
+ test/reg066/expected view
+ test/reg066/reg066.idr view
@@ -0,0 +1,7 @@+foo : Reflection.Raw -> Bool+foo `(~_ -> ~_) = True+foo _ = False++foo' : TT -> Bool+foo' `(~_ -> ~_) = True+foo' _ = False
+ test/reg066/run view
@@ -0,0 +1,3 @@+#!/usr/bin/env bash+idris $@ reg066.idr --check --nocolor+rm -f *.ibc
+ test/syntax001/Syntax.idr view
@@ -0,0 +1,8 @@+module Syntax++syntax "fnord" [y] = y + y + y++foo : Nat+foo = fnord "argh"++
+ test/syntax001/SyntaxOk.idr view
@@ -0,0 +1,6 @@+module SyntaxOk++syntax "fnord" [y] = y + y + y+++
+ test/syntax001/SyntaxTest.idr view
@@ -0,0 +1,5 @@+module SyntaxTest+import SyntaxOk++foo : Nat+foo = fnord "argh"
+ test/syntax001/expected view
@@ -0,0 +1,12 @@+Syntax.idr:6:7-9:1:When checking right hand side of foo:+When checking an application of function Prelude.Classes.+:+ Type mismatch between+ String (Type of "argh")+ and+ Nat (Expected type)+SyntaxTest.idr:5:7-6:1:When checking right hand side of foo:+When checking an application of function Prelude.Classes.+:+ Type mismatch between+ String (Type of "argh")+ and+ Nat (Expected type)
+ test/syntax001/run view
@@ -0,0 +1,4 @@+#!/usr/bin/env bash+idris $@ Syntax.idr --nocolour --consolewidth 80 --check+idris $@ SyntaxTest.idr --nocolour --consolewidth 80 --check+rm -f *.ibc
+ test/syntax002/expected view
@@ -0,0 +1,2 @@+Nothing+7
+ test/syntax002/run view
@@ -0,0 +1,4 @@+#!/usr/bin/env bash+idris $@ syntax002.idr -o syntax002+./syntax002+rm -f syntax002 *.ibc
+ test/syntax002/syntax002.idr view
@@ -0,0 +1,22 @@++decl syntax fun {n} ":" [ty] "=" [def] + = n : ty+ n = def++decl syntax newtype {tname} "=" {conname} [tysyn]+ = data tname = conname tysyn++decl syntax EmptyShow {n} =+ instance Show n where+ show x = "Nothing" ++fun add : (Int -> Int -> Int) = \x, y => x + y++newtype Foo = MkFoo Int ++EmptyShow Foo++main : IO ()+main = do printLn (MkFoo 42)+ printLn (add 3 4)+
test/tactics001/Tactics.idr view
@@ -33,7 +33,7 @@ mkDecl : () mkDecl = %runElab (do declareType $ Declare (NS (UN "repUnit") ["Tactics"])- [Implicit (UN "z") `(Nat)]+ [MkFunArg (UN "z") `(Nat) Implicit NotErased] `(Vect ~(Var (UN "z")) ()) fill `(() : ()) solve)
test/totality007/expected view
@@ -1,3 +1,5 @@+Entering directory `./src' Totality.idr:4:1: Totality.foo is not total as there are missing cases Totality.idr:4:1:Could not build: Totality.foo is not total as there are missing cases+Leaving directory `./src'
test/tutorial006/expected view
@@ -1,25 +1,24 @@-tutorial006a.idr:5:23-25:-When elaborating right hand side of vapp:-When elaborating argument xs to constructor Data.VectType.Vect.:::- Can't unify- Vect (n + n) a (Type of vapp xs xs)- with- Vect (plus n m) a (Expected type)+tutorial006a.idr:5:23-25:When checking right hand side of vapp:+When checking argument xs to constructor Data.VectType.Vect.:::+ Type mismatch between+ Vect (k + k) a (Type of vapp xs xs)+ and+ Vect (plus k m) a (Expected type) Specifically:- Can't unify- plus n n- with- plus n m+ Type mismatch between+ plus k k+ and+ plus k m tutorial006b.idr:10:10:-When elaborating right hand side of with block in Main.parity:-Can't unify+When checking right hand side of with block in Main.parity:+Type mismatch between Parity (plus (S j) (S j)) (Type of even)-with+and Parity (S (S (plus j j))) (Expected type) Specifically:- Can't unify+ Type mismatch between plus (S j) (S j)- with+ and S (S (plus j j))
test/unique001/expected view
@@ -2,17 +2,17 @@ 19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,END 38,36,34,32,30,28,26,24,22,20,18,16,14,12,10,8,6,4,2,0,END 38,36,34,32,30,28,26,24,22,20,18,16,14,12,10,8,6,4,2,0,END-unique001a.idr:33:11:Can't convert+unique001a.idr:33:11:Type mismatch between Int -> String-with+and UniqueType (Int -> String)-unique001a.idr:44:12:Can't convert+unique001a.idr:44:12:Type mismatch between Int -> String-with+and UniqueType (Int -> String)-unique001a.idr:55:12:Can't convert+unique001a.idr:55:12:Type mismatch between UniqueType (Int -> String)-with+and Int -> String unique001b.idr:16:7:Borrowed name xs must not be used on RHS unique001c.idr:46:6:Unique name f is used more than once
test/unique002/expected view
@@ -1,5 +1,5 @@ unique002.idr:15:5:Unique name xs is used more than once-unique002a.idr:15:5:Can't convert+unique002a.idr:15:5:Type mismatch between Int -> String-with+and UniqueType (Int -> String)
test/unique003/expected view
@@ -1,4 +1,4 @@-unique003.idr:18:5:Can't convert+unique003.idr:18:5:Type mismatch between Int -> String-with+and UniqueType (Int -> String)