idris 0.9.14.3 → 0.9.15
raw patch · 190 files changed
+4342/−5336 lines, 190 filesdep −Cabaldep −language-javadep −llvm-generaldep ~Win32dep ~annotated-wl-pprintdep ~ansi-terminalsetup-changedPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependencies removed: Cabal, language-java, llvm-general, llvm-general-pure
Dependency ranges changed: Win32, annotated-wl-pprint, ansi-terminal, ansi-wl-pprint, base, base64-bytestring, binary, blaze-html, bytestring, cheapskate, containers, deepseq, directory, filepath, fingertree, haskeline, hscurses, lens, libffi, mtl, network, optparse-applicative, pretty, process, split, text, time, transformers, trifecta, unix, unordered-containers, utf8-string, vector, vector-binary-instances, xml, zlib
API changes (from Hackage documentation)
- IRTS.CodegenCommon: optimisation :: CodegenInfo -> Word
- IRTS.CodegenJava: codegenJava :: CodeGenerator
- IRTS.Java.ASTBuilding: (<>) :: Type -> Exp -> Exp
- IRTS.Java.ASTBuilding: (@!) :: Exp -> Int -> ArrayIndex
- IRTS.Java.ASTBuilding: (@:=) :: Either ArrayIndex Ident -> Exp -> BlockStmt
- IRTS.Java.ASTBuilding: (~&&~) :: Exp -> Exp -> Exp
- IRTS.Java.ASTBuilding: (~==~) :: Exp -> Exp -> Exp
- IRTS.Java.ASTBuilding: (~>) :: InvocationTarget a => a -> String -> [Argument] -> Exp
- IRTS.Java.ASTBuilding: addToBlock :: [BlockStmt] -> Exp -> [BlockStmt]
- IRTS.Java.ASTBuilding: arrayInitExps :: [Exp] -> VarInit
- IRTS.Java.ASTBuilding: bigInteger :: String -> Exp
- IRTS.Java.ASTBuilding: call :: Callable a => a -> [Argument] -> Exp
- IRTS.Java.ASTBuilding: class Callable a
- IRTS.Java.ASTBuilding: class InvocationTarget a
- IRTS.Java.ASTBuilding: closure :: Exp -> Exp
- IRTS.Java.ASTBuilding: declareFinalObjectArray :: Ident -> Maybe VarInit -> BlockStmt
- IRTS.Java.ASTBuilding: extendWithNull :: [Exp] -> Int -> [Exp]
- IRTS.Java.ASTBuilding: instance Callable Ident
- IRTS.Java.ASTBuilding: instance Callable Name
- IRTS.Java.ASTBuilding: instance Callable String
- IRTS.Java.ASTBuilding: instance InvocationTarget ClassType
- IRTS.Java.ASTBuilding: instance InvocationTarget Exp
- IRTS.Java.ASTBuilding: instance InvocationTarget Type
- IRTS.Java.ASTBuilding: jConst :: String -> Exp
- IRTS.Java.ASTBuilding: jInt :: Int -> Exp
- IRTS.Java.ASTBuilding: jName :: String -> Name
- IRTS.Java.ASTBuilding: jReturn :: Exp -> BlockStmt
- IRTS.Java.ASTBuilding: jString :: String -> Exp
- IRTS.Java.ASTBuilding: localVar :: Int -> Ident
- IRTS.Java.ASTBuilding: simpleMethod :: [Modifier] -> Maybe Type -> String -> [FormalParam] -> Block -> Decl
- IRTS.Java.ASTBuilding: toClassType :: Type -> ClassType
- IRTS.Java.ASTBuilding: toRefType :: Type -> RefType
- IRTS.Java.JTypes: addressType :: Type
- IRTS.Java.JTypes: arithTyToJType :: ArithTy -> Type
- IRTS.Java.JTypes: array :: Type -> Type
- IRTS.Java.JTypes: arraysType :: Type
- IRTS.Java.JTypes: bigIntegerType :: Type
- IRTS.Java.JTypes: box :: Type -> Type
- IRTS.Java.JTypes: bufferType :: Type
- IRTS.Java.JTypes: byteType :: Type
- IRTS.Java.JTypes: callableType :: Type
- IRTS.Java.JTypes: charType :: Type
- IRTS.Java.JTypes: constType :: Const -> Type
- IRTS.Java.JTypes: contextArray :: LVar -> Exp
- IRTS.Java.JTypes: contextParam :: FormalParam
- IRTS.Java.JTypes: doubleType :: Type
- IRTS.Java.JTypes: endiannessArguments :: PrimFn -> [Exp]
- IRTS.Java.JTypes: endiannessConstant :: Endianness -> Exp
- IRTS.Java.JTypes: exceptionType :: Type
- IRTS.Java.JTypes: foreignType :: FType -> Maybe Type
- IRTS.Java.JTypes: foreignWrapperType :: Type
- IRTS.Java.JTypes: globalContext :: Exp
- IRTS.Java.JTypes: globalContextID :: Ident
- IRTS.Java.JTypes: idrisClosureType :: Type
- IRTS.Java.JTypes: idrisObjectType :: Type
- IRTS.Java.JTypes: idrisTailCallClosureType :: Type
- IRTS.Java.JTypes: intTyToJType :: IntTy -> Type
- IRTS.Java.JTypes: integerType :: Type
- IRTS.Java.JTypes: isArray :: Type -> Bool
- IRTS.Java.JTypes: isFloating :: Type -> Bool
- IRTS.Java.JTypes: isPrimitive :: Type -> Bool
- IRTS.Java.JTypes: isString :: Type -> Bool
- IRTS.Java.JTypes: localContext :: Exp
- IRTS.Java.JTypes: localContextID :: Ident
- IRTS.Java.JTypes: longType :: Type
- IRTS.Java.JTypes: mathType :: Type
- IRTS.Java.JTypes: nativeTyToJType :: NativeTy -> Type
- IRTS.Java.JTypes: newContext :: Exp
- IRTS.Java.JTypes: newContextID :: Ident
- IRTS.Java.JTypes: objectType :: Type
- IRTS.Java.JTypes: opName :: PrimFn -> String
- IRTS.Java.JTypes: primFnType :: Type
- IRTS.Java.JTypes: runtimeExceptionType :: Type
- IRTS.Java.JTypes: shortType :: Type
- IRTS.Java.JTypes: sourceTypes :: PrimFn -> [Type]
- IRTS.Java.JTypes: stringType :: Type
- IRTS.Java.JTypes: threadType :: Type
- IRTS.Java.JTypes: voidType :: Type
- IRTS.Java.Mangling: liftParsed :: (Show e, MonadError String m) => Either e a -> m a
- IRTS.Java.Mangling: mangle :: (Applicative m, MonadError String m) => Name -> m Ident
- IRTS.Java.Mangling: mangle' :: Name -> Ident
- IRTS.Java.Mangling: mangleFull :: (Applicative m, MonadError String m) => Name -> m Name
- IRTS.Java.Mangling: mangleWithPrefix :: (Applicative m, MonadError String m) => String -> Name -> m Ident
- IRTS.Java.Mangling: mkClassName :: MonadError String m => FilePath -> m Ident
- IRTS.Java.Mangling: prefixCallNamespaces :: Ident -> SDecl -> SDecl
- IRTS.Java.Pom: pomString :: String -> String -> [String] -> String
- Idris.AbsSyntax: optLevel :: Idris Word
- Idris.AbsSyntaxTree: PFalse :: FC -> PTerm
- Idris.AbsSyntaxTree: elimDecl :: PDecl' PTerm
- Idris.AbsSyntaxTree: elimMethElim :: Name
- Idris.AbsSyntaxTree: elimMethElimTy :: Name
- Idris.AbsSyntaxTree: elimName :: Name
- Idris.AbsSyntaxTree: falseDecl :: PData' PTerm
- Idris.AbsSyntaxTree: falseOpts :: [t]
- Idris.AbsSyntaxTree: opt_optLevel :: IOption -> Word
- Idris.AbsSyntaxTree: pairDecl :: PData' PTerm
- Idris.AbsSyntaxTree: pairDoc :: Doc
- Idris.AbsSyntaxTree: pairOpts :: [t]
- Idris.AbsSyntaxTree: pairParamDoc :: [(Name, Doc)]
- Idris.AbsSyntaxTree: prettyDocumentedIst :: IState -> (Name, PTerm, Maybe Docstring) -> Doc OutputAnnotation
- Idris.AbsSyntaxTree: unitDecl :: PData' PTerm
- Idris.AbsSyntaxTree: unitDoc :: Doc
- Idris.AbsSyntaxTree: unitOpts :: [DataOpt]
- Idris.Apropos: instance Apropos Docstring
- Idris.DeepSeq: instance NFData Block
- Idris.DeepSeq: instance NFData Doc
- Idris.DeepSeq: instance NFData Inline
- Idris.Docs: instance Show Docs
- Idris.Docs: instance Show FunDoc
- Idris.Docstrings: type Docstring = Doc
- Idris.ElabDecls: elabTransform :: ElabInfo -> FC -> Bool -> PTerm -> PTerm -> Idris ()
- Idris.IBC: instance Binary Block
- Idris.IBC: instance Binary Doc
- Idris.IBC: instance Binary Inline
- Idris.Transforms: CaseTrans :: (SC -> SC) -> TTOpt
- Idris.Transforms: TermTrans :: (TT Name -> TT Name) -> TTOpt
- Idris.Transforms: class Transform a
- Idris.Transforms: data TTOpt
- Idris.Transforms: instance Transform (TT Name)
- Idris.Transforms: instance Transform CaseAlt
- Idris.Transforms: instance Transform SC
- Idris.Transforms: instance Transform a => Transform (Binder a)
- Idris.Transforms: natTrans :: [TTOpt]
- Idris.Transforms: natcase :: SC -> SC
- Idris.Transforms: sname :: Name
- Idris.Transforms: suc :: TT Name -> TT Name
- Idris.Transforms: transform :: Transform a => TTOpt -> a -> a
- Idris.Transforms: zero :: TT Name -> TT Name
- Idris.Transforms: zname :: Name
+ IRTS.Lang: LFNegate :: PrimFn
+ Idris.AbsSyntax: addOptimise :: Optimisation -> Idris ()
+ Idris.AbsSyntax: getOptimise :: Idris [Optimisation]
+ Idris.AbsSyntax: removeOptimise :: Optimisation -> Idris ()
+ Idris.AbsSyntax: setOptimise :: [Optimisation] -> Idris ()
+ Idris.AbsSyntaxTree: AddOpt :: Optimisation -> Opt
+ Idris.AbsSyntaxTree: HTMLOutput :: OutputFmt
+ Idris.AbsSyntaxTree: LaTeXOutput :: OutputFmt
+ Idris.AbsSyntaxTree: PETransform :: Optimisation
+ Idris.AbsSyntaxTree: PPrint :: OutputFmt -> Int -> PTerm -> Command
+ Idris.AbsSyntaxTree: Port :: String -> Opt
+ Idris.AbsSyntaxTree: PrintDef :: Name -> Command
+ Idris.AbsSyntaxTree: RemoveOpt :: Optimisation -> Opt
+ Idris.AbsSyntaxTree: TransformInfo :: Name -> Command
+ Idris.AbsSyntaxTree: data Optimisation
+ Idris.AbsSyntaxTree: data OutputFmt
+ Idris.AbsSyntaxTree: defaultOptimise :: [Optimisation]
+ Idris.AbsSyntaxTree: instance Eq Optimisation
+ Idris.AbsSyntaxTree: instance Show Optimisation
+ Idris.AbsSyntaxTree: opt_optimise :: IOption -> [Optimisation]
+ Idris.AbsSyntaxTree: syntaxNames :: Syntax -> [Name]
+ Idris.Apropos: instance Apropos (Docstring a)
+ Idris.Core.Binary: instance Binary ErrorReportPart
+ Idris.Core.Binary: instance Binary a => Binary (Err' a)
+ Idris.Core.Evaluate: lookupDefAccExact :: Name -> Bool -> Context -> Maybe (Def, Accessibility)
+ Idris.Core.TT: AnnErr :: Err -> OutputAnnotation
+ Idris.Core.TT: AnnSearchResult :: Ordering -> OutputAnnotation
+ Idris.Core.TT: uniqueNameSet :: Name -> Set Name -> Name
+ Idris.DeepSeq: instance NFData a => NFData (Block a)
+ Idris.DeepSeq: instance NFData a => NFData (Docstring a)
+ Idris.DeepSeq: instance NFData a => NFData (Inline a)
+ Idris.Docstrings: Blockquote :: (Blocks a) -> Block a
+ Idris.Docstrings: Checked :: Term -> DocTerm
+ Idris.Docstrings: Code :: Text -> a -> Inline a
+ Idris.Docstrings: CodeBlock :: CodeAttr -> Text -> a -> Block a
+ Idris.Docstrings: DocString :: Options -> (Blocks a) -> Docstring a
+ Idris.Docstrings: Emph :: (Inlines a) -> Inline a
+ Idris.Docstrings: Entity :: Text -> Inline a
+ Idris.Docstrings: Example :: Term -> DocTerm
+ Idris.Docstrings: Failing :: Err -> DocTerm
+ Idris.Docstrings: HRule :: Block a
+ Idris.Docstrings: Header :: Int -> (Inlines a) -> Block a
+ Idris.Docstrings: HtmlBlock :: Text -> Block a
+ Idris.Docstrings: Image :: (Inlines a) -> Text -> Text -> Inline a
+ Idris.Docstrings: LineBreak :: Inline a
+ Idris.Docstrings: Link :: (Inlines a) -> Text -> Text -> Inline a
+ Idris.Docstrings: List :: Bool -> ListType -> [Blocks a] -> Block a
+ Idris.Docstrings: Para :: (Inlines a) -> Block a
+ Idris.Docstrings: RawHtml :: Text -> Inline a
+ Idris.Docstrings: SoftBreak :: Inline a
+ Idris.Docstrings: Space :: Inline a
+ Idris.Docstrings: Str :: Text -> Inline a
+ Idris.Docstrings: Strong :: (Inlines a) -> Inline a
+ Idris.Docstrings: Unchecked :: DocTerm
+ Idris.Docstrings: annotCode :: (String -> b) -> Docstring a -> Docstring b
+ Idris.Docstrings: checkDocstring :: (String -> [String] -> String -> a -> b) -> Docstring a -> Docstring b
+ Idris.Docstrings: data Block a
+ Idris.Docstrings: data DocTerm
+ Idris.Docstrings: data Docstring a
+ Idris.Docstrings: data Inline a
+ Idris.Docstrings: instance Foldable Block
+ Idris.Docstrings: instance Foldable Docstring
+ Idris.Docstrings: instance Foldable Inline
+ Idris.Docstrings: instance Functor Block
+ Idris.Docstrings: instance Functor Docstring
+ Idris.Docstrings: instance Functor Inline
+ Idris.Docstrings: instance Show DocTerm
+ Idris.Docstrings: instance Show a => Show (Block a)
+ Idris.Docstrings: instance Show a => Show (Docstring a)
+ Idris.Docstrings: instance Show a => Show (Inline a)
+ Idris.Docstrings: instance Traversable Block
+ Idris.Docstrings: instance Traversable Docstring
+ Idris.Docstrings: instance Traversable Inline
+ Idris.Docstrings: renderDocTerm :: (Term -> Doc OutputAnnotation) -> (Term -> Term) -> DocTerm -> String -> Doc OutputAnnotation
+ Idris.Docstrings: renderHtml :: Docstring DocTerm -> Html
+ Idris.Elab.Transform: elabTransform :: ElabInfo -> FC -> Bool -> PTerm -> PTerm -> Idris (Term, Term)
+ Idris.Elab.Utils: getStaticNames :: IState -> Term -> [Name]
+ Idris.Elab.Utils: getStatics :: [Name] -> Term -> [Bool]
+ Idris.Elab.Utils: mkStatic :: [Name] -> PDecl -> PDecl
+ Idris.Elab.Utils: mkStaticTy :: [Name] -> PTerm -> PTerm
+ Idris.Elab.Value: elabDocTerms :: ElabInfo -> Docstring (Either Err PTerm) -> Idris (Docstring DocTerm)
+ Idris.Help: NumberArg :: CmdArg
+ Idris.IBC: instance Binary DocTerm
+ Idris.IBC: instance Binary a => Binary (Block a)
+ Idris.IBC: instance Binary a => Binary (Docstring a)
+ Idris.IBC: instance Binary a => Binary (Inline a)
+ Idris.IdeSlave: ErrPPrint :: Err -> IdeSlaveCommand
+ Idris.IdeSlave: ErrString :: Err -> IdeSlaveCommand
+ Idris.IdeSlave: PrintDef :: String -> IdeSlaveCommand
+ Idris.Output: prettyDocumentedIst :: IState -> (Name, PTerm, Maybe (Docstring DocTerm)) -> Doc OutputAnnotation
+ Idris.Output: renderExternal :: OutputFmt -> Int -> Doc OutputAnnotation -> Idris String
+ Idris.ParseExpr: tryFullExpr :: SyntaxInfo -> IState -> String -> Either Err PTerm
+ Idris.Parser: addReplSyntax :: IState -> Syntax -> IState
+ Idris.Parser: addSyntax :: IState -> Syntax -> IState
+ Idris.PartialEval: pe_app :: PEDecl -> PTerm
+ Idris.PartialEval: pe_clauses :: PEDecl -> [(PTerm, PTerm)]
+ Idris.PartialEval: pe_def :: PEDecl -> PTerm
+ Idris.PartialEval: pe_simple :: PEDecl -> Bool
+ Idris.REPL: defaultPort :: PortID
+ Idris.REPL: getClient :: Opt -> Maybe String
+ Idris.REPL: getOptimisation :: Opt -> Maybe (Idris ())
+ Idris.REPL: getPort :: [Opt] -> PortID
+ Idris.REPL: pprintDef :: Name -> Idris [Doc OutputAnnotation]
+ Idris.Transforms: applyTransRules :: IState -> Term -> Term
+ Idris.Transforms: applyTransRulesWith :: [(Term, Term)] -> Term -> Term
+ Idris.Transforms: transformPats :: IState -> [Either Term (Term, Term)] -> [Either Term (Term, Term)]
+ Idris.Transforms: transformPatsWith :: [(Term, Term)] -> [Either Term (Term, Term)] -> [Either Term (Term, Term)]
+ Util.System: catchIO :: IO a -> (IOError -> IO a) -> IO a
+ Util.System: rmFile :: FilePath -> IO ()
+ Util.System: tempfile :: IO (FilePath, Handle)
+ Util.System: withTempdir :: String -> (FilePath -> IO a) -> IO a
- IRTS.CodegenCommon: CodegenInfo :: String -> OutputType -> String -> String -> Word -> [FilePath] -> [FilePath] -> [String] -> [String] -> [String] -> DbgLevel -> [(Name, SDecl)] -> [(Name, DDecl)] -> [(Name, LDecl)] -> CodegenInfo
+ IRTS.CodegenCommon: CodegenInfo :: String -> OutputType -> String -> String -> [FilePath] -> [FilePath] -> [String] -> [String] -> [String] -> DbgLevel -> [(Name, SDecl)] -> [(Name, DDecl)] -> [(Name, LDecl)] -> CodegenInfo
- Idris.AbsSyntax: addDocStr :: Name -> Docstring -> [(Name, Docstring)] -> Idris ()
+ Idris.AbsSyntax: addDocStr :: Name -> Docstring DocTerm -> [(Name, Docstring DocTerm)] -> Idris ()
- Idris.AbsSyntax: addTrans :: (Term, Term) -> Idris ()
+ Idris.AbsSyntax: addTrans :: Name -> (Term, Term) -> Idris ()
- Idris.AbsSyntax: setOptLevel :: Word -> Idris ()
+ Idris.AbsSyntax: setOptLevel :: Int -> Idris ()
- Idris.AbsSyntaxTree: IBCTrans :: (Term, Term) -> IBCWrite
+ Idris.AbsSyntaxTree: IBCTrans :: Name -> (Term, Term) -> IBCWrite
- Idris.AbsSyntaxTree: IOption :: Int -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Codegen -> OutputType -> FilePath -> [FilePath] -> String -> String -> Word -> [Opt] -> Bool -> Bool -> [FilePath] -> 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] -> IOption
- Idris.AbsSyntaxTree: IState :: Context -> [(UConstraint, FC)] -> [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, [(Name, Docstring)]) -> Ctxt TIData -> Ctxt FnInfo -> [(FC, Name)] -> [(FC, Name)] -> [(FC, String)] -> IOption -> Int -> [((FilePath, Int), PTerm)] -> [(Name, (Maybe Name, Int, Bool))] -> [Name] -> [(Term, Term)] -> [(Term, Term)] -> [Syntax] -> [String] -> [FilePath] -> [(Name, (Int, PrimFn))] -> [(Codegen, FilePath)] -> [(Codegen, String)] -> [(Codegen, String)] -> [(Codegen, String)] -> [FilePath] -> [(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 -> Maybe (Map Name [Name]) -> Maybe (Map Name [Name]) -> [Name] -> IState
+ Idris.AbsSyntaxTree: IState :: Context -> [(UConstraint, FC)] -> [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 TIData -> Ctxt FnInfo -> Ctxt [(Term, Term)] -> [(FC, Name)] -> [(FC, Name)] -> [(FC, String)] -> IOption -> Int -> [((FilePath, Int), PTerm)] -> [(Name, (Maybe Name, Int, Bool))] -> [Name] -> [(Term, Term)] -> [Syntax] -> [String] -> [FilePath] -> [(Name, (Int, PrimFn))] -> [(Codegen, FilePath)] -> [(Codegen, String)] -> [(Codegen, String)] -> [(Codegen, String)] -> [FilePath] -> [(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 -> Maybe (Map Name [Name]) -> Maybe (Map Name [Name]) -> [Name] -> IState
- Idris.AbsSyntaxTree: OptLevel :: Word -> Opt
+ Idris.AbsSyntaxTree: OptLevel :: Int -> Opt
- Idris.AbsSyntaxTree: PClass :: Docstring -> SyntaxInfo -> FC -> [t] -> Name -> [(Name, t)] -> [(Name, Docstring)] -> [PDecl' t] -> PDecl' t
+ Idris.AbsSyntaxTree: PClass :: (Docstring (Either Err PTerm)) -> SyntaxInfo -> FC -> [t] -> Name -> [(Name, t)] -> [(Name, Docstring (Either Err PTerm))] -> [PDecl' t] -> PDecl' t
- Idris.AbsSyntaxTree: PData :: Docstring -> [(Name, Docstring)] -> SyntaxInfo -> FC -> DataOpts -> (PData' t) -> PDecl' t
+ Idris.AbsSyntaxTree: PData :: (Docstring (Either Err PTerm)) -> [(Name, Docstring (Either Err PTerm))] -> SyntaxInfo -> FC -> DataOpts -> (PData' t) -> PDecl' t
- Idris.AbsSyntaxTree: PDatadecl :: Name -> t -> [(Docstring, [(Name, Docstring)], Name, t, FC, [Name])] -> PData' t
+ Idris.AbsSyntaxTree: PDatadecl :: Name -> t -> [(Docstring (Either Err PTerm), [(Name, Docstring (Either Err PTerm))], Name, t, FC, [Name])] -> PData' t
- Idris.AbsSyntaxTree: PPostulate :: Docstring -> SyntaxInfo -> FC -> FnOpts -> Name -> t -> PDecl' t
+ Idris.AbsSyntaxTree: PPostulate :: (Docstring (Either Err PTerm)) -> SyntaxInfo -> FC -> FnOpts -> Name -> t -> PDecl' t
- Idris.AbsSyntaxTree: PRecord :: Docstring -> SyntaxInfo -> FC -> Name -> t -> DataOpts -> Docstring -> Name -> t -> PDecl' t
+ Idris.AbsSyntaxTree: PRecord :: (Docstring (Either Err PTerm)) -> SyntaxInfo -> FC -> Name -> t -> DataOpts -> (Docstring (Either Err PTerm)) -> Name -> t -> PDecl' t
- Idris.AbsSyntaxTree: PTy :: Docstring -> [(Name, Docstring)] -> SyntaxInfo -> FC -> FnOpts -> Name -> t -> PDecl' t
+ Idris.AbsSyntaxTree: PTy :: (Docstring (Either Err PTerm)) -> [(Name, Docstring (Either Err PTerm))] -> SyntaxInfo -> FC -> FnOpts -> Name -> t -> PDecl' t
- Idris.AbsSyntaxTree: Syn :: [Using] -> [(Name, PTerm)] -> [String] -> [Name] -> (Name -> Name) -> Bool -> Bool -> Maybe Int -> Int -> DSL -> Bool -> SyntaxInfo
+ Idris.AbsSyntaxTree: Syn :: [Using] -> [(Name, PTerm)] -> [String] -> [Name] -> (Name -> Name) -> Bool -> Bool -> Maybe Int -> Int -> DSL -> Int -> SyntaxInfo
- Idris.AbsSyntaxTree: d_cons :: PData' t -> [(Docstring, [(Name, Docstring)], Name, t, FC, [Name])]
+ Idris.AbsSyntaxTree: d_cons :: PData' t -> [(Docstring (Either Err PTerm), [(Name, Docstring (Either Err PTerm))], Name, t, FC, [Name])]
- Idris.AbsSyntaxTree: eqDoc :: Doc
+ Idris.AbsSyntaxTree: eqDoc :: Docstring (Either (Err' t) b)
- Idris.AbsSyntaxTree: eqOpts :: [t]
+ Idris.AbsSyntaxTree: eqOpts :: [a]
- Idris.AbsSyntaxTree: eqParamDoc :: [(Name, Doc)]
+ Idris.AbsSyntaxTree: eqParamDoc :: [(Name, Docstring (Either (Err' t) b))]
- Idris.AbsSyntaxTree: falseDoc :: Doc
+ Idris.AbsSyntaxTree: falseDoc :: Docstring (Err' t)
- Idris.AbsSyntaxTree: idris_docstrings :: IState -> Ctxt (Docstring, [(Name, Docstring)])
+ Idris.AbsSyntaxTree: idris_docstrings :: IState -> Ctxt (Docstring DocTerm, [(Name, Docstring DocTerm)])
- Idris.AbsSyntaxTree: idris_transforms :: IState -> [(Term, Term)]
+ Idris.AbsSyntaxTree: idris_transforms :: IState -> Ctxt [(Term, Term)]
- Idris.AbsSyntaxTree: inferOpts :: [t]
+ Idris.AbsSyntaxTree: inferOpts :: [a]
- Idris.AbsSyntaxTree: syn_in_quasiquote :: SyntaxInfo -> Bool
+ Idris.AbsSyntaxTree: syn_in_quasiquote :: SyntaxInfo -> Int
- Idris.Core.Evaluate: specialise :: Context -> Env -> [(Name, Int)] -> TT Name -> TT Name
+ Idris.Core.Evaluate: specialise :: Context -> Env -> [(Name, Int)] -> TT Name -> (TT Name, [(Name, Int)])
- Idris.Core.TT: prettyEnv :: (Pretty Const a, Pretty NameType a, Pretty a1 a, Show a1, Eq a1) => [(a1, Binder (TT a1))] -> TT a1 -> Doc a
+ Idris.Core.TT: prettyEnv :: (Eq a1, Show a1, Pretty a1 a, Pretty NameType a, Pretty Const a) => [(a1, Binder (TT a1))] -> TT a1 -> Doc a
- Idris.Core.TT: showEnv' :: (Show a, Eq a) => [(a, Binder (TT a))] -> TT a -> Bool -> [Char]
+ Idris.Core.TT: showEnv' :: (Eq a, Show a) => [(a, Binder (TT a))] -> TT a -> Bool -> [Char]
- Idris.Core.TT: showEnvDbg :: (Show a, Eq a) => [(a, Binder (TT a))] -> TT a -> [Char]
+ Idris.Core.TT: showEnvDbg :: (Eq a, Show a) => [(a, Binder (TT a))] -> TT a -> [Char]
- Idris.Docs: ClassDoc :: Name -> Docstring -> [FunDoc] -> [(Name, Maybe Docstring)] -> [PTerm] -> [PTerm] -> Docs
+ Idris.Docs: ClassDoc :: Name -> (Docstring DocTerm) -> [FunDoc] -> [(Name, Maybe (Docstring DocTerm))] -> [PTerm] -> [PTerm] -> Docs
- Idris.Docs: FD :: Name -> Docstring -> [(Name, PTerm, Plicity, Maybe Docstring)] -> PTerm -> (Maybe Fixity) -> FunDoc
+ Idris.Docs: FD :: Name -> (Docstring DocTerm) -> [(Name, PTerm, Plicity, Maybe (Docstring DocTerm))] -> PTerm -> (Maybe Fixity) -> FunDoc
- Idris.Docstrings: containsText :: Text -> Docstring -> Bool
+ Idris.Docstrings: containsText :: Text -> Docstring a -> Bool
- Idris.Docstrings: emptyDocstring :: Docstring
+ Idris.Docstrings: emptyDocstring :: Docstring a
- Idris.Docstrings: noDocs :: (Docstring, [(Name, Docstring)])
+ Idris.Docstrings: noDocs :: (Docstring a, [(Name, Docstring a)])
- Idris.Docstrings: nullDocstring :: Docstring -> Bool
+ Idris.Docstrings: nullDocstring :: Docstring a -> Bool
- Idris.Docstrings: overview :: Docstring -> Docstring
+ Idris.Docstrings: overview :: Docstring a -> Docstring a
- Idris.Docstrings: parseDocstring :: Text -> Doc
+ Idris.Docstrings: parseDocstring :: Text -> Docstring ()
- Idris.Docstrings: renderDocstring :: Docstring -> Doc OutputAnnotation
+ Idris.Docstrings: renderDocstring :: (a -> String -> Doc OutputAnnotation) -> Docstring a -> Doc OutputAnnotation
- Idris.Elab.Class: elabClass :: ElabInfo -> SyntaxInfo -> Docstring -> FC -> [PTerm] -> Name -> [(Name, PTerm)] -> [(Name, Docstring)] -> [PDecl] -> Idris ()
+ Idris.Elab.Class: elabClass :: ElabInfo -> SyntaxInfo -> Docstring (Either Err PTerm) -> FC -> [PTerm] -> Name -> [(Name, PTerm)] -> [(Name, Docstring (Either Err PTerm))] -> [PDecl] -> Idris ()
- Idris.Elab.Clause: elabPE :: ElabInfo -> FC -> Name -> Term -> Idris ()
+ Idris.Elab.Clause: elabPE :: ElabInfo -> FC -> Name -> Term -> Idris [(Term, Term)]
- Idris.Elab.Data: elabData :: ElabInfo -> SyntaxInfo -> Docstring -> [(Name, Docstring)] -> FC -> DataOpts -> PData -> Idris ()
+ Idris.Elab.Data: elabData :: ElabInfo -> SyntaxInfo -> Docstring (Either Err PTerm) -> [(Name, Docstring (Either Err PTerm))] -> FC -> DataOpts -> PData -> Idris ()
- Idris.Elab.Record: elabRecord :: ElabInfo -> SyntaxInfo -> Docstring -> FC -> Name -> PTerm -> DataOpts -> Docstring -> Name -> PTerm -> Idris ()
+ Idris.Elab.Record: elabRecord :: ElabInfo -> SyntaxInfo -> Docstring (Either Err PTerm) -> FC -> Name -> PTerm -> DataOpts -> Docstring (Either Err PTerm) -> Name -> PTerm -> Idris ()
- Idris.Elab.Type: elabPostulate :: ElabInfo -> SyntaxInfo -> Docstring -> FC -> FnOpts -> Name -> PTerm -> Idris ()
+ Idris.Elab.Type: elabPostulate :: ElabInfo -> SyntaxInfo -> Docstring (Either Err PTerm) -> FC -> FnOpts -> Name -> PTerm -> Idris ()
- Idris.Elab.Type: elabType :: ElabInfo -> SyntaxInfo -> Docstring -> [(Name, Docstring)] -> FC -> FnOpts -> Name -> PTerm -> Idris Type
+ Idris.Elab.Type: elabType :: ElabInfo -> SyntaxInfo -> Docstring (Either Err PTerm) -> [(Name, Docstring (Either Err PTerm))] -> FC -> FnOpts -> Name -> PTerm -> Idris Type
- Idris.Elab.Type: elabType' :: Bool -> ElabInfo -> SyntaxInfo -> Docstring -> [(Name, Docstring)] -> FC -> FnOpts -> Name -> PTerm -> Idris Type
+ Idris.Elab.Type: elabType' :: Bool -> ElabInfo -> SyntaxInfo -> Docstring (Either Err PTerm) -> [(Name, Docstring (Either Err PTerm))] -> FC -> FnOpts -> Name -> PTerm -> Idris Type
- Idris.Elab.Utils: checkDocs :: FC -> [(Name, Docstring)] -> PTerm -> Idris ()
+ Idris.Elab.Utils: checkDocs :: FC -> [(Name, Docstring a)] -> PTerm -> Idris ()
- Idris.Elab.Utils: paramNames :: Eq t => [TT t] -> [t] -> [Int] -> [t]
+ Idris.Elab.Utils: paramNames :: Eq a => [TT a] -> [a] -> [Int] -> [a]
- Idris.ElabQuasiquote: extractUnquotes :: PTerm -> Elab' aux (PTerm, [(Name, PTerm)])
+ Idris.ElabQuasiquote: extractUnquotes :: Int -> PTerm -> Elab' aux (PTerm, [(Name, PTerm)])
- Idris.ElabTerm: resTC' :: (Num a, Eq a) => [TT Name] -> Bool -> a -> Term -> Name -> IState -> StateT (ElabState [PDecl]) TC ()
+ Idris.ElabTerm: resTC' :: (Eq a, Num a) => [TT Name] -> Bool -> a -> Term -> Name -> IState -> StateT (ElabState [PDecl]) TC ()
- Idris.IBC: IBCFile :: Word8 -> FilePath -> [Name] -> [FilePath] -> [FilePath] -> [(Name, [PArg])] -> [FixDecl] -> [(Name, [Bool])] -> [(Name, ClassInfo)] -> [(Bool, Name, Name)] -> [(Name, DSL)] -> [(Name, TypeInfo)] -> [(Name, OptInfo)] -> [Syntax] -> [String] -> [(Codegen, FilePath)] -> [(Codegen, String)] -> [(Codegen, String)] -> [String] -> [(Codegen, String)] -> [(Name, Accessibility)] -> [(Name, Totality)] -> [(FC, String)] -> [(Name, [FnOpt])] -> [(Name, FnInfo)] -> [(Name, CGInfo)] -> [(Name, Def)] -> [(Name, (Docstring, [(Name, Docstring)]))] -> [(Term, Term)] -> [(Term, Term)] -> [Name] -> [(FilePath, Int, PTerm)] -> [(Name, Name)] -> [(Name, MetaInformation)] -> [Name] -> [(Name, Name, Name)] -> [(Name, (Maybe Name, Int, Bool))] -> [(Name, ([([Name], Term, Term)], [PTerm]))] -> [Name] -> Maybe FC -> IBCFile
+ Idris.IBC: IBCFile :: Word8 -> FilePath -> [Name] -> [FilePath] -> [FilePath] -> [(Name, [PArg])] -> [FixDecl] -> [(Name, [Bool])] -> [(Name, ClassInfo)] -> [(Bool, Name, Name)] -> [(Name, DSL)] -> [(Name, TypeInfo)] -> [(Name, OptInfo)] -> [Syntax] -> [String] -> [(Codegen, FilePath)] -> [(Codegen, String)] -> [(Codegen, String)] -> [String] -> [(Codegen, String)] -> [(Name, Accessibility)] -> [(Name, Totality)] -> [(FC, String)] -> [(Name, [FnOpt])] -> [(Name, FnInfo)] -> [(Name, CGInfo)] -> [(Name, Def)] -> [(Name, (Docstring DocTerm, [(Name, Docstring DocTerm)]))] -> [(Name, (Term, Term))] -> [(Term, Term)] -> [Name] -> [(FilePath, Int, PTerm)] -> [(Name, Name)] -> [(Name, MetaInformation)] -> [Name] -> [(Name, Name, Name)] -> [(Name, (Maybe Name, Int, Bool))] -> [(Name, ([([Name], Term, Term)], [PTerm]))] -> [Name] -> Maybe FC -> IBCFile
- Idris.IBC: ibc_docstrings :: IBCFile -> [(Name, (Docstring, [(Name, Docstring)]))]
+ Idris.IBC: ibc_docstrings :: IBCFile -> [(Name, (Docstring DocTerm, [(Name, Docstring DocTerm)]))]
- Idris.IBC: ibc_transforms :: IBCFile -> [(Term, Term)]
+ Idris.IBC: ibc_transforms :: IBCFile -> [(Name, (Term, Term))]
- Idris.IBC: pDocs :: [(Name, (Docstring, [(Name, Docstring)]))] -> Idris ()
+ Idris.IBC: pDocs :: [(Name, (Docstring DocTerm, [(Name, Docstring DocTerm)]))] -> Idris ()
- Idris.IBC: pTrans :: [(Term, Term)] -> Idris ()
+ Idris.IBC: pTrans :: [(Name, (Term, Term))] -> Idris ()
- Idris.Output: iPrintFunTypes :: [(Name, Bool)] -> Name -> [(Name, PTerm)] -> Idris ()
+ Idris.Output: iPrintFunTypes :: [(Name, Bool)] -> Name -> [(Name, Doc OutputAnnotation)] -> Idris ()
- Idris.ParseData: constructor :: SyntaxInfo -> IdrisParser (Docstring, [(Name, Docstring)], Name, PTerm, FC, [Name])
+ Idris.ParseData: constructor :: SyntaxInfo -> IdrisParser (Docstring (Either Err PTerm), [(Name, Docstring (Either Err PTerm))], Name, PTerm, FC, [Name])
- Idris.ParseData: simpleConstructor :: SyntaxInfo -> IdrisParser (Docstring, [(Name, Docstring)], Name, [PTerm], FC, [Name])
+ Idris.ParseData: simpleConstructor :: SyntaxInfo -> IdrisParser (Docstring (Either Err PTerm), [(Name, Docstring (Either Err PTerm))], Name, [PTerm], FC, [Name])
- Idris.ParseHelpers: docComment :: IdrisParser (Docstring, [(Name, Docstring)])
+ Idris.ParseHelpers: docComment :: IdrisParser (Docstring (), [(Name, Docstring ())])
- Idris.PartialEval: mkPE_TermDecl :: IState -> Name -> Name -> [(PEArgType, Term)] -> [(PTerm, PTerm)]
+ Idris.PartialEval: mkPE_TermDecl :: IState -> Name -> Name -> [(PEArgType, Term)] -> PEDecl
- Idris.PartialEval: partial_eval :: Context -> [(Name, Maybe Int)] -> [Either Term (Term, Term)] -> [Either Term (Term, Term)]
+ Idris.PartialEval: partial_eval :: Context -> [(Name, Maybe Int)] -> [Either Term (Term, Term)] -> Maybe [Either Term (Term, Term)]
- Idris.REPL: getOptLevel :: Opt -> Maybe Word
+ Idris.REPL: getOptLevel :: Opt -> Maybe Int
- Idris.REPL: runClient :: String -> IO ()
+ Idris.REPL: runClient :: PortID -> String -> IO ()
- Idris.REPL: startServer :: IState -> [FilePath] -> Idris ()
+ Idris.REPL: startServer :: PortID -> IState -> [FilePath] -> Idris ()
- Idris.REPLParser: parseCmd :: IState -> String -> String -> Result Command
+ Idris.REPLParser: parseCmd :: IState -> String -> String -> Result (Either String Command)
Files
- Setup.hs +0/−19
- codegen/idris-c/Main.hs +0/−44
- config.mk +4/−1
- idris.cabal +89/−77
- jsrts/Runtime-common.js +9/−1
- libs/base/Control/Isomorphism.idr +58/−58
- libs/base/Control/Isomorphism/Primitives.idr +4/−4
- libs/base/Control/Monad/RWS.idr +19/−19
- libs/base/Data/Bits.idr +2/−2
- libs/base/Data/BoundedList.idr +5/−5
- libs/base/Data/Buffer.idr +2/−2
- libs/base/Data/HVect.idr +9/−9
- libs/base/Data/Hash.idr +85/−0
- libs/base/Data/Heap.idr +10/−10
- libs/base/Data/List.idr +13/−5
- libs/base/Data/Vect.idr +3/−3
- libs/base/Data/Vect/Quantifiers.idr +27/−5
- libs/base/Data/ZZ.idr +31/−22
- libs/base/Decidable/Order.idr +54/−65
- libs/base/Language/Reflection.idr +11/−9
- libs/base/Network/Socket.idr +51/−37
- libs/base/Syntax/PreorderReasoning.idr +3/−3
- libs/base/System/Concurrency/Process.idr +13/−13
- libs/base/base.ipkg +1/−1
- libs/effects/Effect/Memory.idr +12/−12
- libs/effects/Effects.idr +3/−5
- libs/prelude/Builtins.idr +37/−19
- libs/prelude/Decidable/Equality.idr +63/−63
- libs/prelude/Prelude.idr +11/−3
- libs/prelude/Prelude/Algebra.idr +54/−2
- libs/prelude/Prelude/Basics.idr +5/−3
- libs/prelude/Prelude/Bool.idr +5/−4
- libs/prelude/Prelude/Classes.idr +15/−0
- libs/prelude/Prelude/Either.idr +6/−6
- libs/prelude/Prelude/Fin.idr +46/−46
- libs/prelude/Prelude/Foldable.idr +2/−2
- libs/prelude/Prelude/List.idr +129/−28
- libs/prelude/Prelude/Maybe.idr +1/−1
- libs/prelude/Prelude/Nat.idr +116/−110
- libs/prelude/Prelude/Pairs.idr +6/−6
- libs/prelude/Prelude/Stream.idr +12/−0
- libs/prelude/Prelude/Strings.idr +2/−2
- libs/prelude/Prelude/Uninhabited.idr +3/−3
- libs/prelude/Prelude/Vect.idr +114/−67
- llvm/Makefile +0/−25
- llvm/defs.c +0/−182
- main/Main.hs +6/−3
- rts/arduino/idris_main.c +29/−0
- rts/idris_bitstring.c +217/−89
- rts/idris_gc.c +3/−1
- rts/idris_rts.c +2/−1
- rts/idris_rts.h +7/−0
- rts/idris_stats.h +2/−2
- src/IRTS/CodegenC.hs +4/−2
- src/IRTS/CodegenCommon.hs +0/−1
- src/IRTS/CodegenJava.hs +0/−757
- src/IRTS/CodegenJavaScript.hs +4/−0
- src/IRTS/CodegenLLVM.hs +0/−1320
- src/IRTS/Compiler.hs +1/−10
- src/IRTS/DumpBC.hs +1/−1
- src/IRTS/Java/ASTBuilding.hs +0/−141
- src/IRTS/Java/JTypes.hs +0/−331
- src/IRTS/Java/Mangling.hs +0/−116
- src/IRTS/Java/Pom.hs +0/−95
- src/IRTS/Lang.hs +1/−1
- src/Idris/AbsSyntax.hs +101/−47
- src/Idris/AbsSyntaxTree.hs +94/−105
- src/Idris/Apropos.hs +2/−3
- src/Idris/Chaser.hs +5/−1
- src/Idris/CmdOptions.hs +6/−3
- src/Idris/Core/Binary.hs +171/−1
- src/Idris/Core/Constraints.hs +12/−10
- src/Idris/Core/Elaborate.hs +2/−0
- src/Idris/Core/Evaluate.hs +29/−8
- src/Idris/Core/Execute.hs +6/−2
- src/Idris/Core/ProofState.hs +6/−6
- src/Idris/Core/TT.hs +16/−8
- src/Idris/Core/Unify.hs +8/−2
- src/Idris/Coverage.hs +7/−7
- src/Idris/DataOpts.hs +1/−1
- src/Idris/DeepSeq.hs +29/−30
- src/Idris/Delaborate.hs +51/−33
- src/Idris/Docs.hs +21/−19
- src/Idris/Docstrings.hs +242/−69
- src/Idris/Elab/Class.hs +4/−3
- src/Idris/Elab/Clause.hs +179/−104
- src/Idris/Elab/Data.hs +23/−19
- src/Idris/Elab/Instance.hs +8/−7
- src/Idris/Elab/Provider.hs +1/−1
- src/Idris/Elab/Record.hs +2/−2
- src/Idris/Elab/Transform.hs +99/−0
- src/Idris/Elab/Type.hs +17/−7
- src/Idris/Elab/Utils.hs +35/−1
- src/Idris/Elab/Value.hs +25/−2
- src/Idris/ElabDecls.hs +8/−38
- src/Idris/ElabQuasiquote.hs +125/−122
- src/Idris/ElabTerm.hs +80/−81
- src/Idris/Erasure.hs +4/−7
- src/Idris/Error.hs +0/−1
- src/Idris/Help.hs +5/−1
- src/Idris/IBC.hs +94/−82
- src/Idris/IdeSlave.hs +22/−1
- src/Idris/IdrisDoc.hs +7/−7
- src/Idris/Interactive.hs +1/−1
- src/Idris/Output.hs +125/−4
- src/Idris/ParseData.hs +34/−19
- src/Idris/ParseExpr.hs +19/−15
- src/Idris/ParseHelpers.hs +6/−4
- src/Idris/ParseOps.hs +5/−6
- src/Idris/Parser.hs +53/−29
- src/Idris/PartialEval.hs +169/−35
- src/Idris/Primitives.hs +9/−0
- src/Idris/Prover.hs +1/−1
- src/Idris/REPL.hs +189/−64
- src/Idris/REPLParser.hs +361/−175
- src/Idris/Transforms.hs +81/−39
- src/Idris/TypeSearch.hs +10/−9
- src/Idris/Unlit.hs +4/−2
- src/Pkg/Package.hs +7/−4
- src/Util/LLVMStubs.hs +0/−24
- src/Util/System.hs +0/−1
- test/Makefile +1/−1
- test/basic001/basic001a.idr +1/−1
- test/basic001/reg005.idr +2/−2
- test/basic005/test019.lidr +6/−6
- test/basic009/Faulty.idr +1/−1
- test/basic009/Main.idr +4/−4
- test/basic010/Main.idr +2/−2
- test/basic011/basic011.idr +16/−0
- test/basic011/expected +10/−0
- test/basic011/run +4/−0
- test/dsl001/test001.idr +3/−3
- test/dsl002/Resimp.idr +2/−2
- test/dsl003/DSLPi.idr +5/−5
- test/dsl003/expected +2/−2
- test/effects002/test025.idr +6/−6
- test/error004/FunErrTest.idr +3/−3
- test/ffi002/test023.idr +2/−2
- test/ffi005/Postulate.idr +1/−1
- test/interactive001/expected +1/−1
- test/interactive005/expected +34/−0
- test/interactive005/input +26/−0
- test/interactive005/interactive005.idr +3/−0
- test/interactive005/run +6/−0
- test/interactive006/expected +2/−0
- test/interactive006/input +1/−0
- test/interactive006/interactive006.idr +3/−0
- test/interactive006/run +3/−0
- test/io003/test018a.idr +5/−5
- test/primitives002/expected +2/−0
- test/primitives002/run +1/−0
- test/primitives003/test038.idr +5/−5
- test/proof001/test029.idr +2/−2
- test/proof002/Reflect.idr +9/−9
- test/proof003/test015.idr +1/−1
- test/quasiquote001/expected +3/−3
- test/quasiquote003/NoInfer.idr +2/−2
- test/quasiquote004/Quasiquote004.idr +1/−1
- test/reg002/reg002.idr +6/−6
- test/reg006/reg006.idr +3/−3
- test/reg007/reg007.lidr +1/−1
- test/reg009/reg009.lidr +6/−6
- test/reg012/reg012.lidr +13/−13
- test/reg017/reg017.idr +2/−2
- test/reg018/reg018d.idr +3/−3
- test/reg025/reg025.idr +7/−7
- test/reg026/reg026.idr +1/−1
- test/reg034/reg034.idr +2/−2
- test/reg035/reg035.idr +2/−2
- test/reg035/reg035a.lidr +7/−7
- test/reg035/reg035b.idr +1/−1
- test/reg041/ott.idr +1/−1
- test/reg044/reg044.idr +1/−1
- test/reg047/reg047.idr +3/−3
- test/reg047/reg047a.idr +4/−4
- test/reg048/test.idr +0/−26
- test/reg049/expected +1/−1
- test/reg049/reg049.idr +2/−2
- test/reg052/expected +1/−0
- test/reg052/reg052.idr +8/−0
- test/reg052/run +4/−0
- test/reg053/expected +0/−0
- test/reg053/four.idr +9/−0
- test/reg053/run +3/−0
- test/totality002/test017.idr +3/−3
- test/totality002/test017b.idr +1/−1
- test/totality006/expected +1/−1
- test/totality006/totality006.idr +6/−6
- test/totality006/totality006a.idr +6/−6
- test/tutorial004/tutorial004.idr +10/−10
Setup.hs view
@@ -50,13 +50,6 @@ -- ----------------------------------------------------------------------------- -- Flags -usesLLVM :: S.ConfigFlags -> Bool-usesLLVM flags =- case lookup (FlagName "llvm") (S.configConfigurationsFlags flags) of- Just True -> True- Just False -> False- Nothing -> True- usesGMP :: S.ConfigFlags -> Bool usesGMP flags = case lookup (FlagName "gmp") (S.configConfigurationsFlags flags) of@@ -82,15 +75,12 @@ idrisClean _ flags _ _ = do cleanStdLib- cleanLLVM where verbosity = S.fromFlag $ S.cleanVerbosity flags cleanStdLib = do makeClean "libs" - cleanLLVM = makeClean "llvm"- makeClean dir = make verbosity [ "-C", dir, "clean", "IDRIS=idris" ] @@ -189,7 +179,6 @@ idrisBuild _ flags _ local = do buildStdLib buildRTS- when (usesLLVM $ configFlags local) buildLLVM where verbosity = S.fromFlag $ S.buildVerbosity flags @@ -202,8 +191,6 @@ buildRTS = make verbosity (["-C", "rts", "build"] ++ gmpflag (usesGMP (configFlags local))) - buildLLVM = make verbosity ["-C", "llvm", "build"]- gmpflag False = [] gmpflag True = ["GMP=-DIDRIS_GMP"] @@ -215,7 +202,6 @@ idrisInstall verbosity copy pkg local = do installStdLib installRTS- when (usesLLVM $ configFlags local) installLLVM where target = datadir $ L.absoluteInstallDirs pkg local copy @@ -227,11 +213,6 @@ let target' = target </> "rts" putStrLn $ "Installing run time system in " ++ target' makeInstall "rts" target'-- installLLVM = do- let target' = target </> "llvm"- putStrLn $ "Installing LLVM library in " ++ target- makeInstall "llvm" target' makeInstall src target = make verbosity [ "-C", src, "install" , "TARGET=" ++ target, "IDRIS=" ++ idrisCmd local]
− codegen/idris-c/Main.hs
@@ -1,44 +0,0 @@-module Main where--import Idris.Core.TT-import Idris.AbsSyntax-import Idris.ElabDecls-import Idris.REPL--import IRTS.Compiler-import IRTS.CodegenC--import System.Environment-import System.Exit--import Paths_idris--data Opts = Opts { inputs :: [FilePath],- output :: FilePath }--showUsage = do putStrLn "Usage: idris-c <ibc-files> [-o <output-file>]"- exitWith ExitSuccess--getOpts :: IO Opts-getOpts = do xs <- getArgs- return $ process (Opts [] "a.out") xs- where- process opts ("-o":o:xs) = process (opts { output = o }) xs- process opts (x:xs) = process (opts { inputs = x:inputs opts }) xs- process opts [] = opts--c_main :: Opts -> Idris ()-c_main opts = do elabPrims- loadInputs (inputs opts) Nothing- mainProg <- elabMain- ir <- compile (Via "c") (output opts) mainProg- runIO $ codegenC ir--main :: IO ()-main = do opts <- getOpts- if (null (inputs opts)) - then showUsage- else runMain (c_main opts)---
config.mk view
@@ -1,6 +1,9 @@ CC ?=cc CABAL :=cabal-CFLAGS :=-O2 -Wall -DHAS_PTHREAD $(CFLAGS)+# IDRIS_ENABLE_STATS should not be set in final release+# Any flags defined here which alter the RTS API must also be added to src/IRTS/CodegenC.hs+CFLAGS :=-O2 -Wall -DHAS_PTHREAD -DIDRIS_ENABLE_STATS $(CFLAGS)+ #CABALFLAGS := ## Disable building of Effects #CABALFLAGS :=-f NoEffects
idris.cabal view
@@ -1,5 +1,5 @@ Name: idris-Version: 0.9.14.3+Version: 0.9.15 License: BSD3 License-file: LICENSE Author: Edwin Brady@@ -52,12 +52,28 @@ jsrts/Runtime-node.js jsrts/jsbn/jsbn.js jsrts/jsbn/LICENSE+ rts/arduino/idris_main.c+ rts/idris_bitstring.c+ rts/idris_bitstring.h+ rts/idris_gc.c rts/idris_gc.h+ rts/idris_gmp.c rts/idris_gmp.h+ rts/idris_heap.c+ rts/idris_heap.h rts/idris_main.c- rts/idris_rts.h+ rts/idris_net.c rts/idris_net.h+ rts/idris_opts.c+ rts/idris_opts.h+ rts/idris_rts.c+ rts/idris_rts.h+ rts/idris_stats.c+ rts/idris_stats.h+ rts/idris_stdfgn.c rts/idris_stdfgn.h+ rts/mini-gmp.c+ rts/mini-gmp.h rts/libtest.c Extra-source-files:@@ -66,6 +82,7 @@ rts/*.c rts/*.h+ rts/arduino/*.c rts/windows/*.c rts/Makefile @@ -100,9 +117,6 @@ libs/effects/Effect/*.idr libs/effects/*.idr - llvm/*.c- llvm/Makefile- test/Makefile test/runtest.pl test/reg001/run@@ -253,6 +267,12 @@ test/reg051/run test/reg051/*.idr test/reg051/expected+ test/reg052/run+ test/reg052/*.idr+ test/reg052/expected+ test/reg053/run+ test/reg053/*.idr+ test/reg053/expected test/basic001/run test/basic001/*.idr@@ -285,6 +305,9 @@ test/basic010/run test/basic010/*.idr test/basic010/expected+ test/basic011/run+ test/basic011/*.idr+ test/basic011/expected test/buffer001-disabled/*.idr test/buffer001-disabled/run@@ -391,6 +414,14 @@ test/interactive004/input test/interactive004/*.idr test/interactive004/expected+ test/interactive005/run+ test/interactive005/input+ test/interactive005/*.idr+ test/interactive005/expected+ test/interactive006/run+ test/interactive006/input+ test/interactive006/*.idr+ test/interactive006/expected test/io001/run test/io001/*.idr@@ -521,11 +552,6 @@ type: git location: git://github.com/idris-lang/Idris-dev.git -Flag LLVM- Description: Build the LLVM backend- Default: False- manual: True- Flag FFI Description: Build support for libffi Default: False@@ -578,6 +604,7 @@ , Idris.Elab.Class , Idris.Elab.Instance , Idris.Elab.Provider+ , Idris.Elab.Transform , Idris.Elab.Value , Idris.AbsSyntax@@ -631,17 +658,12 @@ , IRTS.Bytecode , IRTS.CodegenC , IRTS.CodegenCommon- , IRTS.CodegenJava , IRTS.CodegenJavaScript , IRTS.JavaScript.AST , IRTS.Compiler , IRTS.Defunctionalise , IRTS.DumpBC , IRTS.Inliner- , IRTS.Java.ASTBuilding- , IRTS.Java.JTypes- , IRTS.Java.Mangling- , IRTS.Java.Pom , IRTS.Lang , IRTS.LangOpts , IRTS.Simplified@@ -650,10 +672,10 @@ , Pkg.Package , Util.DynamicLinker , Util.ScreenSize+ , Util.System Other-modules: Util.Pretty- , Util.System , Util.Net , Util.Zlib @@ -664,42 +686,39 @@ , Version_idris Build-depends: base >=4 && <5- , Cabal- , annotated-wl-pprint >= 0.5.3- , ansi-terminal- , ansi-wl-pprint- , base64-bytestring- , binary- , blaze-html >= 0.6.1.3+ , annotated-wl-pprint >= 0.5.3 && < 0.6+ , 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.7.0.0- , bytestring- , cheapskate- , containers >= 0.5- , directory- , directory >= 1.2- , filepath- , fingertree >= 0.1- , haskeline >= 0.7- , language-java >= 0.2.6- , lens >= 4.1.1- , mtl+ , bytestring < 0.11+ , cheapskate < 0.2+ , containers >= 0.5 && < 0.6+ , deepseq < 1.4+ , directory >= 1.2 && < 1.3+ , filepath < 1.4+ , fingertree >= 0.1 && < 0.2+ , haskeline >= 0.7 && < 0.8+ , lens >= 4.1.1 && < 4.5+ , mtl < 2.3+ , network < 2.7+ , optparse-applicative >= 0.11 && < 0.12 , parsers >= 0.9 && < 0.13- , pretty- , process- , split- , text- , time >= 1.4- , transformers- , trifecta >= 1.1- , unordered-containers- , utf8-string- , vector- , vector-binary-instances- , network- , xml- , deepseq- , zlib- , optparse-applicative >= 0.10+ , pretty < 1.2+ , process < 1.3+ , split < 0.3+ , text < 1.3+ , time >= 1.4 && < 1.6+ , transformers < 0.5+ , trifecta >= 1.1 && < 1.6+ , unordered-containers < 0.3+ , utf8-string < 0.4+ , vector < 0.11+ , vector-binary-instances < 0.3+ , xml < 1.4+ , zlib < 0.6 Extensions: MultiParamTypeClasses , DeriveFoldable , DeriveTraversable@@ -713,34 +732,27 @@ if os(linux) cpp-options: -DLINUX- build-depends: unix+ build-depends: unix < 2.8 if os(freebsd) cpp-options: -DFREEBSD- build-depends: unix+ build-depends: unix < 2.8 -- if os(dragonfly) -- cpp-options: -DDRAGONFLY--- build-depends: unix+-- build-depends: unix < 2.8 if os(darwin) cpp-options: -DMACOSX- build-depends: unix+ build-depends: unix < 2.8 if os(windows) cpp-options: -DWINDOWS- build-depends: Win32- if flag(LLVM)- other-modules: IRTS.CodegenLLVM- cpp-options: -DIDRIS_LLVM- build-depends: llvm-general == 3.3.8.*- , llvm-general-pure == 3.3.8.*- else- other-modules: Util.LLVMStubs+ build-depends: Win32 < 2.4 if flag(FFI)- build-depends: libffi+ build-depends: libffi < 0.2 cpp-options: -DIDRIS_FFI if flag(GMP)- build-depends: libffi+ build-depends: libffi < 0.2 cpp-options: -DIDRIS_GMP if flag(curses)- build-depends: hscurses+ build-depends: hscurses < 1.5 cpp-options: -DCURSES if flag(freestanding) other-modules: Target_idris@@ -759,18 +771,18 @@ ghc-prof-options: -auto-all -caf-all ghc-options: -threaded -rtsopts -funbox-strict-fields -Executable idris-c- Main-is: Main.hs- hs-source-dirs: codegen/idris-c-- Build-depends: idris- , base- , filepath- , haskeline >= 0.7- , transformers-- ghc-prof-options: -auto-all -caf-all- ghc-options: -threaded -rtsopts -funbox-strict-fields+-- Executable idris-c+-- Main-is: Main.hs+-- hs-source-dirs: codegen/idris-c+-- +-- Build-depends: idris+-- , base+-- , filepath+-- , haskeline >= 0.7+-- , transformers+-- +-- ghc-prof-options: -auto-all -caf-all+-- ghc-options: -threaded -rtsopts -funbox-strict-fields Executable idris-javascript Main-is: Main.hs
jsrts/Runtime-common.js view
@@ -16,6 +16,14 @@ var i$ret; var i$callstack; +var i$Int = {};+var i$String = {};+var i$Integer = {};+var i$Float = {};+var i$Char = {};+var i$Ptr = {};+var i$Forgot = {};+ /** @constructor */ var i$CON = function(tag,args,app,ev) { this.tag = tag;@@ -59,7 +67,7 @@ var res = fid; - for(var i = 0; i < arguments.length; ++i) {+ for(var i = 0; i < (arguments.length ? arguments.length : 1); ++i) { while (res instanceof i$CON) { i$valstack_top += 1; i$valstack[i$valstack_top] = res;
libs/base/Control/Isomorphism.idr view
@@ -14,9 +14,9 @@ -- Isomorphism properties -||| Isomorphism is reflexive+||| Isomorphism is Reflexive isoRefl : Iso a a-isoRefl = MkIso id id (\x => refl) (\x => refl)+isoRefl = MkIso id id (\x => Refl) (\x => Refl) ||| Isomorphism is transitive isoTrans : Iso a b -> Iso b c -> Iso a c@@ -43,8 +43,8 @@ swap (Left x) = Right x swap (Right x) = Left x swapSwap : (e : Either a' b') -> swap (swap e) = e- swapSwap (Left x) = refl- swapSwap (Right x) = refl+ swapSwap (Left x) = Refl+ swapSwap (Right x) = Refl ||| Disjunction is associative eitherAssoc : Iso (Either (Either a b) c) (Either a (Either b c))@@ -60,31 +60,31 @@ eitherAssoc2 (Right (Right x)) = Right x ok1 : (x : Either a (Either b c)) -> eitherAssoc1 (eitherAssoc2 x) = x- ok1 (Left x) = refl- ok1 (Right (Left x)) = refl- ok1 (Right (Right x)) = refl+ ok1 (Left x) = Refl+ ok1 (Right (Left x)) = Refl+ ok1 (Right (Right x)) = Refl ok2 : (x : Either (Either a b) c) -> eitherAssoc2 (eitherAssoc1 x) = x- ok2 (Left (Left x)) = refl- ok2 (Left (Right x)) = refl- ok2 (Right x) = refl+ ok2 (Left (Left x)) = Refl+ ok2 (Left (Right x)) = Refl+ ok2 (Right x) = Refl ||| Disjunction with false is a no-op-eitherBotLeft : Iso (Either _|_ a) a+eitherBotLeft : Iso (Either Void a) a eitherBotLeft = MkIso to from ok1 ok2- where to : Either _|_ a -> a- to (Left x) = FalseElim x+ where to : Either Void a -> a+ to (Left x) = void x to (Right x) = x- from : a -> Either _|_ a+ from : a -> Either Void a from = Right ok1 : (x : a) -> to (from x) = x- ok1 x = refl- ok2 : (x : Either _|_ a) -> from (to x) = x- ok2 (Left x) = FalseElim x- ok2 (Right x) = refl+ ok1 x = Refl+ ok2 : (x : Either Void a) -> from (to x) = x+ ok2 (Left x) = void x+ ok2 (Right x) = Refl ||| Disjunction with false is a no-op-eitherBotRight : Iso (Either a _|_) a+eitherBotRight : Iso (Either a Void) a eitherBotRight = isoTrans eitherComm eitherBotLeft ||| Isomorphism is a congruence with regards to disjunction@@ -119,7 +119,7 @@ swap (x, y) = (y, x) swapSwap : (x : (a', b')) -> swap (swap x) = x- swapSwap (x, y) = refl+ swapSwap (x, y) = Refl ||| Conjunction is associative pairAssoc : Iso (a, (b, c)) ((a, b), c)@@ -130,26 +130,26 @@ from : ((a, b), c) -> (a, (b, c)) from ((x, y), z) = (x, (y, z)) ok1 : (x : ((a, b), c)) -> to (from x) = x- ok1 ((x, y), z) = refl+ ok1 ((x, y), z) = Refl ok2 : (x : (a, (b, c))) -> from (to x) = x- ok2 (x, (y, z)) = refl+ ok2 (x, (y, z)) = Refl ||| Conjunction with truth is a no-op pairUnitRight : Iso (a, ()) a-pairUnitRight = MkIso fst (\x => (x, ())) (\x => refl) ok+pairUnitRight = MkIso fst (\x => (x, ())) (\x => Refl) ok where ok : (x : (a, ())) -> (fst x, ()) = x- ok (x, ()) = refl+ ok (x, ()) = Refl ||| Conjunction with truth is a no-op pairUnitLeft : Iso ((), a) a pairUnitLeft = isoTrans pairComm pairUnitRight ||| Conjunction preserves falsehood-pairBotLeft : Iso (_|_, a) _|_-pairBotLeft = MkIso fst FalseElim (\x => FalseElim x) (\y => FalseElim (fst y))+pairBotLeft : Iso (Void, a) Void+pairBotLeft = MkIso fst void (\x => void x) (\y => void (fst y)) ||| Conjunction preserves falsehood-pairBotRight : Iso (a, _|_) _|_+pairBotRight : Iso (a, Void) Void pairBotRight = isoTrans pairComm pairBotLeft ||| Isomorphism is a congruence with regards to conjunction@@ -165,11 +165,11 @@ iso1 : (x : (a', b')) -> to'' (from'' x) = x iso1 (x, y) = rewrite toFrom x in rewrite toFrom' y in- refl+ Refl iso2 : (x : (a, b)) -> from'' (to'' x) = x iso2 (x, y) = rewrite fromTo x in rewrite fromTo' y in- refl+ Refl ||| Isomorphism is a congruence with regards to conjunction on the left pairCongLeft : Iso a a' -> Iso (a, b) (a', b)@@ -190,11 +190,11 @@ from (Left (x, y)) = (Left x, y) from (Right (x, y)) = (Right x, y) toFrom : (x : Either (a, c) (b, c)) -> to (from x) = x- toFrom (Left (x, y)) = refl- toFrom (Right (x, y)) = refl+ toFrom (Left (x, y)) = Refl+ toFrom (Right (x, y)) = Refl fromTo : (x : (Either a b, c)) -> from (to x) = x- fromTo (Left x, y) = refl- fromTo (Right x, y) = refl+ fromTo (Left x, y) = Refl+ fromTo (Right x, y) = Refl ||| Products distribute over sums distribRight : Iso (a, Either b c) (Either (a, b) (a, c))@@ -217,10 +217,10 @@ maybeCong : Iso a b -> Iso (Maybe a) (Maybe b) maybeCong {a} {b} (MkIso to from toFrom fromTo) = MkIso (map to) (map from) ok1 ok2 where ok1 : (y : Maybe b) -> map to (map from y) = y- ok1 Nothing = refl+ ok1 Nothing = Refl ok1 (Just x) = (Just (to (from x))) ={ cong (toFrom x) }= (Just x) QED ok2 : (x : Maybe a) -> map from (map to x) = x- ok2 Nothing = refl+ ok2 Nothing = Refl ok2 (Just x) = (Just (from (to x))) ={ cong (fromTo x) }= (Just x) QED ||| `Maybe a` is the same as `Either a ()`@@ -233,16 +233,16 @@ from (Left x) = Just x from (Right ()) = Nothing iso1 : (x : Either a ()) -> to (from x) = x- iso1 (Left x) = refl- iso1 (Right ()) = refl+ iso1 (Left x) = Refl+ iso1 (Right ()) = Refl iso2 : (y : Maybe a) -> from (to y) = y- iso2 Nothing = refl- iso2 (Just x) = refl+ iso2 Nothing = Refl+ iso2 (Just x) = Refl ||| Maybe of void is just unit-maybeVoidUnit : Iso (Maybe _|_) ()-maybeVoidUnit = (Maybe _|_) ={ maybeEither }=- (Either _|_ ()) ={ eitherBotLeft }=+maybeVoidUnit : Iso (Maybe Void) ()+maybeVoidUnit = (Maybe Void) ={ maybeEither }=+ (Either Void ()) ={ eitherBotLeft }= () QED eitherMaybeLeftMaybe : Iso (Either (Maybe a) b) (Maybe (Either a b))@@ -268,28 +268,28 @@ maybeIsoS : Iso (Maybe (Fin n)) (Fin (S n)) maybeIsoS = MkIso forth back fb bf where forth : Maybe (Fin n) -> Fin (S n)- forth Nothing = fZ- forth (Just x) = fS x+ forth Nothing = FZ+ forth (Just x) = FS x back : Fin (S n) -> Maybe (Fin n)- back fZ = Nothing- back (fS x) = Just x+ back FZ = Nothing+ back (FS x) = Just x bf : (x : Maybe (Fin n)) -> back (forth x) = x- bf Nothing = refl- bf (Just x) = refl+ bf Nothing = Refl+ bf (Just x) = Refl fb : (y : Fin (S n)) -> forth (back y) = y- fb fZ = refl- fb (fS x) = refl+ fb FZ = Refl+ fb (FS x) = Refl -finZeroBot : Iso (Fin 0) _|_-finZeroBot = MkIso (\x => FalseElim (uninhabited x))- (\x => FalseElim x)- (\x => FalseElim x)- (\x => FalseElim (uninhabited x))+finZeroBot : Iso (Fin 0) Void+finZeroBot = MkIso (\x => void (uninhabited x))+ (\x => void x)+ (\x => void x)+ (\x => void (uninhabited x)) eitherFinPlus : Iso (Either (Fin m) (Fin n)) (Fin (m + n)) eitherFinPlus {m = Z} {n=n} = (Either (Fin 0) (Fin n)) ={ eitherCongLeft finZeroBot }=- (Either _|_ (Fin n)) ={ eitherBotLeft }=+ (Either Void (Fin n)) ={ eitherBotLeft }= (Fin n) QED eitherFinPlus {m = S k} {n=n} = (Either (Fin (S k)) (Fin n)) ={ eitherCongLeft (isoSym maybeIsoS) }=@@ -302,8 +302,8 @@ finPairTimes : Iso (Fin m, Fin n) (Fin (m * n)) finPairTimes {m = Z} {n=n} = (Fin Z, Fin n) ={ pairCongLeft finZeroBot }=- (_|_, Fin n) ={ pairBotLeft }=- _|_ ={ isoSym finZeroBot }=+ (Void, Fin n) ={ pairBotLeft }=+ Void ={ isoSym finZeroBot }= (Fin Z) QED finPairTimes {m = S k} {n=n} = (Fin (S k), Fin n) ={ pairCongLeft (isoSym maybeIsoS) }=
libs/base/Control/Isomorphism/Primitives.idr view
@@ -20,16 +20,16 @@ fromZZ n = cast n toFromZZ : (n : Integer) -> fromZZ (toZZ n) = n- toFromZZ n = really_believe_me {a = n=n} {b = fromZZ (toZZ n) = n} refl+ toFromZZ n = really_believe_me {a = n=n} {b = fromZZ (toZZ n) = n} Refl fromToZZ : (n : ZZ) -> toZZ (fromZZ n) = n- fromToZZ n = really_believe_me {a = n=n} {b = toZZ (fromZZ n) = n} refl+ fromToZZ n = really_believe_me {a = n=n} {b = toZZ (fromZZ n) = n} Refl packUnpackIso : Iso (List Char) String packUnpackIso = MkIso pack unpack- (\str => really_believe_me {a = str=str} {b = pack (unpack str) = str} refl)- (\cs => really_believe_me {a = cs=cs} {b = unpack (pack cs) = cs} refl)+ (\str => really_believe_me {a = str=str} {b = pack (unpack str) = str} Refl)+ (\cs => really_believe_me {a = cs=cs} {b = unpack (pack cs) = cs} Refl)
libs/base/Control/Monad/RWS.idr view
@@ -16,35 +16,35 @@ (runRWST : r -> s -> m (a, s, w)) -> RWST r w s m a instance Monad m => Functor (RWST r w s m) where- map f (MkRWST m) = MkRWST $ \r => \s => do (a, s', w) <- m r s- return (f a, s', w)+ map f (MkRWST m) = MkRWST $ \r,s => do (a, s', w) <- m r s+ return (f a, s', w) instance (Monoid w, Monad m) => Applicative (RWST r w s m) where- pure a = MkRWST $ \_ => \s => return (a, s, neutral)- (MkRWST f) <$> (MkRWST v) = MkRWST $ \r => \s => do (a, s', w) <- v r s- (fn, ss, w') <- f r s- return (fn a, ss, w <+> w)+ pure a = MkRWST $ \_,s => return (a, s, neutral)+ (MkRWST f) <$> (MkRWST v) = MkRWST $ \r,s => do (a, s', w) <- v r s+ (fn, ss, w') <- f r s+ return (fn a, ss, w <+> w) instance (Monoid w, Monad m) => Monad (RWST r w s m) where- (MkRWST m) >>= k = MkRWST $ \r => \s => do (a, s', w) <- m r s- let MkRWST ka = k a- (b, ss, w') <- ka r s'- return (b, ss, w <+> w')+ (MkRWST m) >>= k = MkRWST $ \r,s => do (a, s', w) <- m r s+ let MkRWST ka = k a+ (b, ss, w') <- ka r s'+ return (b, ss, w <+> w') instance (Monoid w, Monad m) => MonadReader r (RWST r w s m) where- ask = MkRWST $ \r => \s => return (r, s, neutral)- local f (MkRWST m) = MkRWST $ \r => \s => m (f r) s+ ask = MkRWST $ \r,s => return (r, s, neutral)+ local f (MkRWST m) = MkRWST $ \r,s => m (f r) s instance (Monoid w, Monad m) => MonadWriter w (RWST r w s m) where- tell w = MkRWST $ \_ => \s => return ((), s, w)- listen (MkRWST m) = MkRWST $ \r => \s => do (a, s', w) <- m r s- return ((a, w), s', w)- pass (MkRWST m) = MkRWST $ \r => \s => do ((a, f), s', w) <- m r s- return (a, s', f w)+ tell w = MkRWST $ \_,s => return ((), s, w)+ listen (MkRWST m) = MkRWST $ \r,s => do (a, s', w) <- m r s+ return ((a, w), s', w)+ pass (MkRWST m) = MkRWST $ \r,s => do ((a, f), s', w) <- m r s+ return (a, s', f w) instance (Monoid w, Monad m) => MonadState s (RWST r w s m) where- get = MkRWST $ \_ => \s => return (s, s, neutral)- put s = MkRWST $ \_ => \_ => return ((), s, neutral)+ get = MkRWST $ \_,s => return (s, s, neutral)+ put s = MkRWST $ \_,_ => return ((), s, neutral) instance (Monoid w, Monad m) => MonadRWS r w s (RWST r w s m) where {}
libs/base/Data/Bits.idr view
@@ -437,8 +437,8 @@ where %assert_total helper : Fin (S n) -> Bits n -> List Char- helper fZ _ = []- helper (fS x) b = (if getBit x b then '1' else '0') :: helper (weaken x) b+ helper FZ _ = []+ helper (FS x) b = (if getBit x b then '1' else '0') :: helper (weaken x) b instance Show (Bits n) where show = bitsToStr
libs/base/Data/BoundedList.idr view
@@ -10,8 +10,8 @@ ||| Compute the length of a list. length : BoundedList n a -> Fin (S n)-length [] = fZ-length (x :: xs) = fS (length xs)+length [] = FZ+length (x :: xs) = FS (length xs) -------------------------------------------------------------------------------- -- Indexing into bounded lists@@ -19,8 +19,8 @@ index : Fin (S n) -> BoundedList n a -> Maybe a index _ [] = Nothing-index fZ (x :: _) = Just x-index (fS f) (_ :: xs) = index f xs+index FZ (x :: _) = Just x+index (FS f) (_ :: xs) = index f xs -------------------------------------------------------------------------------- -- Adjusting bounds@@ -90,5 +90,5 @@ -------------------------------------------------------------------------------- zeroBoundIsEmpty : (xs : BoundedList 0 a) -> xs = the (BoundedList 0 a) []-zeroBoundIsEmpty [] = refl+zeroBoundIsEmpty [] = Refl zeroBoundIsEmpty (_ :: _) impossible
libs/base/Data/Buffer.idr view
@@ -33,8 +33,8 @@ bitsFromNat (S k) = 1 + bitsFromNat k bitsFromFin : Fin n -> Bits64-bitsFromFin fZ = 0-bitsFromFin (fS k) = 1 + bitsFromFin k+bitsFromFin FZ = 0+bitsFromFin (FS k) = 1 + bitsFromFin k ||| Allocate an empty Buffer. The size hint can be used to avoid ||| unnecessary reallocations and copies under the hood if the
libs/base/Data/HVect.idr view
@@ -13,22 +13,22 @@ ||| Extract an element from an HVect index : (i : Fin k) -> HVect ts -> index i ts-index fZ (x::xs) = x-index (fS j) (x::xs) = index j xs+index FZ (x::xs) = x+index (FS j) (x::xs) = index j xs deleteAt : (i : Fin (S l)) -> HVect us -> HVect (deleteAt i us)-deleteAt fZ (x::xs) = xs-deleteAt {l = S m} (fS j) (x::xs) = x :: deleteAt j xs-deleteAt {l = Z} (fS j) (x::xs) = absurd j+deleteAt FZ (x::xs) = xs+deleteAt {l = S m} (FS j) (x::xs) = x :: deleteAt j xs+deleteAt {l = Z} (FS j) (x::xs) = absurd j deleteAt _ [] impossible replaceAt : (i : Fin k) -> t -> HVect ts -> HVect (replaceAt i t ts)-replaceAt fZ y (x::xs) = y::xs-replaceAt (fS j) y (x::xs) = x :: replaceAt j y xs+replaceAt FZ y (x::xs) = y::xs+replaceAt (FS j) y (x::xs) = x :: replaceAt j y xs updateAt : (i : Fin k) -> (index i ts -> t) -> HVect ts -> HVect (replaceAt i t ts)-updateAt fZ f (x::xs) = f x :: xs-updateAt (fS j) f (x::xs) = x :: updateAt j f xs+updateAt FZ f (x::xs) = f x :: xs+updateAt (FS j) f (x::xs) = x :: updateAt j f xs ||| Append two `HVect`s. (++) : HVect ts -> HVect us -> HVect (ts ++ us)
+ libs/base/Data/Hash.idr view
@@ -0,0 +1,85 @@+module Data.Hash++%access public+%default total++{- A general purpose Hashing library (not cryptographic)++ The core hash is djb2, which is very fast but does not have the best distribution+ Source: http://www.cse.yorku.ca/~oz/hash.html++ The salted version and the magic salt are copied from Haskell's bloomfilter library+ Source: https://hackage.haskell.org/package/bloomfilter-2.0.0.0/docs/src/Data-BloomFilter-Hash.html#Hashable+-}++||| A type that can be hashed+class Hashable a where+ saltedHash64 : a -> Bits64 -> Bits64 -- value to hash, salt, hash++||| Computes a non cryptographic hash+hash : Hashable a => a -> Bits64+hash x = saltedHash64 x 0x16fc397cf62f64d3++||| Given a user provided salt, computes a non cryptographic hash.+||| This version is meant to mitigate hash-flooding DoS attacks.+saltedHash : Hashable a => Bits64 -> a -> Bits64+saltedHash salt x = saltedHash64 x salt+++||| Nth byte of a Bits64+private+byte : Bits64 -> Bits64 -> Bits64+byte n w = prim__lshrB64 (prim__andB64 mask w) offset+ where offset = 8*n+ mask = prim__shlB64 0xff (the Bits64 offset)++||| Modulo of an integer, downsized to a Bits64+private+mod64 : Integer -> Bits64+mod64 i = assert_total $ prim__truncBigInt_B64 (abs i `mod` 0xffffffffffffffff)++instance Hashable Bits64 where+ saltedHash64 w salt = foldr (\b,acc => (acc `prim__shlB64` 10) + acc + b)+ salt+ [byte (fromInteger n) w | n <- [7,6..0]] -- djb2 hash function. Not meant for crypto++instance Hashable Integer where+ saltedHash64 i = saltedHash64 (mod64 i)++instance Hashable () where+ saltedHash64 _ salt = salt++instance Hashable Bool where+ saltedHash64 True = saltedHash64 (the Bits64 1)+ saltedHash64 False = saltedHash64 (the Bits64 0)++instance Hashable Int where+ saltedHash64 w = saltedHash64 (prim__zextInt_B64 w)++instance Hashable Char where+ saltedHash64 w = saltedHash64 (the Int (cast w))++instance Hashable Bits8 where+ saltedHash64 w = saltedHash64 (prim__zextB8_B64 w)++instance Hashable Bits16 where+ saltedHash64 w = saltedHash64 (prim__zextB16_B64 w)++instance Hashable Bits32 where+ saltedHash64 w = saltedHash64 (prim__zextB32_B64 w)++instance Hashable a => Hashable (Maybe a) where+ saltedHash64 Nothing salt = salt+ saltedHash64 (Just k) salt = saltedHash64 k salt++instance (Hashable a, Hashable b) => Hashable (a, b) where+ saltedHash64 (a,b) salt = saltedHash64 b (saltedHash64 a salt)++instance Hashable a => Hashable (List a) where+ saltedHash64 l salt = foldr (\c,acc => saltedHash64 c acc) salt l++instance Hashable a => Hashable (Vect n a) where+ saltedHash64 l salt = foldr (\c,acc => saltedHash64 c acc) salt l++instance Hashable String where+ saltedHash64 s = saltedHash64 (unpack s)
libs/base/Data/Heap.idr view
@@ -83,11 +83,11 @@ -------------------------------------------------------------------------------- findMinimum : (h : MaxiphobicHeap a) -> (isEmpty h = False) -> a-findMinimum Empty refl impossible+findMinimum Empty Refl impossible findMinimum (Node s l e r) p = e deleteMinimum : Ord a => (h : MaxiphobicHeap a) -> (isEmpty h = False) -> MaxiphobicHeap a-deleteMinimum Empty refl impossible+deleteMinimum Empty Refl impossible deleteMinimum (Node s l e r) p = merge l r --------------------------------------------------------------------------------@@ -96,7 +96,7 @@ toList : Ord a => MaxiphobicHeap a -> List a toList Empty = []-toList (Node s l e r) = toList' (Node s l e r) refl+toList (Node s l e r) = toList' (Node s l e r) Refl where %assert_total -- relies on deleteMinimum making heap smaller toList' : Ord a => (h : MaxiphobicHeap a) -> (isEmpty h = False) -> List a@@ -135,28 +135,28 @@ -- Properties -------------------------------------------------------------------------------- -total absurdBoolDischarge : False = True -> _|_+total absurdBoolDischarge : False = True -> Void absurdBoolDischarge p = replace {P = disjointTy} p () where total disjointTy : Bool -> Type disjointTy False = ()- disjointTy True = _|_+ disjointTy True = Void total isEmptySizeZero : (h : MaxiphobicHeap a) -> (isEmpty h = True) -> size h = Z-isEmptySizeZero Empty p = refl+isEmptySizeZero Empty p = Refl isEmptySizeZero (Node s l e r) p = ?isEmptySizeZeroNodeAbsurd total emptyHeapValid : Ord a => isValidHeap empty = True-emptyHeapValid = refl+emptyHeapValid = Refl total singletonHeapValid : Ord a => (e : a) -> isValidHeap $ singleton e = True-singletonHeapValid e = refl+singletonHeapValid e = Refl {- total mergePreservesValidHeaps : Ord a => (left : MaxiphobicHeap a) -> (right : MaxiphobicHeap a) -> (leftValid : isValidHeap left = True) -> (rightValid : isValidHeap right = True) -> isValidHeap $ merge left right = True-mergePreservesValidHeaps Empty Empty lp rp = refl+mergePreservesValidHeaps Empty Empty lp rp = Refl mergePreservesValidHeaps Empty (Node rs rl re rr) lp rp = rp mergePreservesValidHeaps (Node ls ll le lr) Empty lp rp = lp mergePreservesValidHeaps (Node ls ll le lr) (Node rs rl re rr) lp rp =@@ -169,7 +169,7 @@ isEmptySizeZeroNodeAbsurd = proof { intros;- refine FalseElim;+ refine void; refine absurdBoolDischarge; exact p; }
libs/base/Data/List.idr view
@@ -2,9 +2,17 @@ %access public -||| A proof that some element is found in a list+||| A proof that some element is found in a list.+|||+||| Example: `the (Elem "bar" ["foo", "bar", "baz"]) (tactics { search })` data Elem : a -> List a -> Type where+ ||| A proof that the element is at the front of the list.+ |||+ ||| Example: `the (Elem "a" ["a", "b"]) Here` Here : Elem x (x :: xs)+ ||| A proof that the element is after the front of the list+ |||+ ||| Example: `the (Elem "b" ["a", "b"]) (There Here)` There : Elem x xs -> Elem x (y :: xs) instance Uninhabited (Elem {a} x []) where@@ -18,13 +26,13 @@ isElem : DecEq a => (x : a) -> (xs : List a) -> Dec (Elem x xs) isElem x [] = No absurd isElem x (y :: xs) with (decEq x y)- isElem x (x :: xs) | (Yes refl) = Yes Here+ isElem x (x :: xs) | (Yes Refl) = Yes Here isElem x (y :: xs) | (No contra) with (isElem x xs) isElem x (y :: xs) | (No contra) | (Yes prf) = Yes (There prf) isElem x (y :: xs) | (No contra) | (No f) = No (mkNo contra f) where mkNo : {xs' : List a} ->- ((x' = y') -> _|_) -> (Elem x' xs' -> _|_) ->- Elem x' (y' :: xs') -> _|_- mkNo f g Here = f refl+ ((x' = y') -> Void) -> (Elem x' xs' -> Void) ->+ Elem x' (y' :: xs') -> Void+ mkNo f g Here = f Refl mkNo f g (There x) = g x
libs/base/Data/Vect.idr view
@@ -15,19 +15,19 @@ There : Elem x xs -> Elem x (y::xs) ||| Nothing can be in an empty Vect-noEmptyElem : {x : a} -> Elem x [] -> _|_+noEmptyElem : {x : a} -> Elem x [] -> Void noEmptyElem Here impossible ||| An item not in the head and not in the tail is not in the Vect at all neitherHereNorThere : {x, y : a} -> {xs : Vect n a} -> Not (x = y) -> Not (Elem x xs) -> Not (Elem x (y :: xs))-neitherHereNorThere xneqy xninxs Here = xneqy refl+neitherHereNorThere xneqy xninxs Here = xneqy Refl neitherHereNorThere xneqy xninxs (There xinxs) = xninxs xinxs ||| A decision procedure for Elem isElem : DecEq a => (x : a) -> (xs : Vect n a) -> Dec (Elem x xs) isElem x [] = No noEmptyElem isElem x (y :: xs) with (decEq x y)- isElem x (x :: xs) | (Yes refl) = Yes Here+ isElem x (x :: xs) | (Yes Refl) = Yes Here isElem x (y :: xs) | (No xneqy) with (isElem x xs) isElem x (y :: xs) | (No xneqy) | (Yes xinxs) = Yes (There xinxs) isElem x (y :: xs) | (No xneqy) | (No xninxs) = No (neitherHereNorThere xneqy xninxs)
libs/base/Data/Vect/Quantifiers.idr view
@@ -1,10 +1,16 @@ module Data.Vect.Quantifiers +||| A proof that some element of a vector satisfies some property+|||+||| @ P the property to be satsified data Any : (P : a -> Type) -> Vect n a -> Type where+ ||| A proof that the satisfying element is the first one in the `Vect` Here : {P : a -> Type} -> {xs : Vect n a} -> P x -> Any P (x :: xs)+ ||| A proof that the satsifying element is in the tail of the `Vect` There : {P : a -> Type} -> {xs : Vect n a} -> Any P xs -> Any P (x :: xs) -anyNilAbsurd : {P : a -> Type} -> Any P Nil -> _|_+||| No element of an empty vector satisfies any property+anyNilAbsurd : {P : a -> Type} -> Any P Nil -> Void anyNilAbsurd (Here _) impossible anyNilAbsurd (There _) impossible @@ -15,7 +21,13 @@ anyElim _ f (Here p) = f p anyElim f _ (There p) = f p -any : {P : a -> Type} -> ((x : a) -> Dec (P x)) -> (xs : Vect n a) -> Dec (Any P xs)+||| Given a decision procedure for a property, determine if an element of a+||| vector satisfies it.+|||+||| @ P the property to be satisfied+||| @ dec the decision procedure+||| @ xs the vector to examine+any : {P : a -> Type} -> (dec : (x : a) -> Dec (P x)) -> (xs : Vect n a) -> Dec (Any P xs) any _ Nil = No anyNilAbsurd any p (x::xs) with (p x) | Yes prf = Yes (Here prf)@@ -24,23 +36,33 @@ Yes prf' => Yes (There prf') No prf' => No (anyElim prf' prf) +||| A proof that all elements of a vector satisfy a property. It is a list of+||| proofs, corresponding element-wise to the `Vect`. data All : (P : a -> Type) -> Vect n a -> Type where Nil : {P : a -> Type} -> All P Nil (::) : {P : a -> Type} -> {xs : Vect n a} -> P x -> All P xs -> All P (x :: xs) +||| If there does not exist an element that satifies the property, then it is+||| the case that all elements do not satisfy. negAnyAll : {P : a -> Type} -> {xs : Vect n a} -> Not (Any P xs) -> All (\x => Not (P x)) xs negAnyAll {xs=Nil} _ = Nil negAnyAll {xs=(x::xs)} f = (\x => f (Here x)) :: negAnyAll (\x => f (There x)) -notAllHere : {P : a -> Type} -> {xs : Vect n a} -> Not (P x) -> All P (x :: xs) -> _|_+notAllHere : {P : a -> Type} -> {xs : Vect n a} -> Not (P x) -> All P (x :: xs) -> Void notAllHere _ Nil impossible notAllHere np (p :: _) = np p -notAllThere : {P : a -> Type} -> {xs : Vect n a} -> Not (All P xs) -> All P (x :: xs) -> _|_+notAllThere : {P : a -> Type} -> {xs : Vect n a} -> Not (All P xs) -> All P (x :: xs) -> Void notAllThere _ Nil impossible notAllThere np (_ :: ps) = np ps -all : {P : a -> Type} -> ((x : a) -> Dec (P x)) -> (xs : Vect n a) -> Dec (All P xs)+||| Given a decision procedure for a property, decide whether all elements of+||| a vector satisfy it.+|||+||| @ P the property+||| @ dec the decision procedure+||| @ xs the vector to examine+all : {P : a -> Type} -> (dec : (x : a) -> Dec (P x)) -> (xs : Vect n a) -> Dec (All P xs) all _ Nil = Yes Nil all d (x::xs) with (d x) | No prf = No (notAllHere prf)
libs/base/Data/ZZ.idr view
@@ -7,14 +7,18 @@ %access public -||| An integer is either a positive nat or the negated successor of a nat.-||| Zero is arbitrarily chosen to be positive.+||| An integer is either a positive `Nat` or the negated successor of a `Nat`.+|||+||| For example, 3 is `Pos 3` and -2 is `NegS 1`. Zero is arbitrarily chosen+||| to be positive.+||| data ZZ = Pos Nat | NegS Nat instance Signed ZZ where sign (Pos _) = Plus sign (NegS _) = Minus +||| Take the absolute value of a `ZZ` absZ : ZZ -> Nat absZ (Pos n) = n absZ (NegS n) = S n@@ -23,28 +27,32 @@ show (Pos n) = show n show (NegS n) = "-" ++ show (S n) -negZ : ZZ -> ZZ-negZ (Pos Z) = Pos Z-negZ (Pos (S n)) = NegS n-negZ (NegS n) = Pos (S n)+instance Neg ZZ where+ negate (Pos Z) = Pos Z+ negate (Pos (S n)) = NegS n+ negate (NegS n) = Pos (S n) negNat : Nat -> ZZ negNat Z = Pos Z negNat (S n) = NegS n ++||| Construct a `ZZ` as the difference of two `Nat`s minusNatZ : Nat -> Nat -> ZZ minusNatZ n Z = Pos n minusNatZ Z (S m) = NegS m minusNatZ (S n) (S m) = minusNatZ n m +||| Add two `ZZ`s. Consider using `(+) {a=ZZ}`. plusZ : ZZ -> ZZ -> ZZ plusZ (Pos n) (Pos m) = Pos (n + m) plusZ (NegS n) (NegS m) = NegS (S (n + m)) plusZ (Pos n) (NegS m) = minusNatZ n (S m) plusZ (NegS n) (Pos m) = minusNatZ m (S n) +||| Subtract two `ZZ`s. Consider using `(-) {a=ZZ}`. subZ : ZZ -> ZZ -> ZZ-subZ n m = plusZ n (negZ m)+subZ n m = plusZ n (negate m) instance Eq ZZ where (Pos n) == (Pos m) = n == m@@ -58,13 +66,14 @@ compare (Pos _) (NegS _) = GT compare (NegS _) (Pos _) = LT -+||| Multiply two `ZZ`s. Consider using `(*) {a=ZZ}`. multZ : ZZ -> ZZ -> ZZ multZ (Pos n) (Pos m) = Pos $ n * m multZ (NegS n) (NegS m) = Pos $ (S n) * (S m) multZ (NegS n) (Pos m) = negNat $ (S n) * m multZ (Pos n) (NegS m) = negNat $ n * (S m) +||| Convert an `Integer` to an inductive representation. fromInt : Integer -> ZZ fromInt n = if n < 0 then NegS $ fromInteger {a=Nat} ((-n) - 1)@@ -100,21 +109,21 @@ -> n * m = x -> (Pos n) * (Pos m) = Pos x natMultZMult n m x h = cong h -doubleNegElim : (z : ZZ) -> negZ (negZ z) = z-doubleNegElim (Pos Z) = refl-doubleNegElim (Pos (S n)) = refl-doubleNegElim (NegS Z) = refl-doubleNegElim (NegS (S n)) = refl+doubleNegElim : (z : ZZ) -> negate (negate z) = z+doubleNegElim (Pos Z) = Refl+doubleNegElim (Pos (S n)) = Refl+doubleNegElim (NegS Z) = Refl+doubleNegElim (NegS (S n)) = Refl -- Injectivity posInjective : Pos n = Pos m -> n = m-posInjective refl = refl+posInjective Refl = Refl negSInjective : NegS n = NegS m -> n = m-negSInjective refl = refl+negSInjective Refl = Refl -posNotNeg : Pos n = NegS m -> _|_-posNotNeg refl impossible+posNotNeg : Pos n = NegS m -> Void+posNotNeg Refl impossible -- Decidable equality instance DecEq ZZ where@@ -129,16 +138,16 @@ -- Plus plusZeroLeftNeutralZ : (right : ZZ) -> 0 + right = right-plusZeroLeftNeutralZ (Pos n) = refl-plusZeroLeftNeutralZ (NegS n) = refl+plusZeroLeftNeutralZ (Pos n) = Refl+plusZeroLeftNeutralZ (NegS n) = Refl plusZeroRightNeutralZ : (left : ZZ) -> left + 0 = left plusZeroRightNeutralZ (Pos n) = cong $ plusZeroRightNeutral n-plusZeroRightNeutralZ (NegS n) = refl+plusZeroRightNeutralZ (NegS n) = Refl plusCommutativeZ : (left : ZZ) -> (right : ZZ) -> (left + right = right + left) plusCommutativeZ (Pos n) (Pos m) = cong $ plusCommutative n m-plusCommutativeZ (Pos n) (NegS m) = refl-plusCommutativeZ (NegS n) (Pos m) = refl+plusCommutativeZ (Pos n) (NegS m) = Refl+plusCommutativeZ (NegS n) (Pos m) = Refl plusCommutativeZ (NegS n) (NegS m) = cong {f=NegS} $ cong {f=S} $ plusCommutative n m
libs/base/Decidable/Order.idr view
@@ -48,7 +48,7 @@ instance Preorder t ((=) {A = t} {B = t}) where transitive a b c = trans {a = a} {b = b} {c = c}- reflexive a = refl+ reflexive a = Refl instance Equivalence t ((=) {A = t} {B = t}) where symmetric a b prf = sym prf@@ -60,99 +60,88 @@ -- Natural numbers -------------------------------------------------------------------------------- -data NatLTE : Nat -> Nat -> Type where- nEqn : NatLTE n n- nLTESm : NatLTE n m -> NatLTE n (S m)+total LTEIsTransitive : (m : Nat) -> (n : Nat) -> (o : Nat) ->+ LTE m n -> LTE n o ->+ LTE m o+LTEIsTransitive Z n o LTEZero nlteo = LTEZero+LTEIsTransitive (S m) (S n) (S o) (LTESucc mlten) (LTESucc nlteo) = LTESucc (LTEIsTransitive m n o mlten nlteo) -total NatLTEIsTransitive : (m : Nat) -> (n : Nat) -> (o : Nat) ->- NatLTE m n -> NatLTE n o ->- NatLTE m o-NatLTEIsTransitive m n n mLTEn (nEqn) = mLTEn-NatLTEIsTransitive m n (S o) mLTEn (nLTESm nLTEo)- = nLTESm (NatLTEIsTransitive m n o mLTEn nLTEo)+total LTEIsReflexive : (n : Nat) -> LTE n n+LTEIsReflexive Z = LTEZero+LTEIsReflexive (S n) = LTESucc (LTEIsReflexive n) -total NatLTEIsReflexive : (n : Nat) -> NatLTE n n-NatLTEIsReflexive _ = nEqn+instance Preorder Nat LTE where+ transitive = LTEIsTransitive+ reflexive = LTEIsReflexive -instance Preorder Nat NatLTE where- transitive = NatLTEIsTransitive- reflexive = NatLTEIsReflexive+total LTEIsAntisymmetric : (m : Nat) -> (n : Nat) ->+ LTE m n -> LTE n m -> m = n+LTEIsAntisymmetric Z Z LTEZero LTEZero = Refl+LTEIsAntisymmetric (S n) (S m) (LTESucc mLTEn) (LTESucc nLTEm) with (LTEIsAntisymmetric n m mLTEn nLTEm)+ LTEIsAntisymmetric (S n) (S n) (LTESucc mLTEn) (LTESucc nLTEm) | Refl = Refl -total NatLTEIsAntisymmetric : (m : Nat) -> (n : Nat) ->- NatLTE m n -> NatLTE n m -> m = n-NatLTEIsAntisymmetric n n nEqn nEqn = refl-NatLTEIsAntisymmetric n m nEqn (nLTESm _) impossible-NatLTEIsAntisymmetric n m (nLTESm _) nEqn impossible-NatLTEIsAntisymmetric n m (nLTESm _) (nLTESm _) impossible -instance Poset Nat NatLTE where- antisymmetric = NatLTEIsAntisymmetric+instance Poset Nat LTE where+ antisymmetric = LTEIsAntisymmetric -total zeroNeverGreater : {n : Nat} -> NatLTE (S n) Z -> _|_-zeroNeverGreater {n} (nLTESm _) impossible-zeroNeverGreater {n} nEqn impossible+total zeroNeverGreater : {n : Nat} -> LTE (S n) Z -> Void+zeroNeverGreater {n} LTEZero impossible+zeroNeverGreater {n} (LTESucc _) impossible -total zeroAlwaysSmaller : {n : Nat} -> NatLTE Z n-zeroAlwaysSmaller {n = Z } = nEqn-zeroAlwaysSmaller {n = S k} = nLTESm (zeroAlwaysSmaller {n = k}) +total zeroAlwaysSmaller : {n : Nat} -> LTE Z n+zeroAlwaysSmaller = LTEZero -total-nGTSm : {n : Nat} -> {m : Nat} -> (NatLTE n m -> _|_) -> NatLTE n (S m) -> _|_-nGTSm disprf (nLTESm nLTEm) = FalseElim (disprf nLTEm)-nGTSm {n} {m} disprf (nEqn) impossible+total ltesuccinjective : {n : Nat} -> {m : Nat} -> (LTE n m -> Void) -> LTE (S n) (S m) -> Void+ltesuccinjective {n} {m} disprf (LTESucc nLTEm) = void (disprf nLTEm)+ltesuccinjective {n} {m} disprf LTEZero impossible -total-decideNatLTE : (n : Nat) -> (m : Nat) -> Dec (NatLTE n m)-decideNatLTE Z Z = Yes nEqn-decideNatLTE (S x) Z = No zeroNeverGreater-decideNatLTE x (S y) with (decEq x (S y))- | Yes eq = rewrite eq in Yes nEqn- | No _ with (decideNatLTE x y)- | Yes nLTEm = Yes (nLTESm nLTEm)- | No nGTm = No (nGTSm nGTm) -instance Decidable [Nat,Nat] NatLTE where- decide = decideNatLTE+total decideLTE : (n : Nat) -> (m : Nat) -> Dec (LTE n m)+decideLTE Z y = Yes LTEZero+decideLTE (S x) Z = No zeroNeverGreater+decideLTE (S x) (S y) with (decEq (S x) (S y))+ | Yes eq = rewrite eq in Yes (reflexive x)+ | No _ with (decideLTE x y)+ | Yes nLTEm = Yes (LTESucc nLTEm)+ | No nGTm = No (ltesuccinjective nGTm) -total-lte : (m : Nat) -> (n : Nat) -> Dec (NatLTE m n)-lte m n = decide {ts = [Nat,Nat]} {p = NatLTE} m n+instance Decidable [Nat,Nat] LTE where+ decide = decideLTE total-shift : (m : Nat) -> (n : Nat) -> NatLTE m n -> NatLTE (S m) (S n)-shift Z Z _ = nEqn-shift Z (S Z) _ = nLTESm nEqn-shift Z (S (S j)) _ = nLTESm (shift Z (S j) zeroAlwaysSmaller)-shift (S k) Z prf = FalseElim (zeroNeverGreater prf)-shift (S k) (S k) nEqn = nEqn-shift (S k) (S j) (nLTESm prf) = nLTESm (shift (S k) j prf)+lte : (m : Nat) -> (n : Nat) -> Dec (LTE m n)+lte m n = decide {ts = [Nat,Nat]} {p = LTE} m n -instance Ordered Nat NatLTE where- order Z n = Left zeroAlwaysSmaller- order m Z = Right zeroAlwaysSmaller+total+shift : (m : Nat) -> (n : Nat) -> LTE m n -> LTE (S m) (S n)+shift m n mLTEn = LTESucc mLTEn+ +instance Ordered Nat LTE where+ order Z n = Left LTEZero+ order m Z = Right LTEZero order (S k) (S j) with (order k j) order (S k) (S j) | Left prf = Left (shift k j prf) order (S k) (S j) | Right prf = Right (shift j k prf) ------------------------------------------------------------------------------------ Finite numbers---------------------------------------------------------------------------------+----------------------------------------------------------------------------------+---- Finite numbers+---------------------------------------------------------------------------------- using (k : Nat) data FinLTE : Fin k -> Fin k -> Type where- FromNatPrf : {m : Fin k} -> {n : Fin k} -> NatLTE (finToNat m) (finToNat n) -> FinLTE m n+ FromNatPrf : {m : Fin k} -> {n : Fin k} -> LTE (finToNat m) (finToNat n) -> FinLTE m n instance Preorder (Fin k) FinLTE where transitive m n o (FromNatPrf p1) (FromNatPrf p2) = - FromNatPrf (NatLTEIsTransitive (finToNat m) (finToNat n) (finToNat o) p1 p2)- reflexive n = FromNatPrf (NatLTEIsReflexive (finToNat n))+ FromNatPrf (LTEIsTransitive (finToNat m) (finToNat n) (finToNat o) p1 p2)+ reflexive n = FromNatPrf (LTEIsReflexive (finToNat n)) instance Poset (Fin k) FinLTE where antisymmetric m n (FromNatPrf p1) (FromNatPrf p2) =- finToNatInjective m n (NatLTEIsAntisymmetric (finToNat m) (finToNat n) p1 p2)+ finToNatInjective m n (LTEIsAntisymmetric (finToNat m) (finToNat n) p1 p2) instance Decidable [Fin k, Fin k] FinLTE where- decide m n with (decideNatLTE (finToNat m) (finToNat n))+ decide m n with (decideLTE (finToNat m) (finToNat n)) | Yes prf = Yes (FromNatPrf prf) | No disprf = No (\ (FromNatPrf prf) => disprf prf)
libs/base/Language/Reflection.idr view
@@ -79,20 +79,22 @@ ||| Types of named references-data NameType = Bound- -- ^ reference which is just bound, e.g. by intro- | Ref- -- ^ reference to a variable- | DCon Int Int- -- ^ constructor with tag and number- | TCon Int Int- -- ^ type constructor with tag and number+data NameType =+ ||| A reference which is just bound, e.g. by intro+ Bound |+ ||| A reference to a de Bruijn-indexed variable+ Ref |+ ||| Data constructor with tag and number+ DCon Int Int |+ ||| Type constructor with tag and number+ TCon Int Int+ %name NameType nt, nt' ||| Types annotations for bound variables in different ||| binding contexts data Binder a = Lam a- | Pi a a + | Pi a a | Let a a | NLet a a | Hole a
libs/base/Network/Socket.idr view
@@ -4,8 +4,8 @@ module IdrisNet.Socket %include C "idris_net.h"-%include C "sys/types.h" -%include C "sys/socket.h" +%include C "sys/types.h"+%include C "sys/socket.h" %include C "netdb.h" %access public@@ -16,12 +16,17 @@ class ToCode a where toCode : a -> Int --- Socket Families.--- The ones that people might actually use. We're not going to need US Government--- proprietary ones...-data SocketFamily = AF_UNSPEC -- Unspecified- | AF_INET -- IP / UDP etc. IPv4- | AF_INET6 -- IP / UDP etc. IPv6+||| Socket Families+|||+||| The ones that people might actually use. We're not going to need US+||| Government proprietary ones.+data SocketFamily =+ ||| Unspecified+ AF_UNSPEC |+ ||| IP / UDP etc. IPv4+ AF_INET |+ ||| IP / UDP etc. IPv6+ AF_INET6 instance Show SocketFamily where show AF_UNSPEC = "AF_UNSPEC"@@ -36,11 +41,16 @@ getSocketFamily : Int -> Maybe SocketFamily getSocketFamily i = Prelude.List.lookup i [(0, AF_UNSPEC), (2, AF_INET), (10, AF_INET6)] --- Socket Types.-data SocketType = NotASocket -- Not a socket, used in certain operations- | Stream -- TCP- | Datagram -- UDP- | RawSocket -- Raw sockets. A guy can dream.+||| Socket Types.+data SocketType =+ ||| Not a socket, used in certain operations+ NotASocket |+ ||| TCP+ Stream |+ ||| UDP+ Datagram |+ ||| Raw sockets+ RawSocket instance Show SocketType where show NotASocket = "Not a socket"@@ -60,15 +70,17 @@ data BufPtr = BPtr Ptr data SockaddrPtr = SAPtr Ptr --- Protocol Number. Generally good enough to just set it to 0.+||| Protocol Number.+|||+||| Generally good enough to just set it to 0. ProtocolNumber : Type ProtocolNumber = Int --- SocketError: Error thrown by a socket operation+||| SocketError: Error thrown by a socket operation SocketError : Type SocketError = Int --- SocketDescriptor: Native C Socket Descriptor+||| SocketDescriptor: Native C Socket Descriptor SocketDescriptor : Type SocketDescriptor = Int @@ -86,7 +98,7 @@ Port : Type Port = Int --- Backlog used within listen() call -- number of incoming calls+||| Backlog used within listen() call -- number of incoming calls BACKLOG : Int BACKLOG = 20 @@ -109,7 +121,7 @@ (remote_port : Port) -> UDPAddrInfo --- Frees a given pointer+||| Frees a given pointer public sock_free : BufPtr -> IO () sock_free (BPtr ptr) = mkForeign (FFun "idrnet_free" [FPtr] FUnit) ptr@@ -118,12 +130,14 @@ sockaddr_free : SockaddrPtr -> IO () sockaddr_free (SAPtr ptr) = mkForeign (FFun "idrnet_free" [FPtr] FUnit) ptr --- Allocates an amount of memory given by the ByteLength parameter.--- Used to allocate a mutable pointer to be given to the Recv functions.+||| Allocates an amount of memory given by the ByteLength parameter.+|||+||| Used to allocate a mutable pointer to be given to the Recv functions. public sock_alloc : ByteLength -> IO BufPtr sock_alloc bl = map BPtr $ mkForeign (FFun "idrnet_malloc" [FInt] FPtr) bl +||| The metadata about a socket record Socket : Type where MkSocket : (descriptor : SocketDescriptor) -> (family : SocketFamily) ->@@ -131,20 +145,21 @@ (protocolNumber : ProtocolNumber) -> Socket +||| Get the C error number getErrno : IO Int getErrno = mkForeign (FFun "idrnet_errno" [] FInt) --- Creates a UNIX socket with the given family, socket type and protocol number.--- Returns either a socket or an error.+||| Creates a UNIX socket with the given family, socket type and protocol+||| number. Returns either a socket or an error. socket : SocketFamily -> SocketType -> ProtocolNumber -> IO (Either SocketError Socket) socket sf st pn = do socket_res <- mkForeign (FFun "socket" [FInt, FInt, FInt] FInt) (toCode sf) (toCode st) pn if socket_res == -1 then -- error map Left getErrno- else + else return $ Right (MkSocket socket_res sf st pn) -+||| Close a socket close : Socket -> IO () close sock = mkForeign (FFun "close" [FInt] FUnit) (descriptor sock) @@ -153,18 +168,18 @@ saString (Just sa) = show sa saString Nothing = "" --- Binds a socket to the given socket address and port.--- Returns 0 on success, an error code otherwise.+||| Binds a socket to the given socket address and port.+||| Returns 0 on success, an error code otherwise. bind : Socket -> (Maybe SocketAddress) -> Port -> IO Int bind sock addr port = do- bind_res <- (mkForeign (FFun "idrnet_bind" [FInt, FInt, FInt, FString, FInt] FInt) + bind_res <- (mkForeign (FFun "idrnet_bind" [FInt, FInt, FInt, FString, FInt] FInt) (descriptor sock) (toCode $ family sock) (toCode $ socketType sock) (saString addr) port) if bind_res == (-1) then -- error getErrno else return 0 -- Success --- Connects to a given address and port.--- Returns 0 on success, and an error number on error.+||| Connects to a given address and port.+||| Returns 0 on success, and an error number on error. connect : Socket -> SocketAddress -> Port -> IO Int connect sock addr port = do conn_res <- (mkForeign (FFun "idrnet_connect" [FInt, FInt, FInt, FString, FInt] FInt)@@ -173,7 +188,7 @@ getErrno else return 0 --- Listens on a bound socket.+||| Listens on a bound socket. listen : Socket -> IO Int listen sock = do listen_res <- mkForeign (FFun "listen" [FInt, FInt] FInt) (descriptor sock) BACKLOG@@ -181,7 +196,7 @@ getErrno else return 0 --- Parses a textual representation of an IPv4 address into a SocketAddress+||| Parses a textual representation of an IPv4 address into a SocketAddress parseIPv4 : String -> SocketAddress parseIPv4 str = case splitted of (i1 :: i2 :: i3 :: i4 :: _) => IPv4Addr i1 i2 i3 i4@@ -194,7 +209,7 @@ splitted = map toInt (Prelude.Strings.split (\c => c == '.') str) --- Retrieves a socket address from a sockaddr pointer+||| Retrieves a socket address from a sockaddr pointer getSockAddr : SockaddrPtr -> IO SocketAddress getSockAddr (SAPtr ptr) = do addr_family_int <- mkForeign (FFun "idrnet_sockaddr_family" [FPtr] FInt) ptr@@ -256,13 +271,13 @@ return $ Right (payload, recv_res) --- Sends the data in a given memory location+||| Sends the data in a given memory location sendBuf : Socket -> BufPtr -> ByteLength -> IO (Either SocketError ByteLength) sendBuf sock (BPtr ptr) len = do send_res <- mkForeign (FFun "idrnet_send_buf" [FInt, FPtr, FInt] FInt) (descriptor sock) ptr len if send_res == (-1) then map Left getErrno- else + else return $ Right send_res recvBuf : Socket -> BufPtr -> ByteLength -> IO (Either SocketError ByteLength)@@ -313,7 +328,7 @@ recv_ptr <- mkForeign (FFun "idrnet_recvfrom" [FInt, FInt] FPtr) (descriptor sock) bl let recv_ptr' = RFPtr recv_ptr- if !(nullPtr recv_ptr) then -- ! notation = monadic bind shortcut, not "not"+ if !(nullPtr recv_ptr) then map Left getErrno else do result <- mkForeign (FFun "idrnet_get_recvfrom_res" [FPtr] FInt) recv_ptr@@ -332,7 +347,7 @@ recvFromBuf sock (BPtr ptr) bl = do recv_ptr <- mkForeign (FFun "idrnet_recvfrom_buf" [FInt, FPtr, FInt] FPtr) (descriptor sock) ptr bl let recv_ptr' = RFPtr recv_ptr- if !(nullPtr recv_ptr) then -- ! notation = monadic bind shortcut, not "not"+ if !(nullPtr recv_ptr) then map Left getErrno else do result <- mkForeign (FFun "idrnet_get_recvfrom_res" [FPtr] FInt) recv_ptr@@ -345,5 +360,4 @@ freeRecvfromStruct recv_ptr' return $ Right (MkUDPAddrInfo addr port, result + 1) -
libs/base/Syntax/PreorderReasoning.idr view
@@ -1,6 +1,6 @@ module Syntax.PreorderReasoning --- QED is first to get the precedence to work out. It's just refl with an explicit argument.+-- QED is first to get the precedence to work out. It's just Refl with an explicit argument. syntax [expr] "QED" = qed expr -- foo ={ prf }= bar ={ prf' }= fnord QED -- is a proof that foo is related to fnord, with the intermediate step being bar, justified by prf and prf'@@ -9,7 +9,7 @@ namespace Equal using (a : Type, x : a, y : a, z : a) qed : (x : a) -> x = x- qed x = the (x = x) refl+ qed x = the (x = x) Refl step : (x : a) -> x = y -> (y = z) -> x = z- step x refl refl = refl+ step x Refl Refl = Refl
libs/base/System/Concurrency/Process.idr view
@@ -12,38 +12,38 @@ ||| Type safe message passing programs. Parameterised over the type of ||| message which can be send, and the return type. data Process : (msgType : Type) -> Type -> Type where- lift : IO a -> Process msg a+ Lift : IO a -> Process msg a instance Functor (Process msg) where- map f (lift a) = lift (map f a)+ map f (Lift a) = Lift (map f a) instance Applicative (Process msg) where- pure = lift . return- (lift f) <$> (lift a) = lift (f <$> a)+ pure = Lift . return+ (Lift f) <$> (Lift a) = Lift (f <$> a) instance Monad (Process msg) where- (lift io) >>= k = lift (do x <- io+ (Lift io) >>= k = Lift (do x <- io case k x of- lift v => v)+ Lift v => v) run : Process msg x -> IO x-run (lift prog) = prog+run (Lift prog) = prog ||| Get current process ID myID : Process msg (ProcID msg)-myID = lift (return (MkPID prim__vm))+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))+send (MkPID p) m = Lift (sendToThread p (prim__vm, m)) ||| Return whether a message is waiting in the queue msgWaiting : Process msg Bool-msgWaiting = lift checkMsgs+msgWaiting = Lift checkMsgs ||| Receive a message - blocks if there is no message waiting recv : Process msg msg-recv {msg} = do (senderid, m) <- lift get+recv {msg} = do (senderid, m) <- Lift get return m where get : IO (Ptr, msg) get = getMsg@@ -51,11 +51,11 @@ ||| receive a message, and return with the sender's process ID. recvWithSender : Process msg (ProcID msg, msg) recvWithSender {msg}- = do (senderid, m) <- lift get+ = do (senderid, m) <- Lift get return (MkPID senderid, m) where get : IO (Ptr, msg) get = getMsg create : Process msg () -> Process msg (ProcID msg)-create (lift p) = do ptr <- lift (fork p)+create (Lift p) = do ptr <- Lift (fork p) return (MkPID ptr)
libs/base/base.ipkg view
@@ -24,7 +24,7 @@ Data.Vect, Data.HVect, Data.Vect.Quantifiers, Data.Floats, Data.Complex, Data.Heap, Data.Fun, Data.Rel, Data.Buffer, Data.Erased,- Data.List,+ Data.List, Data.Hash, Control.Isomorphism, Control.Isomorphism.Primitives, Control.Monad.Identity,
libs/effects/Effect/Memory.idr view
@@ -16,23 +16,23 @@ Free : RawMemory () (MemoryChunk n i) (\v => ()) Initialize : Bits8 -> (size : Nat) ->- so (i + size <= n) ->+ So (i + size <= n) -> RawMemory () (MemoryChunk n i) (\v => MemoryChunk n (i + size)) Peek : (offset : Nat) -> (size : Nat) ->- so (offset + size <= i) ->+ So (offset + size <= i) -> RawMemory (Vect size Bits8) (MemoryChunk n i) (\v => MemoryChunk n i) Poke : (offset : Nat) -> (Vect size Bits8) ->- so (offset <= i && offset + size <= n) ->+ So (offset <= i && offset + size <= n) -> RawMemory () (MemoryChunk n i) (\v => MemoryChunk n (max i (offset + size))) Move : (src : MemoryChunk src_size src_init) -> (dst_offset : Nat) -> (src_offset : Nat) -> (size : Nat) ->- so (dst_offset <= dst_init && dst_offset + size <= dst_size) ->- so (src_offset + size <= src_init) ->+ So (dst_offset <= dst_init && dst_offset + size <= dst_size) ->+ So (src_offset + size <= src_init) -> RawMemory () (MemoryChunk dst_size dst_init) (\v => MemoryChunk dst_size (max dst_init (dst_offset + size))) GetRawPtr : RawMemory (MemoryChunk n i) (MemoryChunk n i) (\v => MemoryChunk n i) @@ -108,7 +108,7 @@ {n : Nat} -> Bits8 -> (size : Nat) ->- so (i + size <= n) ->+ So (i + size <= n) -> Eff () [RAW_MEMORY (MemoryChunk n i)] (\v => [RAW_MEMORY (MemoryChunk n (i + size))]) initialize c size prf = call $ Initialize c size prf@@ -119,7 +119,7 @@ peek : {i : Nat} -> (offset : Nat) -> (size : Nat) ->- so (offset + size <= i) ->+ So (offset + size <= i) -> { [RAW_MEMORY (MemoryChunk n i)] } Eff (Vect size Bits8) peek offset size prf = call $ Peek offset size prf @@ -127,7 +127,7 @@ {i : Nat} -> (offset : Nat) -> Vect size Bits8 ->- so (offset <= i && offset + size <= n) ->+ So (offset <= i && offset + size <= n) -> Eff () [RAW_MEMORY (MemoryChunk n i)] (\v => [RAW_MEMORY (MemoryChunk n (max i (offset + size)))]) poke offset content prf = call $ Poke offset content prf@@ -144,8 +144,8 @@ (dst_offset : Nat) -> (src_offset : Nat) -> (size : Nat) ->- so (dst_offset <= dst_init && dst_offset + size <= dst_size) ->- so (src_offset + size <= src_init) ->+ So (dst_offset <= dst_init && dst_offset + size <= dst_size) ->+ So (src_offset + size <= src_init) -> Eff () [RAW_MEMORY (MemoryChunk dst_size dst_init)] (\v => [RAW_MEMORY (MemoryChunk dst_size (max dst_init (dst_offset + size)))]) move' src_ptr dst_offset src_offset size dst_bounds src_bounds@@ -160,8 +160,8 @@ (dst_offset : Nat) -> (src_offset : Nat) -> (size : Nat) ->- so (dst_offset <= dst_init && dst_offset + size <= dst_size) ->- so (src_offset + size <= src_init) ->+ So (dst_offset <= dst_init && dst_offset + size <= dst_size) ->+ So (src_offset + size <= src_init) -> Eff () [ Dst ::: RAW_MEMORY (MemoryChunk dst_size dst_init) , Src ::: RAW_MEMORY (MemoryChunk src_size src_init)]
libs/effects/Effects.idr view
@@ -136,9 +136,7 @@ data Eff : (x : Type) -> (es : List EFFECT) -> (ce : x -> List EFFECT) -> Type where- value : a -> Eff a xs (\v => xs)- with_val : (val : a) -> Eff () xs (\v => xs' val) ->- Eff a xs xs'+ value : (val : a) -> Eff a (xs val) xs ebind : Eff a xs xs' -> ((val : a) -> Eff b (xs' val) xs'') -> Eff b xs xs'' callP : (prf : EffElem e a xs) ->@@ -181,7 +179,8 @@ pure : a -> Eff a xs (\v => xs) pure = value -syntax pureM [val] = with_val val (pure ())+pureM : (val : a) -> Eff a (xs val) xs+pureM = value (<$>) : Eff (a -> b) xs (\v => xs) -> Eff a xs (\v => xs) -> Eff b xs (\v => xs)@@ -206,7 +205,6 @@ eff : Env m xs -> Eff a xs xs' -> ((x : a) -> Env m (xs' x) -> m b) -> m b eff env (value x) k = k x env-eff env (with_val x prog) k = eff env prog (\p', env' => k x env') eff env (prog `ebind` c) k = eff env prog (\p', env' => eff env' (c p') k) eff env (callP prf effP) k = execEff env prf effP k
libs/prelude/Builtins.idr view
@@ -3,14 +3,40 @@ %access public %default total -||| Dependent pairs, in their internal representation-||| @ a the type of the witness-||| @ P the type of the proof+||| The canonical single-element type, also known as the trivially+||| true proposition.+%elim data Unit =+ ||| The trivial constructor for `()`.+ MkUnit++||| The non-dependent pair type, also known as conjunction.+||| @A the type of the left elements in the pair+||| @B the type of the left elements in the pair+data Pair : (A : Type) -> (B : Type) -> Type where+ ||| A pair of elements+ ||| @a the left element of the pair+ ||| @b the right element of the pair+ MkPair : {A, B : Type} -> (a : A) -> (b : B) -> Pair A B++||| Dependent pairs+|||+||| Dependent pairs represent existential quantification - they consist of a+||| witness for the existential claim and a proof that the property holds for+||| it. Another way to see dependent pairs is as just data - for instance, the+||| length of a vector paired with that vector.+|||+||| @ a the type of the witness @ P the type of the proof data Sigma : (a : Type) -> (P : a -> Type) -> Type where- Sg_intro : .{P : a -> Type} -> (x : a) -> (pf : P x) -> Sigma a P+ MkSigma : .{P : a -> Type} -> (x : a) -> (pf : P x) -> Sigma a P -||| The eliminator for the empty type.-FalseElim : _|_ -> a+||| The empty type, also known as the trivially false proposition.+|||+||| Use `void` or `absurd` to prove anything if you have a variable of type `Void` in scope. +%elim data Void : Type where + +||| The eliminator for the `Void` type.+void : Void -> a+void {a} v = elim_for Void (\_ => a) v ||| For 'symbol syntax. 'foo becomes Symbol_ "foo" data Symbol_ : String -> Type where@@ -27,20 +53,19 @@ (~=~) : (x : a) -> (y : b) -> Type (~=~) x y = (=) _ _ x y --- ------------------------------------------------------ [ For rewrite tactic ] ||| Perform substitution in a term according to some equality. ||| ||| This is used by the `rewrite` tactic and term. replace : {a:_} -> {x:_} -> {y:_} -> {P : a -> Type} -> x = y -> P x -> P y-replace refl prf = prf+replace Refl prf = prf ||| Symmetry of propositional equality sym : {l:a} -> {r:a} -> l = r -> r = l-sym refl = refl+sym Refl = Refl ||| Transitivity of propositional equality trans : {a:x} -> {b:y} -> {c:z} -> a = b -> b = c -> a = c-trans refl refl = refl+trans Refl Refl = Refl ||| There are two types of laziness: that arising from lazy functions, and that ||| arising from codata. They differ in their totality condition.@@ -79,7 +104,7 @@ ||| A read-only version of a unique value data Borrowed : UniqueType -> NullType where Read : {a : UniqueType} -> a -> Borrowed a- + ||| Make a read-only version of a unique value, which can be passed to another ||| function without the unique value being consumed. implicit@@ -88,13 +113,7 @@ par : Lazy a -> a -- Doesn't actually do anything yet. Maybe a 'Par a' type -- is better in any case?-par (Delay x) = x --malloc : Int -> a -> a-malloc size x = x -- compiled specially--trace_malloc : a -> a-trace_malloc x = x -- compiled specially+par (Delay x) = x ||| Assert to the totality checker than y is always structurally smaller than ||| x (which is typically a pattern argument)@@ -119,4 +138,3 @@ public %assert_total really_believe_me : a -> b really_believe_me x = prim__believe_me _ _ x-
libs/prelude/Decidable/Equality.idr view
@@ -13,7 +13,7 @@ -------------------------------------------------------------------------------- ||| The negation of equality is symmetric (follows from symmetry of equality)-total negEqSym : {a : t} -> {b : t} -> (a = b -> _|_) -> (b = a -> _|_)+total negEqSym : {a : t} -> {b : t} -> (a = b -> Void) -> (b = a -> Void) negEqSym p h = p (sym h) @@ -31,17 +31,17 @@ -------------------------------------------------------------------------------- instance DecEq () where- decEq () () = Yes refl+ decEq () () = Yes Refl -------------------------------------------------------------------------------- -- Booleans ---------------------------------------------------------------------------------total trueNotFalse : True = False -> _|_-trueNotFalse refl impossible+total trueNotFalse : True = False -> Void+trueNotFalse Refl impossible instance DecEq Bool where- decEq True True = Yes refl- decEq False False = Yes refl+ decEq True True = Yes Refl+ decEq False False = Yes Refl decEq True False = No trueNotFalse decEq False True = No (negEqSym trueNotFalse) @@ -49,11 +49,11 @@ -- Nat -------------------------------------------------------------------------------- -total OnotS : Z = S n -> _|_-OnotS refl impossible+total OnotS : Z = S n -> Void+OnotS Refl impossible instance DecEq Nat where- decEq Z Z = Yes refl+ decEq Z Z = Yes Refl decEq Z (S _) = No OnotS decEq (S _) Z = No (negEqSym OnotS) decEq (S n) (S m) with (decEq n m)@@ -64,11 +64,11 @@ -- Maybe -------------------------------------------------------------------------------- -total nothingNotJust : {x : t} -> (Nothing {a = t} = Just x) -> _|_-nothingNotJust refl impossible+total nothingNotJust : {x : t} -> (Nothing {a = t} = Just x) -> Void+nothingNotJust Refl impossible instance (DecEq t) => DecEq (Maybe t) where- decEq Nothing Nothing = Yes refl+ decEq Nothing Nothing = Yes Refl decEq (Just x') (Just y') with (decEq x' y') | Yes p = Yes $ cong p | No p = No $ \h : Just x' = Just y' => p $ justInjective h@@ -79,8 +79,8 @@ -- Either -------------------------------------------------------------------------------- -total leftNotRight : {x : a} -> {y : b} -> Left {b = b} x = Right {a = a} y -> _|_-leftNotRight refl impossible+total leftNotRight : {x : a} -> {y : b} -> Left {b = b} x = Right {a = a} y -> Void+leftNotRight Refl impossible instance (DecEq a, DecEq b) => DecEq (Either a b) where decEq (Left x') (Left y') with (decEq x' y')@@ -96,40 +96,40 @@ -- Fin -------------------------------------------------------------------------------- -total fZNotfS : {f : Fin n} -> fZ {k = n} = fS f -> _|_-fZNotfS refl impossible+total FZNotFS : {f : Fin n} -> FZ {k = n} = FS f -> Void+FZNotFS Refl impossible instance DecEq (Fin n) where- decEq fZ fZ = Yes refl- decEq fZ (fS f) = No fZNotfS- decEq (fS f) fZ = No $ negEqSym fZNotfS- decEq (fS f) (fS f') with (decEq f f')+ decEq FZ FZ = Yes Refl+ decEq FZ (FS f) = No FZNotFS+ decEq (FS f) FZ = No $ negEqSym FZNotFS+ decEq (FS f) (FS f') with (decEq f f') | Yes p = Yes $ cong p- | No p = No $ \h => p $ fSinjective {f = f} {f' = f'} h+ | No p = No $ \h => p $ FSinjective {f = f} {f' = f'} h -------------------------------------------------------------------------------- -- Tuple -------------------------------------------------------------------------------- -lemma_both_neq : {x : a, y : b, x' : c, y' : d} -> (x = x' -> _|_) -> (y = y' -> _|_) -> ((x, y) = (x', y') -> _|_)-lemma_both_neq p_x_not_x' p_y_not_y' refl = p_x_not_x' refl+lemma_both_neq : {x : a, y : b, x' : c, y' : d} -> (x = x' -> Void) -> (y = y' -> Void) -> ((x, y) = (x', y') -> Void)+lemma_both_neq p_x_not_x' p_y_not_y' Refl = p_x_not_x' Refl -lemma_snd_neq : {x : a, y : b, y' : d} -> (x = x) -> (y = y' -> _|_) -> ((x, y) = (x, y') -> _|_)-lemma_snd_neq refl p refl = p refl+lemma_snd_neq : {x : a, y : b, y' : d} -> (x = x) -> (y = y' -> Void) -> ((x, y) = (x, y') -> Void)+lemma_snd_neq Refl p Refl = p Refl lemma_fst_neq_snd_eq : {x : a, x' : b, y : c, y' : d} ->- (x = x' -> _|_) ->+ (x = x' -> Void) -> (y = y') ->- ((x, y) = (x', y) -> _|_)-lemma_fst_neq_snd_eq p_x_not_x' refl refl = p_x_not_x' refl+ ((x, y) = (x', y) -> Void)+lemma_fst_neq_snd_eq p_x_not_x' Refl Refl = p_x_not_x' Refl instance (DecEq a, DecEq b) => DecEq (a, b) where decEq (a, b) (a', b') with (decEq a a')- decEq (a, b) (a, b') | (Yes refl) with (decEq b b')- decEq (a, b) (a, b) | (Yes refl) | (Yes refl) = Yes refl- decEq (a, b) (a, b') | (Yes refl) | (No p) = No (\eq => lemma_snd_neq refl p eq)+ decEq (a, b) (a, b') | (Yes Refl) with (decEq b b')+ decEq (a, b) (a, b) | (Yes Refl) | (Yes Refl) = Yes Refl+ decEq (a, b) (a, b') | (Yes Refl) | (No p) = No (\eq => lemma_snd_neq Refl p eq) decEq (a, b) (a', b') | (No p) with (decEq b b')- decEq (a, b) (a', b) | (No p) | (Yes refl) = No (\eq => lemma_fst_neq_snd_eq p refl eq)+ decEq (a, b) (a', b) | (No p) | (Yes Refl) = No (\eq => lemma_fst_neq_snd_eq p Refl eq) decEq (a, b) (a', b') | (No p) | (No p') = No (\eq => lemma_both_neq p p' eq) @@ -137,28 +137,28 @@ -- List -------------------------------------------------------------------------------- -lemma_val_not_nil : {x : t, xs : List t} -> ((x :: xs) = Prelude.List.Nil {a = t} -> _|_)-lemma_val_not_nil refl impossible+lemma_val_not_nil : {x : t, xs : List t} -> ((x :: xs) = Prelude.List.Nil {a = 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 -> _|_) -> ((x :: xs) = (y :: ys) -> _|_)-lemma_x_eq_xs_neq refl p refl = p refl+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)+lemma_x_eq_xs_neq Refl p Refl = p Refl -lemma_x_neq_xs_eq : {x : t, xs : List t, y : t, ys : List t} -> (x = y -> _|_) -> (xs = ys) -> ((x :: xs) = (y :: ys) -> _|_)-lemma_x_neq_xs_eq p refl refl = p refl+lemma_x_neq_xs_eq : {x : t, xs : List t, y : t, ys : List t} -> (x = y -> Void) -> (xs = ys) -> ((x :: xs) = (y :: ys) -> Void)+lemma_x_neq_xs_eq p Refl Refl = p Refl -lemma_x_neq_xs_neq : {x : t, xs : List t, y : t, ys : List t} -> (x = y -> _|_) -> (xs = ys -> _|_) -> ((x :: xs) = (y :: ys) -> _|_)-lemma_x_neq_xs_neq p p' refl = p refl+lemma_x_neq_xs_neq : {x : t, xs : List t, y : t, ys : List t} -> (x = y -> Void) -> (xs = ys -> Void) -> ((x :: xs) = (y :: ys) -> Void)+lemma_x_neq_xs_neq p p' Refl = p Refl instance DecEq a => DecEq (List a) where- decEq [] [] = Yes refl+ decEq [] [] = Yes Refl decEq (x :: xs) [] = No lemma_val_not_nil decEq [] (x :: xs) = No (negEqSym lemma_val_not_nil) decEq (x :: xs) (y :: ys) with (decEq x y)- decEq (x :: xs) (x :: ys) | Yes refl with (decEq xs ys)- decEq (x :: xs) (x :: xs) | (Yes refl) | (Yes refl) = Yes refl - decEq (x :: xs) (x :: ys) | (Yes refl) | (No p) = No (\eq => lemma_x_eq_xs_neq refl p eq)+ decEq (x :: xs) (x :: ys) | Yes Refl with (decEq xs ys)+ decEq (x :: xs) (x :: xs) | (Yes Refl) | (Yes Refl) = Yes Refl + decEq (x :: xs) (x :: ys) | (Yes Refl) | (No p) = No (\eq => lemma_x_eq_xs_neq Refl p eq) decEq (x :: xs) (y :: ys) | No p with (decEq xs ys)- decEq (x :: xs) (y :: xs) | (No p) | (Yes refl) = No (\eq => lemma_x_neq_xs_eq p refl eq)+ decEq (x :: xs) (y :: xs) | (No p) | (Yes Refl) = No (\eq => lemma_x_neq_xs_eq p Refl eq) decEq (x :: xs) (y :: ys) | (No p) | (No p') = No (\eq => lemma_x_neq_xs_neq p p' eq) @@ -168,26 +168,26 @@ total vectInjective1 : {xs, ys : Vect n a} -> {x, y : a} -> x :: xs = y :: ys -> x = y-vectInjective1 {x=x} {y=x} {xs=xs} {ys=xs} refl = refl+vectInjective1 {x=x} {y=x} {xs=xs} {ys=xs} Refl = Refl total vectInjective2 : {xs, ys : Vect n a} -> {x, y : a} -> x :: xs = y :: ys -> xs = ys-vectInjective2 {x=x} {y=x} {xs=xs} {ys=xs} refl = refl+vectInjective2 {x=x} {y=x} {xs=xs} {ys=xs} Refl = Refl instance DecEq a => DecEq (Vect n a) where- decEq [] [] = Yes refl+ decEq [] [] = Yes Refl decEq (x :: xs) (y :: ys) with (decEq x y)- decEq (x :: xs) (x :: ys) | Yes refl with (decEq xs ys)- decEq (x :: xs) (x :: xs) | Yes refl | Yes refl = Yes refl- decEq (x :: xs) (x :: ys) | Yes refl | No neq = No (neq . vectInjective2)+ decEq (x :: xs) (x :: ys) | Yes Refl with (decEq xs ys)+ decEq (x :: xs) (x :: xs) | Yes Refl | Yes Refl = Yes Refl+ decEq (x :: xs) (x :: ys) | Yes Refl | No neq = No (neq . vectInjective2) decEq (x :: xs) (y :: ys) | No neq = No (neq . vectInjective1) {- The following definition is elaborated in a wrong case-tree. Examination pending. instance DecEq a => DecEq (Vect n a) where- decEq [] [] = Yes refl+ decEq [] [] = Yes Refl decEq (x :: xs) (y :: ys) with (decEq x y, decEq xs ys)- decEq (x :: xs) (x :: xs) | (Yes refl, Yes refl) = Yes refl+ decEq (x :: xs) (x :: xs) | (Yes Refl, Yes Refl) = Yes Refl decEq (x :: xs) (y :: ys) | (_, No nEqTl) = No (\p => nEqTl (vectInjective2 p)) decEq (x :: xs) (y :: ys) | (No nEqHd, _) = No (\p => nEqHd (vectInjective1 p)) -}@@ -202,8 +202,8 @@ instance DecEq Int 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 -> _|_+ primitiveEq = believe_me (Refl {x})+ postulate primitiveNotEq : x = y -> Void -------------------------------------------------------------------------------- -- Char@@ -212,8 +212,8 @@ instance DecEq Char 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 -> _|_+ primitiveEq = believe_me (Refl {x})+ postulate primitiveNotEq : x = y -> Void -------------------------------------------------------------------------------- -- Integer@@ -222,8 +222,8 @@ instance DecEq Integer 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 -> _|_+ primitiveEq = believe_me (Refl {x})+ postulate primitiveNotEq : x = y -> Void -------------------------------------------------------------------------------- -- Float@@ -232,8 +232,8 @@ instance DecEq Float 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 -> _|_+ primitiveEq = believe_me (Refl {x})+ postulate primitiveNotEq : x = y -> Void -------------------------------------------------------------------------------- -- String@@ -242,7 +242,7 @@ instance DecEq String 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 -> _|_+ primitiveEq = believe_me (Refl {x})+ postulate primitiveNotEq : x = y -> Void
libs/prelude/Prelude.idr view
@@ -420,9 +420,9 @@ go (x :: xs) = n + (cast x * inc) :: go xs instance Enum (Fin (S n)) where- pred fZ = fZ- pred (fS n) = weaken n- succ n = case strengthen (fS n) of+ pred FZ = FZ+ pred (FS n) = weaken n+ succ n = case strengthen (FS n) of Left _ => last Right k => k toNat n = cast n@@ -494,6 +494,7 @@ ---- some basic file handling +||| A file handle abstract data File = FHandle Ptr @@ -592,6 +593,7 @@ do_feof : Ptr -> IO Int do_feof h = mkForeign (FFun "fileEOF" [FPtr] FInt) 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))@@ -608,6 +610,7 @@ fpoll (FHandle h) = do p <- mkForeign (FFun "fpoll" [FPtr] FInt) h return (p > 0) +||| Check if a foreign pointer is null partial nullPtr : Ptr -> IO Bool nullPtr p = do ok <- mkForeign (FFun "isNull" [FPtr] FInt) p@@ -630,6 +633,10 @@ validFile (FHandle h) = do x <- nullPtr h return (not x) +||| Loop while some test is true+|||+||| @ test the condition of the loop+||| @ body the loop body partial -- obviously while : (test : IO Bool) -> (body : IO ()) -> IO () while t b = do v <- t@@ -637,6 +644,7 @@ 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
libs/prelude/Prelude/Algebra.idr view
@@ -123,7 +123,7 @@ ||| + Inverse for `<+>`: ||| forall a, a <+> inverse a == neutral ||| forall a, inverse a <+> a == neutral-||| + Associativity of `<*>a:+||| + Associativity of `<*>`: ||| forall a b c, a <*> (b <*> c) == (a <*> b) <*> c ||| + Neutral for `<*>`: ||| forall a, a <*> unity == a@@ -264,9 +264,61 @@ class (VerifiedBoundedJoinSemilattice a, VerifiedBoundedMeetSemilattice a, VerifiedLattice a) => VerifiedBoundedLattice a where { } +-- Fields.+||| Sets equipped with two binary operations, both associative and commutative+||| supplied with a neutral element, with+||| distributivity laws relating the two operations. Must satisfy the following+||| laws:+|||+||| + Associativity of `<+>`:+||| forall a b c, a <+> (b <+> c) == (a <+> b) <+> c+||| + Commutativity of `<+>`:+||| forall a b, a <+> b == b <+> a+||| + Neutral for `<+>`:+||| forall a, a <+> neutral == a+||| forall a, neutral <+> a == a+||| + Inverse for `<+>`:+||| forall a, a <+> inverse a == neutral+||| forall a, inverse a <+> a == neutral+||| + Associativity of `<*>`:+||| forall a b c, a <*> (b <*> c) == (a <*> b) <*> c+||| + Unity for `<*>`:+||| forall a, a <*> unity == a+||| forall a, unity <*> a == a+||| + InverseM of `<*>`:+||| forall a, a <*> inverseM a == unity+||| forall a, inverseM a <*> a == unity+||| + 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 : a -> a +class (VerifiedRing a, Field a) => VerifiedField a where+ total fieldInverseIsInverseL : (l : a) -> l <*> inverseM l = unity+ total fieldInverseIsInverseR : (r : a) -> inverseM r <*> r = unity++-- vector spaces.+||| A Vector Space over a Field can be considered as an additive Abeliean Group+||| of Vectors adjoined to the Field structure by distributivity laws relating+||| the two operations. Such that we satisfy the following laws:+|||+||| + Unity for `<*>`:+||| forall a, a <*> unity == a+||| forall a, unity <*> a == a+||| + Distributivity of `<*>` and `<+>`:+||| forall a x y, a <*> (x <+> y) == (a <*> x) <+> (a <*> y)+||| forall a b x, (a <+> b) <*> x == (a <*> x) <+> (b <*> x)+class (Field a, AbelianGroup a) => VectorSpace a a where {}++class (VerifiedField a, VerifiedAbelianGroup a, VectorSpace a a) => VerifiedVectorSpace a a where+ total vectorspaceScalarUnityIsUnityL : (l : a) -> l <*> unity = l+ total vectorspaceScalarUnityIsUnityR : (r : a) -> unity <*> r = r+ total vectorspaceScalarIsDistributiveWRTVectorAddition : (s : a) -> (x, y : a) -> s <*> (x <+> y) = (s <*> x) <+> (s <*> y)+ total vectorspaceScalarIsDistributiveWRTFieldAddition : (s, t : a) -> (x : a) -> (s <+> t) <*> x = (s <*> x) <+> (t <*> x)++ -- XXX todo:--- Fields and vector spaces. -- Structures where "abs" make sense. -- Euclidean domains, etc. -- Where to put fromInteger and fromRational?
libs/prelude/Prelude/Basics.idr view
@@ -1,7 +1,9 @@ module Prelude.Basics +import Builtins+ Not : Type -> Type-Not a = a -> _|_+Not a = a -> Void ||| Identity function. id : a -> a@@ -42,7 +44,7 @@ ||| Equality is a congruence. cong : {f : t -> u} -> (a = b) -> f a = f b-cong refl = refl+cong Refl = Refl ||| Decidability. A decidable property either holds or is a contradiction. data Dec : Type -> Type where@@ -53,5 +55,5 @@ ||| The case where the property holding would be a contradiction ||| @ contra a demonstration that A would be a contradiction- No : {A : Type} -> (contra : A -> _|_) -> Dec A+ No : {A : Type} -> (contra : A -> Void) -> Dec A
libs/prelude/Prelude/Bool.idr view
@@ -21,13 +21,14 @@ ||| if you need to perform a Boolean test and convince the type checker of this ||| fact. |||-||| If you find yourself using `so` for something other than primitive types,+||| If you find yourself using `So` for something other than primitive types, ||| it may be appropriate to define a type of evidence for the property that you ||| care about instead.-data so : Bool -> Type where oh : so True+data So : Bool -> Type where + Oh : So True -instance Uninhabited (so False) where- uninhabited oh impossible+instance Uninhabited (So False) where+ uninhabited Oh impossible -- Syntactic sugar for boolean elimination. syntax if [test] then [t] else [e] = boolElim test (Delay t) (Delay e)
libs/prelude/Prelude/Classes.idr view
@@ -137,6 +137,21 @@ then compare xl yl else compare xr yr +-- --------------------------------------------------------- [ Negatable Class ]+||| The `Neg` class defines unary negation (-).+class Neg a where+ ||| The underlying implementation of unary minus. `-5` desugars to `negate (fromInteger 5)`.+ negate : a -> a++instance Neg Integer where+ negate x = prim__subBigInt 0 x++instance Neg Int where+ negate x = prim__subInt 0 x++instance Neg Float where+ negate x = prim__negFloat x+ -- --------------------------------------------------------- [ Numerical Class ] ||| The Num class defines basic numerical arithmetic. class Num a where
libs/prelude/Prelude/Either.idr view
@@ -30,10 +30,10 @@ -- Misc. -------------------------------------------------------------------------------- -||| Perform a case analysis on a Boolean, providing clients with a `so` proof-choose : (b : Bool) -> Either (so b) (so (not b))-choose True = Left oh-choose False = Right oh+||| Perform a case analysis on a Boolean, providing clients with a `So` proof+choose : (b : Bool) -> Either (So b) (So (not b))+choose True = Left Oh+choose False = Right Oh ||| Simply-typed eliminator for Either ||| @ f the action to take on Left@@ -97,9 +97,9 @@ ||| Left is injective total leftInjective : {b : Type} -> {x : a} -> {y : a} -> (Left {b = b} x = Left {b = b} y) -> (x = y)-leftInjective refl = refl+leftInjective Refl = Refl ||| Right is injective total rightInjective : {a : Type} -> {x : b} -> {y : b} -> (Right {a = a} x = Right {a = a} y) -> (x = y)-rightInjective refl = refl+rightInjective Refl = Refl
libs/prelude/Prelude/Fin.idr view
@@ -12,39 +12,39 @@ ||| exceedingly inefficient at run time. ||| @ n the upper bound data Fin : (n : Nat) -> Type where- fZ : Fin (S k)- fS : Fin k -> Fin (S k)+ FZ : Fin (S k)+ FS : Fin k -> Fin (S k) instance Uninhabited (Fin Z) where- uninhabited fZ impossible- uninhabited (fS f) impossible+ uninhabited FZ impossible+ uninhabited (FS f) impossible -fSInjective : (m : Fin k) -> (n : Fin k) -> fS m = fS n -> m = n-fSInjective left _ refl = refl+FSInjective : (m : Fin k) -> (n : Fin k) -> FS m = FS n -> m = n+FSInjective left _ Refl = Refl instance Eq (Fin n) where- (==) fZ fZ = True- (==) (fS k) (fS k') = k == k'+ (==) FZ FZ = True+ (==) (FS k) (FS k') = k == k' (==) _ _ = False ||| There are no elements of `Fin Z`-FinZAbsurd : Fin Z -> _|_-FinZAbsurd fZ impossible+FinZAbsurd : Fin Z -> Void+FinZAbsurd FZ impossible FinZElim : Fin Z -> a-FinZElim x = FalseElim (FinZAbsurd x)+FinZElim x = void (FinZAbsurd x) ||| Convert a Fin to a Nat finToNat : Fin n -> Nat-finToNat fZ = Z-finToNat (fS k) = S (finToNat k)+finToNat FZ = Z+finToNat (FS k) = S (finToNat k) ||| `finToNat` is injective finToNatInjective : (fm : Fin k) -> (fn : Fin k) -> (finToNat fm) = (finToNat fn) -> fm = fn-finToNatInjective fZ fZ refl = refl-finToNatInjective (fS m) fZ refl impossible-finToNatInjective fZ (fS n) refl impossible-finToNatInjective (fS m) (fS n) prf =+finToNatInjective FZ FZ Refl = Refl+finToNatInjective (FS m) FZ Refl impossible+finToNatInjective FZ (FS n) Refl impossible+finToNatInjective (FS m) (FS n) prf = cong (finToNatInjective m n (succInjective (finToNat m) (finToNat n) prf)) instance Cast (Fin n) Nat where@@ -52,29 +52,29 @@ ||| Convert a Fin to an Integer finToInteger : Fin n -> Integer-finToInteger fZ = 0-finToInteger (fS k) = 1 + finToInteger k+finToInteger FZ = 0+finToInteger (FS k) = 1 + finToInteger k instance Cast (Fin n) Integer where cast x = finToInteger x ||| Weaken the bound on a Fin by 1 weaken : Fin n -> Fin (S n)-weaken fZ = fZ-weaken (fS k) = fS (weaken k)+weaken FZ = FZ+weaken (FS k) = FS (weaken k) ||| Weaken the bound on a Fin by some amount weakenN : (n : Nat) -> Fin m -> Fin (m + n)-weakenN n fZ = fZ-weakenN n (fS f) = fS (weakenN n f)+weakenN n FZ = FZ+weakenN n (FS f) = FS (weakenN n f) ||| Attempt to tighten the bound on a Fin. ||| Return `Left` if the bound could not be tightened, or `Right` if it could. strengthen : Fin (S n) -> Either (Fin (S n)) (Fin n)-strengthen {n = S k} fZ = Right fZ-strengthen {n = S k} (fS i) with (strengthen i)- strengthen (fS k) | Left x = Left (fS x)- strengthen (fS k) | Right x = Right (fS x)+strengthen {n = S k} FZ = Right FZ+strengthen {n = S k} (FS i) with (strengthen i)+ strengthen (FS k) | Left x = Left (FS x)+ strengthen (FS k) | Right x = Right (FS x) strengthen f = Left f ||| Add some natural number to a Fin, extending the bound accordingly@@ -82,24 +82,24 @@ ||| @ m the number to increase the Fin by shift : (m : Nat) -> Fin n -> Fin (m + n) shift Z f = f-shift {n=n} (S m) f = fS {k = (m + n)} (shift m f)+shift {n=n} (S m) f = FS {k = (m + n)} (shift m f) ||| The largest element of some Fin type last : Fin (S n)-last {n=Z} = fZ-last {n=S _} = fS last+last {n=Z} = FZ+last {n=S _} = FS last -total fSinjective : {f : Fin n} -> {f' : Fin n} -> (fS f = fS f') -> f = f'-fSinjective refl = refl+total FSinjective : {f : Fin n} -> {f' : Fin n} -> (FS f = FS f') -> f = f'+FSinjective Refl = Refl instance Ord (Fin n) where- compare fZ fZ = EQ- compare fZ (fS _) = LT- compare (fS _) fZ = GT- compare (fS x) (fS y) = compare x y+ compare FZ FZ = EQ+ compare FZ (FS _) = LT+ compare (FS _) FZ = GT+ compare (FS x) (FS y) = compare x y instance MinBound (Fin (S n)) where- minBound = fZ+ minBound = FZ instance MaxBound (Fin (S n)) where maxBound = last@@ -107,28 +107,28 @@ ||| Add two Fins, extending the bound (+) : Fin n -> Fin m -> Fin (n + m)-(+) {n=S n} {m=m} fZ f' = rewrite plusCommutative n m in weaken (weakenN n f')-(+) (fS f) f' = fS (f + f')+(+) {n=S n} {m=m} FZ f' = rewrite plusCommutative n m in weaken (weakenN n f')+(+) (FS f) f' = FS (f + f') ||| Substract two Fins, keeping the bound of the minuend (-) : Fin n -> Fin m -> Fin n-fZ - _ = fZ-f - fZ = f-(fS f) - (fS f') = weaken $ f - f'+FZ - _ = FZ+f - FZ = f+(FS f) - (FS f') = weaken $ f - f' ||| Multiply two Fins, extending the bound (*) : Fin n -> Fin m -> Fin (n * m) (*) {n=Z} f f' = FinZElim f (*) {m=Z} f f' = FinZElim f'-(*) {n=S n} {m=S m} fZ f' = fZ-(*) {n=S n} {m=S m} (fS f) f' = f' + (f * f')+(*) {n=S n} {m=S m} FZ f' = FZ+(*) {n=S n} {m=S m} (FS f) f' = f' + (f * f') -- Construct a Fin from an integer literal which must fit in the given Fin natToFin : Nat -> (n : Nat) -> Maybe (Fin n)-natToFin Z (S j) = Just fZ+natToFin Z (S j) = Just FZ natToFin (S k) (S j) with (natToFin k j)- | Just k' = Just (fS k')+ | Just k' = Just (FS k') | Nothing = Nothing natToFin _ _ = Nothing
libs/prelude/Prelude/Foldable.idr view
@@ -38,13 +38,13 @@ ||| predicate to all elements of a structure. `any` short-circuits ||| from left to right. any : Foldable t => (a -> Bool) -> t a -> Bool-any p = foldl (\x => \y => x || p y) False+any p = foldl (\x,y => x || p y) False ||| The disjunction of the collective results of applying a ||| predicate to all elements of a structure. `all` short-circuits ||| from left to right. all : Foldable t => (a -> Bool) -> t a -> Bool-all p = foldl (\x => \y => x && p y) True+all p = foldl (\x,y => x && p y) True ||| Add together all the elements of a structure sum : (Foldable t, Num a) => t a -> a
libs/prelude/Prelude/List.idr view
@@ -60,7 +60,7 @@ 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 _ [] Refl impossible ||| Attempt to find a particular element of a list. |||@@ -73,7 +73,7 @@ ||| 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 [] {ok=Refl} impossible head (x::xs) {ok=p} = x ||| Attempt to get the first element of a list. If the list is empty, return@@ -85,7 +85,7 @@ ||| 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 [] {ok=Refl} impossible tail (x::xs) {ok=p} = xs ||| Attempt to get the tail of a list.@@ -98,9 +98,9 @@ ||| 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 [] {ok=Refl} 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=Refl} ||| Attempt to retrieve the last element of a non-empty list. |||@@ -115,9 +115,9 @@ ||| 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 [] {ok=Refl} 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=Refl} ||| Attempt to Return all but the last element of a list. |||@@ -157,7 +157,7 @@ drop (S n) [] = [] drop (S n) (x::xs) = drop n xs -||| Take the longest prefix of a list such that all elements satsify some+||| Take the longest prefix of a list such that all elements satisfy some ||| Boolean predicate. ||| ||| @ p the predicate@@ -165,7 +165,7 @@ takeWhile p [] = [] takeWhile p (x::xs) = if p x then x :: takeWhile p xs else [] -||| Remove the longest prefix of a list such that all removed elements satsify some+||| Remove the longest prefix of a list such that all removed elements satisfy some ||| Boolean predicate. ||| ||| @ p the predicate@@ -251,8 +251,8 @@ ||| @ 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 [] (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) @@ -265,22 +265,22 @@ ||| @ 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 _ [] (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') ||| Combine two lists elementwise into pairs zip : (l : List a) -> (r : List b) -> (length l = length r) -> List (a, b)-zip = zipWith (\x => \y => (x, y))+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 = zipWith3 (\x => \y => \z => (x, y, z))+zip3 = zipWith3 (\x,y,z => (x, y, z)) ||| Split a list of pairs into two lists unzip : List (a, b) -> (List a, List b)@@ -340,11 +340,16 @@ reverse' acc (x::xs) = reverse' (x::acc) xs ||| Insert some separator between the elements of a list.+|||+||| ````idris example+||| with List (intersperse ',' ['a', 'b', 'c', 'd', 'e'])+||| ````+||| intersperse : a -> List a -> List a intersperse sep [] = [] intersperse sep (x::xs) = x :: intersperse' sep xs where--- intersperse' : a -> List a -> List a+ intersperse' : a -> List a -> List a intersperse' sep [] = [] intersperse' sep (y::ys) = sep :: y :: intersperse' sep ys @@ -353,13 +358,15 @@ ||| Transposes rows and columns of a list of lists. |||-||| > transpose [[1, 2], [3, 4]] = [[1, 3], [2, 4]]+||| ```idris example+||| with List transpose [[1, 2], [3, 4]]+||| ``` ||| ||| This also works for non square scenarios, thus ||| involution does not always hold: |||-||| > transpose [[], [1, 2]] = [[1], [2]]-||| > transpose (transpose [[], [1, 2]]) = [[1, 2]]+||| transpose [[], [1, 2]] = [[1], [2]]+||| transpose (transpose [[], [1, 2]]) = [[1, 2]] ||| ||| TODO: Solution which satisfies the totality checker? %assert_total@@ -468,6 +475,12 @@ -- Filters -------------------------------------------------------------------------------- +||| filter, applied to a predicate and a list, returns the list of those elements that satisfy the predicate; e.g.,+|||+||| ````idris example+||| filter (< 3) [Z, S Z, S (S Z), S (S (S Z)), S (S (S (S Z)))]+||| ````+||| filter : (a -> Bool) -> List a -> List a filter p [] = [] filter p (x::xs) =@@ -476,6 +489,7 @@ else filter p xs +||| The nubBy function behaves just like nub, except it uses a user-supplied equality predicate instead of the overloaded == function. nubBy : (a -> a -> Bool) -> List a -> List a nubBy = nubBy' [] where@@ -487,22 +501,53 @@ else x :: nubBy' (x::acc) p xs +||| O(n^2). The nub function removes duplicate elements from a list. In+||| particular, it keeps only the first occurrence of each element. It is a+||| special case of nubBy, which allows the programmer to supply their own+||| equality test.+|||+||| ```idris example+||| nub (the (List _) [1,2,1,3])+||| ``` nub : Eq a => List a -> List a nub = nubBy (==) +||| The deleteBy function behaves like delete, but takes a user-supplied equality predicate. deleteBy : (a -> a -> Bool) -> a -> List a -> List a deleteBy _ _ [] = [] deleteBy eq x (y::ys) = if x `eq` y then ys else y :: deleteBy eq x ys +||| `delete x` removes the first occurrence of `x` from its list argument. For+||| example,+|||+|||````idris example+|||delete 'a' ['b', 'a', 'n', 'a', 'n', 'a']+|||````+|||+||| It is a special case of deleteBy, which allows the programmer to supply+||| their own equality test. delete : (Eq a) => a -> List a -> List a delete = deleteBy (==) +||| The `\\` function is list difference (non-associative). In the result of+||| `xs \\ ys`, the first occurrence of each element of ys in turn (if any) has+||| been removed from `xs`, e.g.,+|||+||| ```idris example+||| (([1,2] ++ [2,3]) \\ [1,2])+||| ``` (\\) : (Eq a) => List a -> List a -> List a (\\) = foldl (flip delete) unionBy : (a -> a -> Bool) -> List a -> List a -> List a unionBy eq xs ys = xs ++ foldl (flip (deleteBy eq)) (nubBy eq ys) xs +||| The union function returns the list union of the two lists. For example,+|||+||| ```idris example+||| union ['d', 'o', 'g'] ['c', 'o', 'w']+||| ```+||| union : (Eq a) => List a -> List a -> List a union = unionBy (==) @@ -512,6 +557,10 @@ ||| Given a list and a predicate, returns a pair consisting of the longest ||| prefix of the list that satisfies a predicate and the rest of the list.+|||+||| ```idris example+||| span (<3) [1,2,3,2,1]+||| ``` span : (a -> Bool) -> List a -> (List a, List a) span p [] = ([], []) span p (x::xs) =@@ -521,9 +570,21 @@ else ([], x::xs) +||| Given a list and a predicate, returns a pair consisting of the longest+||| prefix of the list that does not satisfy a predicate and the rest of the+||| list.+|||+||| ```idris example+||| break (>=3) [1,2,3,2,1]+||| ``` break : (a -> Bool) -> List a -> (List a, List a) break p = span (not . p) +||| Split on any elements that satisfy the given predicate.+|||+||| ```idris example+||| split (<2) [2,0,3,1,4]+||| ``` split : (a -> Bool) -> List a -> List (List a) split p xs = case break p xs of@@ -538,6 +599,11 @@ splitAt : (n : Nat) -> (xs : List a) -> (List a, List a) splitAt n xs = (take n xs, drop n xs) +||| The partition function takes a predicate a list and returns the pair of lists of elements which do and do not satisfy the predicate, respectively; e.g.,+|||+||| ```idris example+||| partition (<3) [0, 1, 2, 3, 4, 5]+||| ``` partition : (a -> Bool) -> List a -> (List a, List a) partition p [] = ([], []) partition p (x::xs) =@@ -547,19 +613,43 @@ else (lefts, x::rights) +||| The inits function returns all initial segments of the argument, shortest+||| first. For example,+|||+||| ```idris example+||| inits [1,2,3]+||| ``` inits : List a -> List (List a) inits xs = [] :: case xs of [] => [] x :: xs' => map (x ::) (inits xs') +||| The tails function returns all final segments of the argument, longest+||| first. For example,+|||+||| ```idris example+||| tails [1,2,3] == [[1,2,3], [2,3], [3], []]+|||``` tails : List a -> List (List a) tails xs = xs :: case xs of [] => [] _ :: xs' => tails xs' +||| Split on the given element.+|||+||| ```idris example+||| splitOn 0 [1,0,2,0,0,3]+||| ```+||| splitOn : Eq a => a -> List a -> List (List a) splitOn a = split (== a) +||| Replaces all occurences of the first argument with the second argument in a list.+|||+||| ```idris example+||| replaceOn '-' ',' ['1', '-', '2', '-', '3']+||| ```+||| replaceOn : Eq a => a -> a -> List a -> List a replaceOn a b l = map (\c => if c == a then b else c) l @@ -576,15 +666,26 @@ else False +||| The isPrefixOf function takes two lists and returns True iff the first list is a prefix of the second. isPrefixOf : Eq a => List a -> List a -> Bool isPrefixOf = isPrefixOfBy (==) isSuffixOfBy : (a -> a -> Bool) -> List a -> List a -> Bool isSuffixOfBy p left right = isPrefixOfBy p (reverse left) (reverse right) +||| The isSuffixOf function takes two lists and returns True iff the first list is a suffix of the second. isSuffixOf : Eq a => List a -> List a -> Bool isSuffixOf = isSuffixOfBy (==) +||| The isInfixOf function takes two lists and returns True iff the first list is contained, wholly and intact, anywhere within the second.+|||+||| ```idris example+||| isInfixOf ['b','c'] ['a', 'b', 'c', 'd']+||| ```+||| ```idris example+||| isInfixOf ['b','d'] ['a', 'b', 'c', 'd']+||| ```+||| isInfixOf : Eq a => List a -> List a -> Bool isInfixOf n h = any (isPrefixOf n) (tails h) @@ -651,7 +752,7 @@ ||| The empty list is a right identity for append. appendNilRightNeutral : (l : List a) -> l ++ [] = l-appendNilRightNeutral [] = refl+appendNilRightNeutral [] = Refl appendNilRightNeutral (x::xs) = let inductiveHypothesis = appendNilRightNeutral xs in ?appendNilRightNeutralStepCase@@ -659,7 +760,7 @@ ||| Appending lists is associative. appendAssociative : (l : List a) -> (c : List a) -> (r : List a) -> l ++ (c ++ r) = (l ++ c) ++ r-appendAssociative [] c r = refl+appendAssociative [] c r = Refl appendAssociative (x::xs) c r = let inductiveHypothesis = appendAssociative xs c r in ?appendAssociativeStepCase@@ -668,7 +769,7 @@ ||| of the input lists. lengthAppend : (left : List a) -> (right : List a) -> length (left ++ right) = length left + length right-lengthAppend [] right = refl+lengthAppend [] right = Refl lengthAppend (x::xs) right = let inductiveHypothesis = lengthAppend xs right in ?lengthAppendStepCase@@ -676,7 +777,7 @@ ||| Mapping a function over a list doesn't change its length. mapPreservesLength : (f : a -> b) -> (l : List a) -> length (map f l) = length l-mapPreservesLength f [] = refl+mapPreservesLength f [] = Refl mapPreservesLength f (x::xs) = let inductiveHypothesis = mapPreservesLength f xs in ?mapPreservesLengthStepCase@@ -685,7 +786,7 @@ ||| to appending them and then mapping the function. mapDistributesOverAppend : (f : a -> b) -> (l : List a) -> (r : List a) -> map f (l ++ r) = map f l ++ map f r-mapDistributesOverAppend f [] r = refl+mapDistributesOverAppend f [] r = Refl mapDistributesOverAppend f (x::xs) r = let inductiveHypothesis = mapDistributesOverAppend f xs r in ?mapDistributesOverAppendStepCase@@ -693,7 +794,7 @@ ||| Mapping two functions is the same as mapping their composition. mapFusion : (f : b -> c) -> (g : a -> b) -> (l : List a) -> map f (map g l) = map (f . g) l-mapFusion f g [] = refl+mapFusion f g [] = Refl mapFusion f g (x::xs) = let inductiveHypothesis = mapFusion f g xs in ?mapFusionStepCase@@ -701,7 +802,7 @@ ||| No list contains an element of the empty list by any predicate. hasAnyByNilFalse : (p : a -> a -> Bool) -> (l : List a) -> hasAnyBy p [] l = False-hasAnyByNilFalse p [] = refl+hasAnyByNilFalse p [] = Refl hasAnyByNilFalse p (x::xs) = let inductiveHypothesis = hasAnyByNilFalse p xs in ?hasAnyByNilFalseStepCase
libs/prelude/Prelude/Maybe.idr view
@@ -45,7 +45,7 @@ toMaybe False j = Nothing justInjective : {x : t} -> {y : t} -> (Just x = Just y) -> x = y-justInjective refl = refl+justInjective Refl = Refl ||| Convert a `Maybe a` value to an `a` value, using `neutral` in the case ||| that the `Maybe` value is `Nothing`.
libs/prelude/Prelude/Nat.idr view
@@ -22,7 +22,7 @@ %name Nat k,j,i,n,m instance Uninhabited (Z = S n) where- uninhabited refl impossible+ uninhabited Refl impossible -------------------------------------------------------------------------------- -- Syntactic tests@@ -94,9 +94,9 @@ ||| @ m the larger number data LTE : (n, m : Nat) -> Type where ||| Zero is the smallest Nat- lteZero : LTE Z right+ LTEZero : LTE Z right ||| If n <= m, then n + 1 <= m + 1- lteSucc : LTE left right -> LTE (S left) (S right)+ LTESucc : LTE left right -> LTE (S left) (S right) ||| Greater than or equal to total GTE : Nat -> Nat -> Type@@ -112,18 +112,18 @@ ||| A successor is never less than or equal zero succNotLTEzero : Not (S m `LTE` Z)-succNotLTEzero lteZero impossible+succNotLTEzero LTEZero impossible ||| If two numbers are ordered, their predecessors are too fromLteSucc : (S m `LTE` S n) -> (m `LTE` n)-fromLteSucc (lteSucc x) = x+fromLteSucc (LTESucc x) = x ||| A decision procedure for `LTE` isLTE : (m, n : Nat) -> Dec (m `LTE` n)-isLTE Z n = Yes lteZero+isLTE Z n = Yes LTEZero isLTE (S k) Z = No succNotLTEzero isLTE (S k) (S j) with (isLTE k j)- isLTE (S k) (S j) | (Yes prf) = Yes (lteSucc prf)+ isLTE (S k) (S j) | (Yes prf) = Yes (LTESucc prf) isLTE (S k) (S j) | (No contra) = No (contra . fromLteSucc) ||| Boolean test than one Nat is less than or equal to another@@ -156,6 +156,14 @@ maximum (S n) Z = S n maximum (S n) (S m) = S (maximum n m) +||| Tail recursive cast Nat to Int+||| Note that this can overflow+toIntNat : Nat -> Int+toIntNat n = toIntNat' n 0 where+ toIntNat' : Nat -> Int -> Int+ toIntNat' Z x = x+ toIntNat' (S n) x = toIntNat' n (x + 1)+ -------------------------------------------------------------------------------- -- Type class instances --------------------------------------------------------------------------------@@ -245,9 +253,7 @@ cast i = fromInteger (cast i) instance Cast Nat Int where- cast Z = 0- cast (S n) = 1 + cast {to=Int} n-+ cast = toIntNat -------------------------------------------------------------------------------- -- Auxilliary notions@@ -329,18 +335,18 @@ -- An informative comparison view -------------------------------------------------------------------------------- data CmpNat : Nat -> Nat -> Type where- cmpLT : (y : _) -> CmpNat x (x + S y)- cmpEQ : CmpNat x x- cmpGT : (x : _) -> CmpNat (y + S x) y+ CmpLT : (y : _) -> CmpNat x (x + S y)+ CmpEQ : CmpNat x x+ CmpGT : (x : _) -> CmpNat (y + S x) y total cmp : (x, y : Nat) -> CmpNat x y-cmp Z Z = cmpEQ-cmp Z (S k) = cmpLT _-cmp (S k) Z = cmpGT _+cmp Z Z = CmpEQ+cmp Z (S k) = CmpLT _+cmp (S k) Z = CmpGT _ cmp (S x) (S y) with (cmp x y)- cmp (S x) (S (x + (S k))) | cmpLT k = cmpLT k- cmp (S x) (S x) | cmpEQ = cmpEQ- cmp (S (y + (S k))) (S y) | cmpGT k = cmpGT k+ cmp (S x) (S (x + (S k))) | CmpLT k = CmpLT k+ cmp (S x) (S x) | CmpEQ = CmpEQ+ cmp (S (y + (S k))) (S y) | CmpGT k = CmpGT k -------------------------------------------------------------------------------- -- Properties@@ -351,26 +357,26 @@ ||| S preserves equality total eqSucc : (left : Nat) -> (right : Nat) -> (p : left = right) -> S left = S right-eqSucc left _ refl = refl+eqSucc left _ Refl = Refl ||| S is injective total succInjective : (left : Nat) -> (right : Nat) -> (p : S left = S right) -> left = right-succInjective left _ refl = refl+succInjective left _ Refl = Refl -- Plus total plusZeroLeftNeutral : (right : Nat) -> 0 + right = right-plusZeroLeftNeutral right = refl+plusZeroLeftNeutral right = Refl total plusZeroRightNeutral : (left : Nat) -> left + 0 = left-plusZeroRightNeutral Z = refl+plusZeroRightNeutral Z = Refl plusZeroRightNeutral (S n) = let inductiveHypothesis = plusZeroRightNeutral n in ?plusZeroRightNeutralStepCase total plusSuccRightSucc : (left : Nat) -> (right : Nat) -> S (left + right) = left + (S right)-plusSuccRightSucc Z right = refl+plusSuccRightSucc Z right = Refl plusSuccRightSucc (S left) right = let inductiveHypothesis = plusSuccRightSucc left right in ?plusSuccRightSuccStepCase@@ -384,21 +390,21 @@ total plusAssociative : (left : Nat) -> (centre : Nat) -> (right : Nat) -> left + (centre + right) = (left + centre) + right-plusAssociative Z centre right = refl+plusAssociative Z centre right = Refl plusAssociative (S left) centre right = let inductiveHypothesis = plusAssociative left centre right in ?plusAssociativeStepCase total plusConstantRight : (left : Nat) -> (right : Nat) -> (c : Nat) -> (p : left = right) -> left + c = right + c-plusConstantRight left _ c refl = refl+plusConstantRight left _ c Refl = Refl total plusConstantLeft : (left : Nat) -> (right : Nat) -> (c : Nat) -> (p : left = right) -> c + left = c + right-plusConstantLeft left _ c refl = refl+plusConstantLeft left _ c Refl = Refl total plusOneSucc : (right : Nat) -> 1 + right = S right-plusOneSucc n = refl+plusOneSucc n = Refl total plusLeftCancel : (left : Nat) -> (right : Nat) -> (right' : Nat) -> (p : left + right = left + right') -> right = right'@@ -423,24 +429,24 @@ -- Mult total multZeroLeftZero : (right : Nat) -> Z * right = Z-multZeroLeftZero right = refl+multZeroLeftZero right = Refl total multZeroRightZero : (left : Nat) -> left * Z = Z-multZeroRightZero Z = refl+multZeroRightZero Z = Refl multZeroRightZero (S left) = let inductiveHypothesis = multZeroRightZero left in ?multZeroRightZeroStepCase total multRightSuccPlus : (left : Nat) -> (right : Nat) -> left * (S right) = left + (left * right)-multRightSuccPlus Z right = refl+multRightSuccPlus Z right = Refl multRightSuccPlus (S left) right = let inductiveHypothesis = multRightSuccPlus left right in ?multRightSuccPlusStepCase total multLeftSuccPlus : (left : Nat) -> (right : Nat) -> (S left) * right = right + (left * right)-multLeftSuccPlus left right = refl+multLeftSuccPlus left right = Refl total multCommutative : (left : Nat) -> (right : Nat) -> left * right = right * left@@ -451,33 +457,33 @@ total multDistributesOverPlusRight : (left : Nat) -> (centre : Nat) -> (right : Nat) -> left * (centre + right) = (left * centre) + (left * right)-multDistributesOverPlusRight Z centre right = refl+multDistributesOverPlusRight Z centre right = Refl multDistributesOverPlusRight (S left) centre right = let inductiveHypothesis = multDistributesOverPlusRight left centre right in ?multDistributesOverPlusRightStepCase total multDistributesOverPlusLeft : (left : Nat) -> (centre : Nat) -> (right : Nat) -> (left + centre) * right = (left * right) + (centre * right)-multDistributesOverPlusLeft Z centre right = refl+multDistributesOverPlusLeft Z centre right = Refl multDistributesOverPlusLeft (S left) centre right = let inductiveHypothesis = multDistributesOverPlusLeft left centre right in ?multDistributesOverPlusLeftStepCase total multAssociative : (left : Nat) -> (centre : Nat) -> (right : Nat) -> left * (centre * right) = (left * centre) * right-multAssociative Z centre right = refl+multAssociative Z centre right = Refl multAssociative (S left) centre right = let inductiveHypothesis = multAssociative left centre right in ?multAssociativeStepCase total multOneLeftNeutral : (right : Nat) -> 1 * right = right-multOneLeftNeutral Z = refl+multOneLeftNeutral Z = Refl multOneLeftNeutral (S right) = let inductiveHypothesis = multOneLeftNeutral right in ?multOneLeftNeutralStepCase total multOneRightNeutral : (left : Nat) -> left * 1 = left-multOneRightNeutral Z = refl+multOneRightNeutral Z = Refl multOneRightNeutral (S left) = let inductiveHypothesis = multOneRightNeutral left in ?multOneRightNeutralStepCase@@ -485,53 +491,53 @@ -- Minus total minusSuccSucc : (left : Nat) -> (right : Nat) -> (S left) - (S right) = left - right-minusSuccSucc left right = refl+minusSuccSucc left right = Refl total minusZeroLeft : (right : Nat) -> 0 - right = Z-minusZeroLeft right = refl+minusZeroLeft right = Refl total minusZeroRight : (left : Nat) -> left - 0 = left-minusZeroRight Z = refl-minusZeroRight (S left) = refl+minusZeroRight Z = Refl+minusZeroRight (S left) = Refl total minusZeroN : (n : Nat) -> Z = n - n-minusZeroN Z = refl+minusZeroN Z = Refl minusZeroN (S n) = minusZeroN n total minusOneSuccN : (n : Nat) -> S Z = (S n) - n-minusOneSuccN Z = refl+minusOneSuccN Z = Refl minusOneSuccN (S n) = minusOneSuccN n total minusSuccOne : (n : Nat) -> S n - 1 = n-minusSuccOne Z = refl-minusSuccOne (S n) = refl+minusSuccOne Z = Refl+minusSuccOne (S n) = Refl total minusPlusZero : (n : Nat) -> (m : Nat) -> n - (n + m) = Z-minusPlusZero Z m = refl+minusPlusZero Z m = Refl minusPlusZero (S n) m = minusPlusZero n m total minusMinusMinusPlus : (left : Nat) -> (centre : Nat) -> (right : Nat) -> left - centre - right = left - (centre + right)-minusMinusMinusPlus Z Z right = refl-minusMinusMinusPlus (S left) Z right = refl-minusMinusMinusPlus Z (S centre) right = refl+minusMinusMinusPlus Z Z right = Refl+minusMinusMinusPlus (S left) Z right = Refl+minusMinusMinusPlus Z (S centre) right = Refl minusMinusMinusPlus (S left) (S centre) right = let inductiveHypothesis = minusMinusMinusPlus left centre right in ?minusMinusMinusPlusStepCase total plusMinusLeftCancel : (left : Nat) -> (right : Nat) -> (right' : Nat) -> (left + right) - (left + right') = right - right'-plusMinusLeftCancel Z right right' = refl+plusMinusLeftCancel Z right right' = Refl plusMinusLeftCancel (S left) right right' = let inductiveHypothesis = plusMinusLeftCancel left right right' in ?plusMinusLeftCancelStepCase total multDistributesOverMinusLeft : (left : Nat) -> (centre : Nat) -> (right : Nat) -> (left - centre) * right = (left * right) - (centre * right)-multDistributesOverMinusLeft Z Z right = refl+multDistributesOverMinusLeft Z Z right = Refl multDistributesOverMinusLeft (S left) Z right = ?multDistributesOverMinusLeftBaseCase-multDistributesOverMinusLeft Z (S centre) right = refl+multDistributesOverMinusLeft Z (S centre) right = Refl multDistributesOverMinusLeft (S left) (S centre) right = let inductiveHypothesis = multDistributesOverMinusLeft left centre right in ?multDistributesOverMinusLeftStepCase@@ -544,7 +550,7 @@ -- Power total powerSuccPowerLeft : (base : Nat) -> (exp : Nat) -> power base (S exp) = base * (power base exp)-powerSuccPowerLeft base exp = refl+powerSuccPowerLeft base exp = Refl total multPowerPowerPlus : (base : Nat) -> (exp : Nat) -> (exp' : Nat) -> (power base exp) * (power base exp') = power base (exp + exp')@@ -554,22 +560,22 @@ ?multPowerPowerPlusStepCase total powerZeroOne : (base : Nat) -> power base 0 = S Z-powerZeroOne base = refl+powerZeroOne base = Refl total powerOneNeutral : (base : Nat) -> power base 1 = base-powerOneNeutral Z = refl+powerOneNeutral Z = Refl powerOneNeutral (S base) = let inductiveHypothesis = powerOneNeutral base in ?powerOneNeutralStepCase total powerOneSuccOne : (exp : Nat) -> power 1 exp = S Z-powerOneSuccOne Z = refl+powerOneSuccOne Z = Refl powerOneSuccOne (S exp) = let inductiveHypothesis = powerOneSuccOne exp in ?powerOneSuccOneStepCase total powerSuccSuccMult : (base : Nat) -> power base 2 = mult base base-powerSuccSuccMult Z = refl+powerSuccSuccMult Z = Refl powerSuccSuccMult (S base) = let inductiveHypothesis = powerSuccSuccMult base in ?powerSuccSuccMultStepCase@@ -583,11 +589,11 @@ -- Pred total predSucc : (n : Nat) -> pred (S n) = n-predSucc n = refl+predSucc n = Refl total minusSuccPred : (left : Nat) -> (right : Nat) -> left - (S right) = pred (left - right)-minusSuccPred Z right = refl+minusSuccPred Z right = Refl minusSuccPred (S left) Z = let inductiveHypothesis = minusSuccPred left Z in ?minusSuccPredStepCase@@ -598,125 +604,125 @@ -- boolElim total boolElimSuccSucc : (cond : Bool) -> (t : Nat) -> (f : Nat) -> S (boolElim cond t f) = boolElim cond (S t) (S f)-boolElimSuccSucc True t f = refl-boolElimSuccSucc False t f = refl+boolElimSuccSucc True t f = Refl+boolElimSuccSucc False t f = Refl total boolElimPlusPlusLeft : (cond : Bool) -> (left : Nat) -> (t : Nat) -> (f : Nat) -> left + (boolElim cond t f) = boolElim cond (left + t) (left + f)-boolElimPlusPlusLeft True left t f = refl-boolElimPlusPlusLeft False left t f = refl+boolElimPlusPlusLeft True left t f = Refl+boolElimPlusPlusLeft False left t f = Refl total boolElimPlusPlusRight : (cond : Bool) -> (right : Nat) -> (t : Nat) -> (f : Nat) -> (boolElim cond t f) + right = boolElim cond (t + right) (f + right)-boolElimPlusPlusRight True right t f = refl-boolElimPlusPlusRight False right t f = refl+boolElimPlusPlusRight True right t f = Refl+boolElimPlusPlusRight False right t f = Refl total boolElimMultMultLeft : (cond : Bool) -> (left : Nat) -> (t : Nat) -> (f : Nat) -> left * (boolElim cond t f) = boolElim cond (left * t) (left * f)-boolElimMultMultLeft True left t f = refl-boolElimMultMultLeft False left t f = refl+boolElimMultMultLeft True left t f = Refl+boolElimMultMultLeft False left t f = Refl total boolElimMultMultRight : (cond : Bool) -> (right : Nat) -> (t : Nat) -> (f : Nat) -> (boolElim cond t f) * right = boolElim cond (t * right) (f * right)-boolElimMultMultRight True right t f = refl-boolElimMultMultRight False right t f = refl+boolElimMultMultRight True right t f = Refl+boolElimMultMultRight False right t f = Refl -- Orders total lteNTrue : (n : Nat) -> lte n n = True-lteNTrue Z = refl+lteNTrue Z = Refl lteNTrue (S n) = lteNTrue n -total lteSuccZeroFalse : (n : Nat) -> lte (S n) Z = False-lteSuccZeroFalse Z = refl-lteSuccZeroFalse (S n) = refl+total LTESuccZeroFalse : (n : Nat) -> lte (S n) Z = False+LTESuccZeroFalse Z = Refl+LTESuccZeroFalse (S n) = Refl -- Minimum and maximum total maximumAssociative : (l,c,r : Nat) -> maximum l (maximum c r) = maximum (maximum l c) r-maximumAssociative Z c r = refl-maximumAssociative (S k) Z r = refl-maximumAssociative (S k) (S j) Z = refl-maximumAssociative (S k) (S j) (S i) = rewrite maximumAssociative k j i in refl+maximumAssociative Z c r = Refl+maximumAssociative (S k) Z r = Refl+maximumAssociative (S k) (S j) Z = Refl+maximumAssociative (S k) (S j) (S i) = rewrite maximumAssociative k j i in Refl total maximumCommutative : (l, r : Nat) -> maximum l r = maximum r l-maximumCommutative Z Z = refl-maximumCommutative Z (S k) = refl-maximumCommutative (S k) Z = refl-maximumCommutative (S k) (S j) = rewrite maximumCommutative k j in refl+maximumCommutative Z Z = Refl+maximumCommutative Z (S k) = Refl+maximumCommutative (S k) Z = Refl+maximumCommutative (S k) (S j) = rewrite maximumCommutative k j in Refl total maximumIdempotent : (n : Nat) -> maximum n n = n-maximumIdempotent Z = refl+maximumIdempotent Z = Refl maximumIdempotent (S k) = cong (maximumIdempotent k) total minimumAssociative : (l,c,r : Nat) -> minimum l (minimum c r) = minimum (minimum l c) r-minimumAssociative Z c r = refl-minimumAssociative (S k) Z r = refl-minimumAssociative (S k) (S j) Z = refl-minimumAssociative (S k) (S j) (S i) = rewrite minimumAssociative k j i in refl+minimumAssociative Z c r = Refl+minimumAssociative (S k) Z r = Refl+minimumAssociative (S k) (S j) Z = Refl+minimumAssociative (S k) (S j) (S i) = rewrite minimumAssociative k j i in Refl total minimumCommutative : (l, r : Nat) -> minimum l r = minimum r l-minimumCommutative Z Z = refl-minimumCommutative Z (S k) = refl-minimumCommutative (S k) Z = refl-minimumCommutative (S k) (S j) = rewrite minimumCommutative k j in refl+minimumCommutative Z Z = Refl+minimumCommutative Z (S k) = Refl+minimumCommutative (S k) Z = Refl+minimumCommutative (S k) (S j) = rewrite minimumCommutative k j in Refl total minimumIdempotent : (n : Nat) -> minimum n n = n-minimumIdempotent Z = refl+minimumIdempotent Z = Refl minimumIdempotent (S k) = cong (minimumIdempotent k) total minimumZeroZeroRight : (right : Nat) -> minimum 0 right = Z-minimumZeroZeroRight Z = refl+minimumZeroZeroRight Z = Refl minimumZeroZeroRight (S right) = minimumZeroZeroRight right total minimumZeroZeroLeft : (left : Nat) -> minimum left 0 = Z-minimumZeroZeroLeft Z = refl-minimumZeroZeroLeft (S left) = refl+minimumZeroZeroLeft Z = Refl+minimumZeroZeroLeft (S left) = Refl total minimumSuccSucc : (left : Nat) -> (right : Nat) -> minimum (S left) (S right) = S (minimum left right)-minimumSuccSucc Z Z = refl-minimumSuccSucc (S left) Z = refl-minimumSuccSucc Z (S right) = refl+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 total maximumZeroNRight : (right : Nat) -> maximum Z right = right-maximumZeroNRight Z = refl-maximumZeroNRight (S right) = refl+maximumZeroNRight Z = Refl+maximumZeroNRight (S right) = Refl total maximumZeroNLeft : (left : Nat) -> maximum left Z = left-maximumZeroNLeft Z = refl-maximumZeroNLeft (S left) = refl+maximumZeroNLeft Z = Refl+maximumZeroNLeft (S left) = Refl total maximumSuccSucc : (left : Nat) -> (right : Nat) -> S (maximum left right) = maximum (S left) (S right)-maximumSuccSucc Z Z = refl-maximumSuccSucc (S left) Z = refl-maximumSuccSucc Z (S right) = refl+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 total sucMaxL : (l : Nat) -> maximum (S l) l = (S l)-sucMaxL Z = refl+sucMaxL Z = Refl sucMaxL (S l) = cong (sucMaxL l) total sucMaxR : (l : Nat) -> maximum l (S l) = (S l)-sucMaxR Z = refl+sucMaxR Z = Refl sucMaxR (S l) = cong (sucMaxR l) total sucMinL : (l : Nat) -> minimum (S l) l = l-sucMinL Z = refl+sucMinL Z = Refl sucMinL (S l) = cong (sucMinL l) total sucMinR : (l : Nat) -> minimum l (S l) = l-sucMinR Z = refl+sucMinR Z = Refl sucMinR (S l) = cong (sucMinR l) -- div and mod total modZeroZero : (n : Nat) -> mod 0 n = Z-modZeroZero Z = refl-modZeroZero (S n) = refl+modZeroZero Z = Refl+modZeroZero (S n) = Refl -------------------------------------------------------------------------------- -- Proofs
libs/prelude/Prelude/Pairs.idr view
@@ -9,27 +9,27 @@ ||| Dependent pair where the first field is erased. data Exists : (P : a -> Type) -> Type where- evidence : .(x : a) -> (pf : P x) -> Exists P+ Evidence : .(x : a) -> (pf : P x) -> Exists P ||| Dependent pair where the second field is erased. data Subset : (a : Type) -> (P : a -> Type) -> Type where- element : (x : a) -> .(pf : P x) -> Subset a P+ Element : (x : a) -> .(pf : P x) -> Subset a P -- Monomorphic projections namespace Exists getWitness : Exists {a} P -> a- getWitness (evidence x pf) = x+ getWitness (Evidence x pf) = x getProof : (x : Exists {a} P) -> P (getWitness x)- getProof (evidence x pf) = pf+ getProof (Evidence x pf) = pf namespace Subset getWitness : Subset a P -> a- getWitness (element x pf) = x+ getWitness (Element x pf) = x getProof : (x : Subset a P) -> P (getWitness x)- getProof (element x pf) = pf+ getProof (Element x pf) = pf namespace Sigma getWitness : Sigma a P -> a
libs/prelude/Prelude/Stream.idr view
@@ -57,13 +57,25 @@ zipWith : (a -> b -> c) -> Stream a -> Stream b -> Stream c zipWith f (x::xs) (y::ys) = f x y :: zipWith f xs ys +||| Combine three streams by applying a function element-wise along them+zipWith3 : (a -> b -> c -> d) -> Stream a -> Stream b -> Stream c -> Stream d+zipWith3 f (x::xs) (y::ys) (z::zs) = f x y z :: zipWith3 f xs ys zs+ ||| Create a stream of pairs from two streams zip : Stream a -> Stream b -> Stream (a, b) zip = zipWith (\x,y => (x,y)) +||| Combine three streams into a stream of tuples elementwise+zip3 : Stream a -> Stream b -> Stream c -> Stream (a, b, c)+zip3 = zipWith3 (\x,y,z => (x,y,z))+ ||| Create a pair of streams from a stream of pairs unzip : Stream (a, b) -> (Stream a, Stream b) unzip xs = (map fst xs, map snd xs)++||| Split a stream of three-element tuples into three streams+unzip3 : Stream (a, b, c) -> (Stream a, Stream b, Stream c)+unzip3 xs = (map (\(x,_,_) => x) xs, map (\(_,x,_) => x) xs, map (\(_,_,x) => x) xs) ||| Return the diagonal elements of a stream of streams diag : Stream (Stream a) -> Stream a
libs/prelude/Prelude/Strings.idr view
@@ -74,11 +74,11 @@ StrCons : (x : Char) -> (xs : String) -> StrM (strCons x xs) ||| Version of 'strHead' that statically verifies that the string is not empty.-strHead' : (x : String) -> so (not (x == "")) -> Char+strHead' : (x : String) -> So (not (x == "")) -> Char strHead' x p = assert_total $ prim__strHead x ||| Version of 'strTail' that statically verifies that the string is not empty.-strTail' : (x : String) -> so (not (x == "")) -> String+strTail' : (x : String) -> So (not (x == "")) -> String strTail' x p = assert_total $ prim__strTail x -- we need the 'believe_me' because the operations are primitives
libs/prelude/Prelude/Uninhabited.idr view
@@ -6,9 +6,9 @@ class Uninhabited t where ||| If I have a t, I've had a contradiction ||| @ t the uninhabited type- total uninhabited : t -> _|_+ total uninhabited : t -> Void -instance Uninhabited _|_ where+instance Uninhabited Void where uninhabited a = a ||| Use an absurd assumption to discharge a proof obligation@@ -16,4 +16,4 @@ ||| @ a the goal type ||| @ h the contradictory hypothesis absurd : Uninhabited t => (h : t) -> a-absurd h = FalseElim (uninhabited h)+absurd h = void (uninhabited h)
libs/prelude/Prelude/Vect.idr view
@@ -37,8 +37,8 @@ ||| Show that the length function on vectors in fact calculates the length private lengthCorrect : (n : Nat) -> (xs : Vect n a) -> length xs = n-lengthCorrect Z [] = refl-lengthCorrect (S n) (x :: xs) = rewrite lengthCorrect n xs in refl+lengthCorrect Z [] = Refl+lengthCorrect (S n) (x :: xs) = rewrite lengthCorrect n xs in Refl -------------------------------------------------------------------------------- -- Indexing into vectors@@ -64,35 +64,36 @@ ||| Extract a particular element from a vector index : Fin n -> Vect n a -> a-index fZ (x::xs) = x-index (fS k) (x::xs) = index k xs-index fZ [] impossible+index FZ (x::xs) = x+index (FS k) (x::xs) = index k xs+index FZ [] impossible + ||| Insert an element at a particular index insertAt : Fin (S n) -> a -> Vect n a -> Vect (S n) a-insertAt fZ y xs = y :: xs-insertAt (fS k) y (x::xs) = x :: insertAt k y xs-insertAt (fS k) y [] = absurd k+insertAt FZ y xs = y :: xs+insertAt (FS k) y (x::xs) = x :: insertAt k y xs+insertAt (FS k) y [] = absurd k ||| Construct a new vector consisting of all but the indicated element deleteAt : Fin (S n) -> Vect (S n) a -> Vect n a-deleteAt fZ (x::xs) = xs-deleteAt {n = S m} (fS k) (x::xs) = x :: deleteAt k xs-deleteAt {n = Z} (fS k) (x::xs) = absurd k-deleteAt _ [] impossible+deleteAt FZ (x::xs) = xs+deleteAt {n = S m} (FS k) (x::xs) = x :: deleteAt k xs+deleteAt {n = Z} (FS k) (x::xs) = absurd k+deleteAt _ [] impossible ||| Replace an element at a particlar index with another replaceAt : Fin n -> t -> Vect n t -> Vect n t-replaceAt fZ y (x::xs) = y :: xs-replaceAt (fS k) y (x::xs) = x :: replaceAt k y xs+replaceAt FZ y (x::xs) = y :: xs+replaceAt (FS k) y (x::xs) = x :: replaceAt k y xs ||| Replace the element at a particular index with the result of applying a function to it ||| @ i the index to replace at ||| @ f the update function ||| @ xs the vector to replace in updateAt : (i : Fin n) -> (f : t -> t) -> (xs : Vect n t) -> Vect n t-updateAt fZ f (x::xs) = f x :: xs-updateAt (fS k) f (x::xs) = x :: updateAt k f xs+updateAt FZ f (x::xs) = f x :: xs+updateAt (FS k) f (x::xs) = x :: updateAt k f xs -------------------------------------------------------------------------------- -- Subvectors@@ -101,32 +102,51 @@ ||| Get the first m elements of a Vect ||| @ m the number of elements to take take : (n : Nat) -> Vect (n + m) a -> Vect n a-take Z xs = []+take Z xs = [] take (S k) (x :: xs) = x :: take k xs ||| Remove the first m elements of a Vect ||| @ m the number of elements to remove drop : (n : Nat) -> Vect (n + m) a -> Vect m a-drop Z xs = xs+drop Z xs = xs drop (S k) (x :: xs) = drop k xs +||| Take the longest prefix of a Vect such that all elements satisfy some+||| Boolean predicate.+|||+||| @ p the predicate+takeWhile : (p : a -> Bool) -> Vect n a -> (q ** Vect q a)+takeWhile p [] = (_ ** [])+takeWhile p (x::xs) =+ let (len ** ys) = takeWhile p xs+ in if p x then+ (S len ** x :: ys)+ else+ (_ ** [])++||| Remove the longest prefix of a Vect such that all removed elements satisfy some+||| Boolean predicate.+|||+||| @ p the predicate+dropWhile : (p : a -> Bool) -> Vect n a -> (q ** Vect q a)+dropWhile p [] = (_ ** [])+dropWhile p (x::xs) =+ if p x then+ dropWhile p xs+ else+ (_ ** x::xs)+ -------------------------------------------------------------------------------- -- Transformations -------------------------------------------------------------------------------- ||| Reverse the order of the elements of a vector-total reverse : {n : Nat} -> Vect n a -> Vect n a-reverse {n} xs = reverse' [] (plusZeroRightNeutral n) xs- where- total reverse' : {m, j, l : Nat} ->- Vect m a -> (j + m = l) -> Vect j a -> Vect l a- reverse' {m} {j = Z } {l} acc prf [] ?= acc- reverse' {m} {j = S k} {l} acc prf (x::xs) =- let prf1 : (m + (S k) = l) = rewrite plusCommutative m (S k) in prf in- let prf2 : (S (m + k) = l) = rewrite plusSuccRightSucc m k in prf1 in- let prf3 : (S (k + m) = l) = rewrite plusCommutative k m in prf2 in- let prf4 : (k + (S m) = l) = rewrite sym $ plusSuccRightSucc k m in prf3 in- reverse' (x::acc) prf4 xs+reverse : Vect n a -> Vect n a+reverse xs = go [] xs+ where go : Vect n a -> Vect m a -> Vect (n+m) a+ go {n} acc [] = rewrite plusZeroRightNeutral n in acc+ go {n} {m=S m} acc (x :: xs) = rewrite sym $ plusSuccRightSucc n m+ in go (x::acc) xs ||| Alternate an element between the other elements of a vector ||| @ sep the element to intersperse@@ -136,8 +156,9 @@ intersperse sep (x::xs) = x :: intersperse' sep xs where intersperse' : a -> Vect n a -> Vect (n + n) a- intersperse' sep [] = []- intersperse' sep (x::xs) ?= sep :: x :: intersperse' sep xs+ intersperse' sep [] = []+ intersperse' {n=S n} sep (x::xs) = rewrite sym $ plusSuccRightSucc n n+ in sep :: x :: intersperse' sep xs -------------------------------------------------------------------------------- -- Conversion from list (toList is provided by Foldable)@@ -147,7 +168,7 @@ fromList' : Vect n a -> (l : List a) -> Vect (length l + n) a fromList' ys [] = ys fromList' {n} ys (x::xs) =- rewrite (plusSuccRightSucc (length xs) n) ==> + rewrite (plusSuccRightSucc (length xs) n) ==> Vect (plus (length xs) (S n)) a in fromList' (x::ys) xs @@ -184,16 +205,31 @@ zipWith f [] [] = [] zipWith f (x::xs) (y::ys) = f x y :: zipWith f xs ys +||| Combine three equal-length vectors into a vector with some function+zipWith3 : (a -> b -> c -> d) -> Vect n a -> Vect n b -> Vect n c -> Vect n d+zipWith3 f [] [] [] = []+zipWith3 f (x::xs) (y::ys) (z::zs) = f x y z :: zipWith3 f xs ys zs+ ||| Combine two equal-length vectors pairwise zip : Vect n a -> Vect n b -> Vect n (a, b)-zip = zipWith (\x => \y => (x,y))+zip = zipWith (\x,y => (x,y)) +||| Combine three equal-length vectors elementwise into a vector of tuples+zip3 : Vect n a -> Vect n b -> Vect n c -> Vect n (a, b, c)+zip3 = zipWith3 (\x,y,z => (x,y,z))+ ||| Convert a vector of pairs to a pair of vectors unzip : Vect n (a, b) -> (Vect n a, Vect n b) unzip [] = ([], []) unzip ((l, r)::xs) with (unzip xs) | (lefts, rights) = (l::lefts, r::rights) +||| Convert a vector of three-tuples to a triplet of vectors+unzip3 : Vect n (a, b, c) -> (Vect n a, Vect n b, Vect n c)+unzip3 [] = ([], [], [])+unzip3 ((l,c,r)::xs) with (unzip3 xs)+ | (lefts, centers, rights) = (l::lefts, c::centers, r::rights)+ -------------------------------------------------------------------------------- -- Equality --------------------------------------------------------------------------------@@ -212,7 +248,7 @@ -------------------------------------------------------------------------------- instance Ord a => Ord (Vect n a) where- compare [] [] = EQ+ compare [] [] = EQ compare (x::xs) (y::ys) = if x /= y then compare x y@@ -228,16 +264,25 @@ map f [] = [] map f (x::xs) = f x :: map f xs --- XXX: causes Idris to enter an infinite loop when type checking in the REPL---mapMaybe : (a -> Maybe b) -> Vect n a -> (p ** Vect b p)---mapMaybe f [] = (_ ** [])---mapMaybe f (x::xs) = mapMaybe' (f x)--- XXX: working around the type restrictions on case statements--- where--- mapMaybe' : (Maybe b) -> (n ** Vect b n) -> (p ** Vect b p)--- mapMaybe' Nothing (n ** tail) = (n ** tail)--- mapMaybe' (Just j) (n ** tail) = (S n ** j::tail) +||| Map a partial function across a vector, returning those elements for which+||| the function had a value.+|||+||| The first projection of the resulting pair (ie the length) will always be+||| at most the length of the input vector. This is not, however, guaranteed+||| by the type.+|||+||| @ f the partial function (expressed by returning `Maybe`)+||| @ xs the vector to check for results+mapMaybe : (f : a -> Maybe b) -> (xs : Vect n a) -> (m : Nat ** Vect m b)+mapMaybe f [] = (_ ** [])+mapMaybe f (x::xs) =+ let (len ** ys) = mapMaybe f xs+ in case f x of+ Just y => (S len ** y :: ys)+ Nothing => ( len ** ys)++ -------------------------------------------------------------------------------- -- Folds --------------------------------------------------------------------------------@@ -396,6 +441,15 @@ nub : Eq a => Vect n a -> (p ** Vect p a) nub = nubBy (==) +deleteBy : (a -> a -> Bool) -> a -> Vect n a -> (p ** Vect p a)+deleteBy _ _ [] = (_ ** [])+deleteBy eq x (y::ys) =+ let (len ** zs) = deleteBy eq x ys+ in if x `eq` y then (_ ** ys) else (S len ** y ::zs)++delete : (Eq a) => a -> Vect n a -> (p ** Vect p a)+delete = deleteBy (==)+ -------------------------------------------------------------------------------- -- Splitting and breaking lists --------------------------------------------------------------------------------@@ -408,6 +462,15 @@ splitAt : (n : Nat) -> (xs : Vect (n + m) a) -> (Vect n a, Vect m a) splitAt n xs = (take n xs, drop n xs) +partition : (a -> Bool) -> Vect n a -> ((p ** Vect p a), (q ** Vect q a))+partition p [] = ((_ ** []), (_ ** []))+partition p (x::xs) =+ let ((leftLen ** lefts), (rightLen ** rights)) = partition p xs in+ if p x then+ ((S leftLen ** x::lefts), (rightLen ** rights))+ else+ ((leftLen ** lefts), (S rightLen ** x::rights))+ -------------------------------------------------------------------------------- -- Predicates --------------------------------------------------------------------------------@@ -451,18 +514,18 @@ | (_ ** tail) = (_ ** j::tail) diag : Vect n (Vect n a) -> Vect n a-diag [] = []+diag [] = [] diag ((x::xs)::xss) = x :: diag (map tail xss) range : Vect n (Fin n)-range {n=Z} = []-range {n=S _} = fZ :: map fS range+range {n=Z} = []+range {n=S _} = FZ :: map FS range ||| Transpose a Vect of Vects, turning rows into columns and vice versa. ||| ||| As the types ensure rectangularity, this is an involution, unlike `Prelude.List.transpose`. transpose : Vect m (Vect n a) -> Vect n (Vect m a)-transpose [] = replicate _ []+transpose [] = replicate _ [] transpose (x :: xs) = zipWith (::) x (transpose xs) --------------------------------------------------------------------------------@@ -470,32 +533,16 @@ -------------------------------------------------------------------------------- vectConsCong : (x : a) -> (xs : Vect n a) -> (ys : Vect m a) -> (xs = ys) -> (x :: xs = x :: ys)-vectConsCong x xs xs refl = refl+vectConsCong x xs xs Refl = Refl vectNilRightNeutral : (xs : Vect n a) -> xs ++ [] = xs-vectNilRightNeutral [] = refl+vectNilRightNeutral [] = Refl vectNilRightNeutral (x :: xs) = vectConsCong _ _ _ (vectNilRightNeutral xs) vectAppendAssociative : (x : Vect xLen a) -> (y : Vect yLen a) -> (z : Vect zLen a) -> x ++ (y ++ z) = (x ++ y) ++ z-vectAppendAssociative [] y z = refl+vectAppendAssociative [] y z = Refl vectAppendAssociative (x :: xs) ys zs = vectConsCong _ _ _ (vectAppendAssociative xs ys zs) ------------------------------------------------------------------------------------ Proofs-----------------------------------------------------------------------------------Prelude.Vect.reverse'_lemma_1 = proof {- intros;- rewrite prf;- rewrite sym (plusZeroRightNeutral m);- exact value;-}--Prelude.Vect.intersperse'_lemma_1 = proof {- intros;- rewrite (plusSuccRightSucc n1 n1);- trivial;-}
− llvm/Makefile
@@ -1,25 +0,0 @@-include ../config.mk--PKG_CONFIG_CFLAGS:=$(shell (pkg-config --version >/dev/null 2>&1) && pkg-config --cflags bdw-gc)-CFLAGS:=-Wextra -fPIC -Wno-unused-parameter $(PKG_CONFIG_CFLAGS) $(CFLAGS)-SOURCES=defs.c-OBJECTS=$(SOURCES:.c=.o)-LIB=libidris_rts.a--build: $(SOURCES) $(LIB)--$(LIB): $(OBJECTS)- ar r $@ $(OBJECTS)- ranlib $@--.c.o:- $(CC) -c $(CFLAGS) $< -o $@--install: $(LIB)- mkdir -p $(TARGET)- install $(LIB) $(TARGET)--clean:- rm -f $(OBJECTS) $(LIB)--.PHONY: build install clean
− llvm/defs.c
@@ -1,182 +0,0 @@-#include <stdlib.h>-#include <stdio.h>-#include <gmp.h>-#include <gc.h>-#include <string.h>-#include <inttypes.h>--extern char** environ;--void putStr(const char *str) {- fputs(str, stdout);-}--void putErr(const char *str) {- fputs(str, stderr);-}--void mpz_init_set_ull(mpz_t n, unsigned long long ull)-{- mpz_init_set_ui(n, (unsigned int)(ull >> 32)); /* n = (unsigned int)(ull >> 32) */- mpz_mul_2exp(n, n, 32); /* n <<= 32 */- mpz_add_ui(n, n, (unsigned int)ull); /* n += (unsigned int)ull */-}--void mpz_init_set_sll(mpz_t n, long long sll)-{- mpz_init_set_si(n, (int)(sll >> 32)); /* n = (int)sll >> 32 */- mpz_mul_2exp(n, n, 32 ); /* n <<= 32 */- mpz_add_ui(n, n, (unsigned int)sll); /* n += (unsigned int)sll */-}--void mpz_set_sll(mpz_t n, long long sll)-{- mpz_set_si(n, (int)(sll >> 32)); /* n = (int)sll >> 32 */- mpz_mul_2exp(n, n, 32 ); /* n <<= 32 */- mpz_add_ui(n, n, (unsigned int)sll); /* n += (unsigned int)sll */-}--unsigned long long mpz_get_ull(mpz_t n)-{- unsigned int lo, hi;- mpz_t tmp;-- mpz_init( tmp );- mpz_mod_2exp( tmp, n, 64 ); /* tmp = (lower 64 bits of n) */-- lo = mpz_get_ui( tmp ); /* lo = tmp & 0xffffffff */ - mpz_div_2exp( tmp, tmp, 32 ); /* tmp >>= 32 */- hi = mpz_get_ui( tmp ); /* hi = tmp & 0xffffffff */-- mpz_clear( tmp );-- return (((unsigned long long)hi) << 32) + lo;-}--char *__idris_strCons(char c, char *s) {- size_t len = strlen(s);- char *result = GC_malloc_atomic(len+2);- result[0] = c;- memcpy(result+1, s, len);- result[len+1] = 0;- return result;-}--#define BUFSIZE 256-char *__idris_readStr(FILE* h) {-// Modified from 'safe-fgets.c' in the gdb distribution.-// (see http://www.gnu.org/software/gdb/current/)- char *line_ptr;- char* line_buf = (char *) GC_malloc (BUFSIZE);- int line_buf_size = BUFSIZE;-- /* points to last byte */- line_ptr = line_buf + line_buf_size - 1;-- /* so we can see if fgets put a 0 there */- *line_ptr = 1;- if (fgets (line_buf, line_buf_size, h) == 0)- return "";-- /* we filled the buffer? */- while (line_ptr[0] == 0 && line_ptr[-1] != '\n')- {- /* Make the buffer bigger and read more of the line */- line_buf_size += BUFSIZE;- line_buf = (char *) GC_realloc (line_buf, line_buf_size);-- /* points to last byte again */- line_ptr = line_buf + line_buf_size - 1;- /* so we can see if fgets put a 0 there */- *line_ptr = 1;-- if (fgets (line_buf + line_buf_size - BUFSIZE - 1, BUFSIZE + 1, h) == 0)- return "";- }-- return line_buf;-}--void* fileOpen(char* name, char* mode) {- FILE* f = fopen(name, mode);- return (void*)f;-}--void fileClose(void* h) {- FILE* f = (FILE*)h;- fclose(f);-}--int fileEOF(void* h) {- FILE* f = (FILE*)h;- return feof(f);-}--int fileError(void* h) {- FILE* f = (FILE*)h;- return ferror(f);-}--void fputStr(void* h, char* str) {- FILE* f = (FILE*)h;- fputs(str, f);-}--int isNull(void* ptr) {- return ptr==NULL;-}--char* getEnvPair(int i) {- return *(environ + i);-}--void idris_memset(void* ptr, size_t offset, uint8_t c, size_t size) {- memset(((uint8_t*)ptr) + offset, c, size);-}--uint8_t idris_peek(void* ptr, size_t offset) {- return *(((uint8_t*)ptr) + offset);-}--void idris_poke(void* ptr, size_t offset, uint8_t data) {- *(((uint8_t*)ptr) + offset) = data;-}--void idris_memmove(void* dest, void* src, size_t dest_offset, size_t src_offset, size_t size) {- memmove(dest + dest_offset, src + src_offset, size);-}--void *__idris_gmpMalloc(size_t size) {- return GC_malloc(size);-}--void *__idris_gmpRealloc(void *ptr, size_t oldSize, size_t size) {- return GC_realloc(ptr, size);-}--void __idris_gmpFree(void *ptr, size_t oldSize) {- GC_free(ptr);-}--char *__idris_strRev(const char *s) {- int x = strlen(s);- int y = 0;- char *t = GC_malloc(x+1);-- t[x] = '\0';- while(x>0) {- t[y++] = s[--x];- }- return t;-}--int __idris_argc;-char **__idris_argv;--int idris_numArgs() {- return __idris_argc;-}--const char* idris_getArg(int i) {- return __idris_argv[i];-}
main/Main.hs view
@@ -42,13 +42,16 @@ runMain (runIdris opts) runIdris :: [Opt] -> Idris ()-runIdris [Client c] = do setVerbose False- setQuiet True- runIO $ runClient c runIdris opts = do when (ShowIncs `elem` opts) $ runIO showIncs when (ShowLibs `elem` opts) $ runIO showLibs when (ShowLibdir `elem` opts) $ runIO showLibdir+ case opt getClient opts of+ [] -> return ()+ (c:_) -> do setVerbose False+ setQuiet True+ runIO $ runClient (getPort opts) c+ runIO $ exitWith ExitSuccess case opt getPkgCheck opts of [] -> return () fs -> do runIO $ mapM_ (checkPkg (WarnOnly `elem` opts) True) fs
+ rts/arduino/idris_main.c view
@@ -0,0 +1,29 @@+#include "idris_opts.h"+#include "idris_stats.h"+#include "idris_rts.h"+#include "Arduino.h"++// The default options should give satisfactory results under many circumstances.+RTSOpts opts = {+ .init_heap_size = 128,+ .max_stack_size = 128,+ .show_summary = 0+};++// no argv or argc+int main() {+ init(); // arduino init function++ VM* vm = init_vm(opts.max_stack_size, opts.init_heap_size, 1);+ _idris__123_runMain0_125_(vm, NULL);++#ifdef IDRIS_DEBUG+ if (opts.show_summary) {+ idris_gcInfo(vm, 1);+ }+#endif++ Stats stats = terminate(vm);++ return 0;+}
rts/idris_bitstring.c view
@@ -1,58 +1,66 @@ #include "idris_rts.h" VAL idris_b8CopyForGC(VM *vm, VAL a) {+ uint8_t A = a->info.bits8; VAL cl = allocate(vm, sizeof(Closure), 1); SETTY(cl, BITS8);- cl->info.bits8 = a->info.bits8;+ cl->info.bits8 = A; return cl; } VAL idris_b16CopyForGC(VM *vm, VAL a) {+ uint16_t A = a->info.bits16; VAL cl = allocate(vm, sizeof(Closure), 1); SETTY(cl, BITS16);- cl->info.bits16 = a->info.bits16;+ cl->info.bits16 = A; return cl; } VAL idris_b32CopyForGC(VM *vm, VAL a) {+ uint32_t A = a->info.bits32; VAL cl = allocate(vm, sizeof(Closure), 1); SETTY(cl, BITS32);- cl->info.bits32 = a->info.bits32;+ cl->info.bits32 = A; return cl; } VAL idris_b64CopyForGC(VM *vm, VAL a) {+ uint64_t A = a->info.bits64; VAL cl = allocate(vm, sizeof(Closure), 1); SETTY(cl, BITS64);- cl->info.bits64 = a->info.bits64;+ cl->info.bits64 = A; return cl; } VAL idris_b8(VM *vm, VAL a) {+ uint8_t A = GETINT(a); VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS8);- cl->info.bits8 = (uint8_t) GETINT(a);+ cl->info.bits8 = (uint8_t) A; return cl; } VAL idris_b16(VM *vm, VAL a) {+ uint16_t A = GETINT(a); VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS16);- cl->info.bits16 = (uint16_t) GETINT(a);+ cl->info.bits16 = (uint16_t) A; return cl; } VAL idris_b32(VM *vm, VAL a) {+ uint32_t A = GETINT(a); VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS32);- cl->info.bits32 = (uint32_t) GETINT(a);+ cl->info.bits32 = (uint32_t) A; return cl; } VAL idris_b64(VM *vm, VAL a) {+ uint64_t A = GETINT(a); VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS64);- cl->info.bits64 = (uint64_t) GETINT(a);+ cl->info.bits64 = (uint64_t) A; return cl; } @@ -89,51 +97,65 @@ } VAL idris_b8Plus(VM *vm, VAL a, VAL b) {+ uint8_t A = a->info.bits8;+ uint8_t B = b->info.bits8; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS8);- cl->info.bits8 = a->info.bits8 + b->info.bits8;+ cl->info.bits8 = A + B; return cl; } VAL idris_b8Minus(VM *vm, VAL a, VAL b) {+ uint8_t A = a->info.bits8;+ uint8_t B = b->info.bits8; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS8);- cl->info.bits8 = a->info.bits8 - b->info.bits8;+ cl->info.bits8 = A - B; return cl; } VAL idris_b8Times(VM *vm, VAL a, VAL b) {+ uint8_t A = a->info.bits8;+ uint8_t B = b->info.bits8; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS8);- cl->info.bits8 = a->info.bits8 * b->info.bits8;+ cl->info.bits8 = A * B; return cl; } VAL idris_b8UDiv(VM *vm, VAL a, VAL b) {+ uint8_t A = a->info.bits8;+ uint8_t B = b->info.bits8; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS8);- cl->info.bits8 = a->info.bits8 / b->info.bits8;+ cl->info.bits8 = A / B; return cl; } VAL idris_b8SDiv(VM *vm, VAL a, VAL b) {+ uint8_t A = a->info.bits8;+ uint8_t B = b->info.bits8; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS8);- cl->info.bits8 = (uint8_t) (((int8_t) a->info.bits8) / ((int8_t) b->info.bits8));+ cl->info.bits8 = (uint8_t) (((int8_t) A) / ((int8_t) B)); return cl; } VAL idris_b8URem(VM *vm, VAL a, VAL b) {+ uint8_t A = a->info.bits8;+ uint8_t B = b->info.bits8; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS8);- cl->info.bits8 = a->info.bits8 % b->info.bits8;+ cl->info.bits8 = A % B; return cl; } VAL idris_b8SRem(VM *vm, VAL a, VAL b) {+ uint8_t A = a->info.bits8;+ uint8_t B = b->info.bits8; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS8);- cl->info.bits8 = (uint8_t) (((int8_t) a->info.bits8) % ((int8_t) b->info.bits8));+ cl->info.bits8 = (uint8_t) (((int8_t) A) % ((int8_t) B)); return cl; } @@ -158,102 +180,127 @@ } VAL idris_b8Compl(VM *vm, VAL a) {+ uint8_t A = a->info.bits8; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS8);- cl->info.bits8 = ~ a->info.bits8;+ cl->info.bits8 = ~ A; return cl; } VAL idris_b8And(VM *vm, VAL a, VAL b) {+ uint8_t A = a->info.bits8;+ uint8_t B = b->info.bits8; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS8);- cl->info.bits8 = a->info.bits8 & b->info.bits8;+ cl->info.bits8 = A & B; return cl; } VAL idris_b8Or(VM *vm, VAL a, VAL b) {+ uint8_t A = a->info.bits8;+ uint8_t B = b->info.bits8; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS8);- cl->info.bits8 = a->info.bits8 | b->info.bits8;+ cl->info.bits8 = A | B; return cl; } VAL idris_b8Xor(VM *vm, VAL a, VAL b) {+ uint8_t A = a->info.bits8;+ uint8_t B = b->info.bits8; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS8);- cl->info.bits8 = a->info.bits8 ^ b->info.bits8;+ cl->info.bits8 = A ^ B; return cl; } VAL idris_b8Shl(VM *vm, VAL a, VAL b) {+ uint8_t A = a->info.bits8;+ uint8_t B = b->info.bits8; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS8);- cl->info.bits8 = a->info.bits8 << b->info.bits8;+ cl->info.bits8 = A << B; return cl; } VAL idris_b8LShr(VM *vm, VAL a, VAL b) {+ uint8_t A = a->info.bits8;+ uint8_t B = b->info.bits8; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS8);- cl->info.bits8 = a->info.bits8 >> b->info.bits8;+ cl->info.bits8 = A >> B; return cl; } VAL idris_b8AShr(VM *vm, VAL a, VAL b) {+ uint8_t A = a->info.bits8;+ uint8_t B = b->info.bits8; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS8);- cl->info.bits8 = (uint8_t) (((int8_t)a->info.bits8) >> ((int8_t)b->info.bits8));+ cl->info.bits8 = (uint8_t) (((int8_t) A) >> ((int8_t) B)); return cl; } VAL idris_b16Plus(VM *vm, VAL a, VAL b) {+ uint16_t A = a->info.bits16;+ uint16_t B = b->info.bits16; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS16);- cl->info.bits16 = a->info.bits16 + b->info.bits16;+ cl->info.bits16 = A + B; return cl; } VAL idris_b16Minus(VM *vm, VAL a, VAL b) {+ uint16_t A = a->info.bits16;+ uint16_t B = b->info.bits16; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS16);- cl->info.bits16 = a->info.bits16 - b->info.bits16;+ cl->info.bits16 = A - B; return cl; } VAL idris_b16Times(VM *vm, VAL a, VAL b) {+ uint16_t A = a->info.bits16;+ uint16_t B = b->info.bits16; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS16);- cl->info.bits16 = a->info.bits16 * b->info.bits16;+ cl->info.bits16 = A * B; return cl; } VAL idris_b16UDiv(VM *vm, VAL a, VAL b) {+ uint16_t A = a->info.bits16;+ uint16_t B = b->info.bits16; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS16);- cl->info.bits16 = a->info.bits16 / b->info.bits16;+ cl->info.bits16 = A / B; return cl; } VAL idris_b16SDiv(VM *vm, VAL a, VAL b) {+ uint16_t A = a->info.bits16;+ uint16_t B = b->info.bits16; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS16);- cl->info.bits16 =- (uint16_t) (((int16_t) a->info.bits16) / ((int16_t) b->info.bits16));+ cl->info.bits16 = (uint16_t) (((int16_t) A) / ((int16_t) B)); return cl; } VAL idris_b16URem(VM *vm, VAL a, VAL b) {+ uint16_t A = a->info.bits16;+ uint16_t B = b->info.bits16; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS16);- cl->info.bits16 = a->info.bits16 % b->info.bits16;+ cl->info.bits16 = A % B; return cl; } VAL idris_b16SRem(VM *vm, VAL a, VAL b) {+ uint16_t A = a->info.bits16;+ uint16_t B = b->info.bits16; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS16);- cl->info.bits16 =- (uint16_t) (((int16_t) a->info.bits16) % ((int16_t) b->info.bits16));+ cl->info.bits16 = (uint16_t) (((int16_t) A) % ((int16_t) B)); return cl; } @@ -278,102 +325,127 @@ } VAL idris_b16Compl(VM *vm, VAL a) {+ uint16_t A = a->info.bits16; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS16);- cl->info.bits16 = ~ a->info.bits16;+ cl->info.bits16 = ~ A; return cl; } VAL idris_b16And(VM *vm, VAL a, VAL b) {+ uint16_t A = a->info.bits16;+ uint16_t B = b->info.bits16; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS16);- cl->info.bits16 = a->info.bits16 & b->info.bits16;+ cl->info.bits16 = A & B; return cl; } VAL idris_b16Or(VM *vm, VAL a, VAL b) {+ uint16_t A = a->info.bits16;+ uint16_t B = b->info.bits16; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS16);- cl->info.bits16 = a->info.bits16 | b->info.bits16;+ cl->info.bits16 = A | B; return cl; } VAL idris_b16Xor(VM *vm, VAL a, VAL b) {+ uint16_t A = a->info.bits16;+ uint16_t B = b->info.bits16; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS16);- cl->info.bits16 = a->info.bits16 ^ b->info.bits16;+ cl->info.bits16 = A ^ B; return cl; } VAL idris_b16Shl(VM *vm, VAL a, VAL b) {+ uint16_t A = a->info.bits16;+ uint16_t B = b->info.bits16; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS16);- cl->info.bits16 = a->info.bits16 << b->info.bits16;+ cl->info.bits16 = A << B; return cl; } VAL idris_b16LShr(VM *vm, VAL a, VAL b) {+ uint16_t A = a->info.bits16;+ uint16_t B = b->info.bits16; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS16);- cl->info.bits16 = a->info.bits16 >> b->info.bits16;+ cl->info.bits16 = A >> B; return cl; } VAL idris_b16AShr(VM *vm, VAL a, VAL b) {+ uint16_t A = a->info.bits16;+ uint16_t B = b->info.bits16; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS16);- cl->info.bits16 = (uint16_t) (((int16_t)a->info.bits16) >> ((int16_t)b->info.bits16));+ cl->info.bits16 = (uint16_t) (((int16_t) A) >> ((int16_t) B)); return cl; } VAL idris_b32Plus(VM *vm, VAL a, VAL b) {+ uint32_t A = a->info.bits32;+ uint32_t B = b->info.bits32; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS32);- cl->info.bits32 = a->info.bits32 + b->info.bits32;+ cl->info.bits32 = A + B; return cl; } VAL idris_b32Minus(VM *vm, VAL a, VAL b) {+ uint32_t A = a->info.bits32;+ uint32_t B = b->info.bits32; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS32);- cl->info.bits32 = a->info.bits32 - b->info.bits32;+ cl->info.bits32 = A - B; return cl; } VAL idris_b32Times(VM *vm, VAL a, VAL b) {+ uint32_t A = a->info.bits32;+ uint32_t B = b->info.bits32; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS32);- cl->info.bits32 = a->info.bits32 * b->info.bits32;+ cl->info.bits32 = A * B; return cl; } VAL idris_b32UDiv(VM *vm, VAL a, VAL b) {+ uint32_t A = a->info.bits32;+ uint32_t B = b->info.bits32; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS32);- cl->info.bits32 = a->info.bits32 / b->info.bits32;+ cl->info.bits32 = A / B; return cl; } VAL idris_b32SDiv(VM *vm, VAL a, VAL b) {+ uint32_t A = a->info.bits32;+ uint32_t B = b->info.bits32; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS32);- cl->info.bits32 =- (uint32_t) (((int32_t) a->info.bits32) / ((int32_t) b->info.bits32));+ cl->info.bits32 = (uint32_t) (((int32_t) A) / ((int32_t) B)); return cl; } VAL idris_b32URem(VM *vm, VAL a, VAL b) {+ uint32_t A = a->info.bits32;+ uint32_t B = b->info.bits32; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS32);- cl->info.bits32 = a->info.bits32 % b->info.bits32;+ cl->info.bits32 = A % B; return cl; } VAL idris_b32SRem(VM *vm, VAL a, VAL b) {+ uint32_t A = a->info.bits32;+ uint32_t B = b->info.bits32; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS32);- cl->info.bits32 =- (uint32_t) (((int32_t) a->info.bits32) % ((int32_t) b->info.bits32));+ cl->info.bits32 = (uint32_t) (((int32_t) A) % ((int32_t) B)); return cl; } @@ -398,102 +470,127 @@ } VAL idris_b32Compl(VM *vm, VAL a) {+ uint32_t A = a->info.bits32; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS32);- cl->info.bits32 = ~ a->info.bits32;+ cl->info.bits32 = ~ A; return cl; } VAL idris_b32And(VM *vm, VAL a, VAL b) {+ uint32_t A = a->info.bits32;+ uint32_t B = b->info.bits32; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS32);- cl->info.bits32 = a->info.bits32 & b->info.bits32;+ cl->info.bits32 = A & B; return cl; } VAL idris_b32Or(VM *vm, VAL a, VAL b) {+ uint32_t A = a->info.bits32;+ uint32_t B = b->info.bits32; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS32);- cl->info.bits32 = a->info.bits32 | b->info.bits32;+ cl->info.bits32 = A | B; return cl; } VAL idris_b32Xor(VM *vm, VAL a, VAL b) {+ uint32_t A = a->info.bits32;+ uint32_t B = b->info.bits32; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS32);- cl->info.bits32 = a->info.bits32 ^ b->info.bits32;+ cl->info.bits32 = A ^ B; return cl; } VAL idris_b32Shl(VM *vm, VAL a, VAL b) {+ uint32_t A = a->info.bits32;+ uint32_t B = b->info.bits32; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS32);- cl->info.bits32 = a->info.bits32 << b->info.bits32;+ cl->info.bits32 = A << B; return cl; } VAL idris_b32LShr(VM *vm, VAL a, VAL b) {+ uint32_t A = a->info.bits32;+ uint32_t B = b->info.bits32; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS32);- cl->info.bits32 = a->info.bits32 >> b->info.bits32;+ cl->info.bits32 = A >> B; return cl; } VAL idris_b32AShr(VM *vm, VAL a, VAL b) {+ uint32_t A = a->info.bits32;+ uint32_t B = b->info.bits32; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS32);- cl->info.bits32 = (uint32_t) (((int32_t)a->info.bits32) >> ((int32_t)b->info.bits32));+ cl->info.bits32 = (uint32_t) (((int32_t)A) >> ((int32_t)B)); return cl; } VAL idris_b64Plus(VM *vm, VAL a, VAL b) {+ uint64_t A = a->info.bits64;+ uint64_t B = b->info.bits64; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS64);- cl->info.bits64 = a->info.bits64 + b->info.bits64;+ cl->info.bits64 = A + B; return cl; } VAL idris_b64Minus(VM *vm, VAL a, VAL b) {+ uint64_t A = a->info.bits64;+ uint64_t B = b->info.bits64; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS64);- cl->info.bits64 = a->info.bits64 - b->info.bits64;+ cl->info.bits64 = A - B; return cl; } VAL idris_b64Times(VM *vm, VAL a, VAL b) {+ uint64_t A = a->info.bits64;+ uint64_t B = b->info.bits64; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS64);- cl->info.bits64 = a->info.bits64 * b->info.bits64;+ cl->info.bits64 = A * B; return cl; } VAL idris_b64UDiv(VM *vm, VAL a, VAL b) {+ uint64_t A = a->info.bits64;+ uint64_t B = b->info.bits64; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS64);- cl->info.bits64 = a->info.bits64 / b->info.bits64;+ cl->info.bits64 = A / B; return cl; } VAL idris_b64SDiv(VM *vm, VAL a, VAL b) {+ uint64_t A = a->info.bits64;+ uint64_t B = b->info.bits64; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS64);- cl->info.bits64 =- (uint64_t) (((int64_t) a->info.bits64) / ((int64_t) b->info.bits64));+ cl->info.bits64 = (uint64_t) (((int64_t) A) / ((int64_t) B)); return cl; } VAL idris_b64URem(VM *vm, VAL a, VAL b) {+ uint64_t A = a->info.bits64;+ uint64_t B = b->info.bits64; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS64);- cl->info.bits64 = a->info.bits64 % b->info.bits64;+ cl->info.bits64 = A % B; return cl; } VAL idris_b64SRem(VM *vm, VAL a, VAL b) {+ uint64_t A = a->info.bits64;+ uint64_t B = b->info.bits64; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS64);- cl->info.bits64 =- (uint64_t) (((int64_t) a->info.bits64) % ((int64_t) b->info.bits64));+ cl->info.bits64 = (uint64_t) (((int64_t) A) % ((int64_t) B)); return cl; } @@ -518,177 +615,208 @@ } VAL idris_b64Compl(VM *vm, VAL a) {+ uint64_t A = a->info.bits64; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS64);- cl->info.bits64 = ~ a->info.bits64;+ cl->info.bits64 = ~ A; return cl; } VAL idris_b64And(VM *vm, VAL a, VAL b) {+ uint64_t A = a->info.bits64;+ uint64_t B = b->info.bits64; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS64);- cl->info.bits64 = a->info.bits64 & b->info.bits64;+ cl->info.bits64 = A & B; return cl; } VAL idris_b64Or(VM *vm, VAL a, VAL b) {+ uint64_t A = a->info.bits64;+ uint64_t B = b->info.bits64; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS64);- cl->info.bits64 = a->info.bits64 | b->info.bits64;+ cl->info.bits64 = A | B; return cl; } VAL idris_b64Xor(VM *vm, VAL a, VAL b) {+ uint64_t A = a->info.bits64;+ uint64_t B = b->info.bits64; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS64);- cl->info.bits64 = a->info.bits64 ^ b->info.bits64;+ cl->info.bits64 = A ^ B; return cl; } VAL idris_b64Shl(VM *vm, VAL a, VAL b) {+ uint64_t A = a->info.bits64;+ uint64_t B = b->info.bits64; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS64);- cl->info.bits64 = a->info.bits64 << b->info.bits64;+ cl->info.bits64 = A << B; return cl; } VAL idris_b64LShr(VM *vm, VAL a, VAL b) {+ uint64_t A = a->info.bits64;+ uint64_t B = b->info.bits64; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS64);- cl->info.bits64 = a->info.bits64 >> b->info.bits64;+ cl->info.bits64 = A >> B; return cl; } VAL idris_b64AShr(VM *vm, VAL a, VAL b) {+ uint64_t A = a->info.bits64;+ uint64_t B = b->info.bits64; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS64);- cl->info.bits64 = (uint64_t) (((int64_t)a->info.bits64) >> ((int64_t)b->info.bits64));+ cl->info.bits64 = (uint64_t) (((int64_t) A) >> ((int64_t) B)); return cl; } VAL idris_b8Z16(VM *vm, VAL a) {+ uint8_t A = a->info.bits8; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS16);- cl->info.bits16 = (uint16_t) a->info.bits8;+ cl->info.bits16 = (uint16_t) A; return cl; } VAL idris_b8Z32(VM *vm, VAL a) {+ uint8_t A = a->info.bits8; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS32);- cl->info.bits32 = (uint32_t) a->info.bits8;+ cl->info.bits32 = (uint32_t) A; return cl; } VAL idris_b8Z64(VM *vm, VAL a) {+ uint8_t A = a->info.bits8; VAL cl = allocate(vm, sizeof(Closure), 0);- SETTY(cl, BITS16);- cl->info.bits64 = (uint64_t) a->info.bits8;+ SETTY(cl, BITS64);+ cl->info.bits64 = (uint64_t) A; return cl; } VAL idris_b8S16(VM *vm, VAL a) {+ uint8_t A = a->info.bits8; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS16);- cl->info.bits16 = (uint16_t) (int16_t) (int8_t) a->info.bits8;+ cl->info.bits16 = (uint16_t) (int16_t) (int8_t) A; return cl; } VAL idris_b8S32(VM *vm, VAL a) {+ uint8_t A = a->info.bits8; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS32);- cl->info.bits32 = (uint32_t) (int32_t) (int8_t) a->info.bits8;+ cl->info.bits32 = (uint32_t) (int32_t) (int8_t) A; return cl; } VAL idris_b8S64(VM *vm, VAL a) {+ uint8_t A = a->info.bits8; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS64);- cl->info.bits64 = (uint64_t) (int64_t) (int8_t) a->info.bits8;+ cl->info.bits64 = (uint64_t) (int64_t) (int8_t) A; return cl; } VAL idris_b16Z32(VM *vm, VAL a) {+ uint16_t A = a->info.bits16; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS32);- cl->info.bits32 = (uint32_t) a->info.bits16;+ cl->info.bits32 = (uint32_t) A; return cl; } VAL idris_b16Z64(VM *vm, VAL a) {+ uint16_t A = a->info.bits16; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS64);- cl->info.bits64 = (uint64_t) a->info.bits16;+ cl->info.bits64 = (uint64_t) A; return cl; } VAL idris_b16S32(VM *vm, VAL a) {+ uint16_t A = a->info.bits16; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS32);- cl->info.bits32 = (uint32_t) (int32_t) (int16_t) a->info.bits16;+ cl->info.bits32 = (uint32_t) (int32_t) (int16_t) A; return cl; } VAL idris_b16S64(VM *vm, VAL a) {+ uint16_t A = a->info.bits16; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS64);- cl->info.bits64 = (uint64_t) (int64_t) (int16_t) a->info.bits16;+ cl->info.bits64 = (uint64_t) (int64_t) (int16_t) A; return cl; } VAL idris_b16T8(VM *vm, VAL a) {+ uint16_t A = a->info.bits16; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS8);- cl->info.bits8 = (uint8_t) a->info.bits16;+ cl->info.bits8 = (uint8_t) A; return cl; } VAL idris_b32Z64(VM *vm, VAL a) {+ uint32_t A = a->info.bits32; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS64);- cl->info.bits64 = (uint64_t) a->info.bits32;+ cl->info.bits64 = (uint64_t) A; return cl; } VAL idris_b32S64(VM *vm, VAL a) {+ uint32_t A = a->info.bits32; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS64);- cl->info.bits64 = (uint64_t) (int64_t) (int32_t) a->info.bits32;+ cl->info.bits64 = (uint64_t) (int64_t) (int32_t) A; return cl; } VAL idris_b32T8(VM *vm, VAL a) {+ uint32_t A = a->info.bits32; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS8);- cl->info.bits8 = (uint8_t) a->info.bits32;+ cl->info.bits8 = (uint8_t) A; return cl; } VAL idris_b32T16(VM *vm, VAL a) {+ uint32_t A = a->info.bits32; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS16);- cl->info.bits16 = (uint16_t) a->info.bits32;+ cl->info.bits16 = (uint16_t) A; return cl; } VAL idris_b64T8(VM *vm, VAL a) {+ uint64_t A = a->info.bits64; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS8);- cl->info.bits8 = (uint8_t) a->info.bits64;+ cl->info.bits8 = (uint8_t) A; return cl; } VAL idris_b64T16(VM *vm, VAL a) {+ uint64_t A = a->info.bits64; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS16);- cl->info.bits16 = (uint16_t) a->info.bits64;+ cl->info.bits16 = (uint16_t) A; return cl; } VAL idris_b64T32(VM *vm, VAL a) {+ uint64_t A = a->info.bits64; VAL cl = allocate(vm, sizeof(Closure), 0); SETTY(cl, BITS32);- cl->info.bits32 = (uint32_t) a->info.bits64;+ cl->info.bits32 = (uint32_t) A; return cl; }
rts/idris_gc.c view
@@ -151,7 +151,9 @@ printf("Final heap use %d\n", (int)(vm->heap.next - vm->heap.heap)); if (doGC) { idris_gc(vm); } printf("Final heap use after GC %d\n", (int)(vm->heap.next - vm->heap.heap));-+#ifdef IDRIS_ENABLE_STATS printf("Total allocations %d\n", vm->stats.allocations);+#endif printf("Number of collections %d\n", vm->stats.collections);+ }
rts/idris_rts.c view
@@ -346,10 +346,11 @@ } VAL idris_castIntStr(VM* vm, VAL i) {+ int x = (int) GETINT(i); Closure* cl = allocate(vm, sizeof(Closure) + sizeof(char)*16, 0); SETTY(cl, STRING); cl -> info.str = (char*)cl + sizeof(Closure);- sprintf(cl -> info.str, "%d", (int)(GETINT(i)));+ sprintf(cl -> info.str, "%d", x); return cl; }
rts/idris_rts.h view
@@ -13,6 +13,13 @@ #include "idris_heap.h" #include "idris_stats.h" +#ifndef EXIT_SUCCESS+#define EXIT_SUCCESS 0+#endif+#ifndef EXIT_FAILURE+#define EXIT_FAILURE 1+#endif+ // Closures typedef enum {
rts/idris_stats.h view
@@ -1,10 +1,10 @@ #ifndef _IDRIS_STATS_H #define _IDRIS_STATS_H +#ifdef IDRIS_ENABLE_STATS #include <time.h>+#endif -// Should not be defined in release.-#define IDRIS_ENABLE_STATS // TODO: measure user time, exclusive/inclusive stats typedef struct {
src/IRTS/CodegenC.hs view
@@ -67,7 +67,8 @@ let gcc = comp ++ " " ++ gccDbg dbg ++ " " ++ gccFlags ++- " -DHAS_PTHREAD " +++ -- # Any flags defined here which alter the RTS API must also be added to config.mk+ " -DHAS_PTHREAD -DIDRIS_ENABLE_STATS" ++ " -I. " ++ objs ++ " -x c " ++ (if (exec == Executable) then "" else " -c ") ++ " " ++ tmpn ++@@ -437,7 +438,7 @@ doOp v (LSExt (ITFixed from) (ITFixed to)) [x] | nativeTyWidth from < nativeTyWidth to = bitCoerce v "S" from to x doOp v (LZExt ITNative (ITFixed to)) [x]- = v ++ "idris_b" ++ show (nativeTyWidth to) ++ "const(vm, (uintptr_t)GETINT(" ++ creg x ++ ")"+ = v ++ "idris_b" ++ show (nativeTyWidth to) ++ "const(vm, (uintptr_t)GETINT(" ++ creg x ++ "))" doOp v (LZExt ITChar (ITFixed to)) [x] = doOp v (LZExt ITNative (ITFixed to)) [x] doOp v (LZExt (ITFixed from) ITNative) [x]@@ -474,6 +475,7 @@ doOp v LFSqrt [x] = v ++ flUnOp "sqrt" (creg x) doOp v LFFloor [x] = v ++ flUnOp "floor" (creg x) doOp v LFCeil [x] = v ++ flUnOp "ceil" (creg x)+doOp v LFNegate [x] = v ++ "MKFLOAT(vm, -GETFLOAT(" ++ (creg x) ++ "))" doOp v LStrHead [x] = v ++ "idris_strHead(vm, " ++ creg x ++ ")" doOp v LStrTail [x] = v ++ "idris_strTail(vm, " ++ creg x ++ ")"
src/IRTS/CodegenCommon.hs view
@@ -25,7 +25,6 @@ outputType :: OutputType, targetTriple :: String, targetCPU :: String,- optimisation :: Word, includes :: [FilePath], importDirs :: [FilePath], compileObjs :: [String],
− src/IRTS/CodegenJava.hs
@@ -1,757 +0,0 @@-{-# LANGUAGE PatternGuards #-}-module IRTS.CodegenJava (codegenJava) where--import Idris.Core.TT hiding (mkApp)-import IRTS.CodegenCommon-import IRTS.Java.ASTBuilding-import IRTS.Java.JTypes-import IRTS.Java.Mangling-import IRTS.Java.Pom (pomString)-import IRTS.Lang-import IRTS.Simplified-import IRTS.System-import Util.System--import Control.Applicative hiding (Const)-import Control.Arrow-import Control.Monad-import Control.Monad.Error-import qualified Control.Monad.Trans as T-import Control.Monad.Trans.State-import Data.List (foldl', isSuffixOf)-import qualified Data.Text as T-import qualified Data.Text.IO as TIO-import qualified Data.Vector.Unboxed as V-import Language.Java.Parser-import Language.Java.Pretty-import Language.Java.Syntax hiding (Name)-import qualified Language.Java.Syntax as J-import System.Directory-import System.Exit-import System.FilePath-import System.IO-import System.Process---------------------------------------------------------------------------- Main function-codegenJava :: CodeGenerator-codegenJava cg = codegenJava' [] (simpleDecls cg) (outputFile cg)- (includes cg) (compileLibs cg)- (outputType cg)--codegenJava' :: [(Name, SExp)] -> -- initialization of globals- [(Name, SDecl)] -> -- decls- FilePath -> -- output file name- [String] -> -- headers- [String] -> -- libs- OutputType ->- IO ()-codegenJava' globalInit defs out hdrs libs exec =- withTgtDir exec out (codegenJava' exec)- where- codegenJava' :: OutputType -> FilePath -> IO ()- codegenJava' Raw tgtDir = do- srcDir <- prepareSrcDir exec tgtDir- generateJavaFile globalInit defs hdrs srcDir out- codegenJava' MavenProject tgtDir = do- codegenJava' Raw tgtDir- generatePom tgtDir out libs- codegenJava' Object tgtDir = do- codegenJava' MavenProject tgtDir- invokeMvn tgtDir "compile"- copyClassFiles tgtDir out- cleanUpTmp tgtDir- codegenJava' _ tgtDir = do- codegenJava' MavenProject tgtDir- invokeMvn tgtDir "package";- copyJar tgtDir out- makeJarExecutable out- cleanUpTmp tgtDir---------------------------------------------------------------------------- Compiler IO--withTgtDir :: OutputType -> FilePath -> (FilePath -> IO ()) -> IO ()-withTgtDir Raw out action = action (dropFileName out)-withTgtDir MavenProject out action = createDirectoryIfMissing False out >> action out-withTgtDir _ out action = withTempdir (takeBaseName out) action--prepareSrcDir :: OutputType -> FilePath -> IO FilePath-prepareSrcDir Raw tgtDir = return tgtDir-prepareSrcDir _ tgtDir = do- let srcDir = (tgtDir </> "src" </> "main" </> "java")- createDirectoryIfMissing True srcDir- return srcDir--javaFileName :: FilePath -> FilePath -> FilePath-javaFileName srcDir out =- either error (\ (Ident clsName) -> srcDir </> clsName <.> "java") (mkClassName out)--generateJavaFile :: [(Name, SExp)] -> -- initialization of globals- [(Name, SDecl)] -> -- definitions- [String] -> -- headers- FilePath -> -- Source dir- FilePath -> -- output target- IO ()-generateJavaFile globalInit defs hdrs srcDir out = do- let code = either error- (prettyPrint)-- flatIndent . prettyPrint)- (evalStateT (mkCompilationUnit globalInit defs hdrs out) mkCodeGenEnv)- writeFile (javaFileName srcDir out) code--pomFileName :: FilePath -> FilePath-pomFileName tgtDir = tgtDir </> "pom.xml"--generatePom :: FilePath -> -- tgt dir- FilePath -> -- output target- [String] -> -- libs- IO ()-generatePom tgtDir out libs = writeFile (pomFileName tgtDir) execPom- where- (Ident clsName) = either error id (mkClassName out)- execPom = pomString clsName (takeBaseName out) libs- --invokeMvn :: FilePath -> String -> IO ()-invokeMvn tgtDir command = do- mvnCmd <- getMvn- let args = ["-f", pomFileName tgtDir]- (exit, mvout, err) <- readProcessWithExitCode mvnCmd (args ++ [command]) ""- when (exit /= ExitSuccess) $- error ("FAILURE: " ++ mvnCmd ++ " " ++ command ++ "\n" ++ err ++ mvout)--classFileDir :: FilePath -> FilePath-classFileDir tgtDir = tgtDir </> "target" </> "classes"--copyClassFiles :: FilePath -> FilePath -> IO ()-copyClassFiles tgtDir out = do- classFiles <- map (\ clsFile -> classFileDir tgtDir </> clsFile)- . filter ((".class" ==) . takeExtension)- <$> getDirectoryContents (classFileDir tgtDir)- mapM_ (\ clsFile -> copyFile clsFile (takeDirectory out </> takeFileName clsFile)) classFiles--jarFileName :: FilePath -> FilePath -> FilePath-jarFileName tgtDir out = tgtDir </> "target" </> (takeBaseName out) <.> "jar"--copyJar :: FilePath -> FilePath -> IO ()-copyJar tgtDir out =- copyFile (jarFileName tgtDir out) out--makeJarExecutable :: FilePath -> IO ()-makeJarExecutable out = do- handle <- openBinaryFile out ReadMode- contents <- TIO.hGetContents handle- hClose handle- handle <- openBinaryFile out WriteMode- TIO.hPutStr handle (T.append (T.pack jarHeader) contents)- hFlush handle- hClose handle- perms <- getPermissions out- setPermissions out (setOwnerExecutable True perms)--removePom :: FilePath -> IO ()-removePom tgtDir = removeFile (pomFileName tgtDir)--cleanUpTmp :: FilePath -> IO ()-cleanUpTmp tgtDir = do- invokeMvn tgtDir "clean"- removePom tgtDir---------------------------------------------------------------------------- Jar and Pom infrastructure--jarHeader :: String-jarHeader =- "#!/usr/bin/env sh\n"- ++ "MYSELF=`which \"$0\" 2>/dev/null`\n"- ++ "[ $? -gt 0 -a -f \"$0\" ] && MYSELF=\"./$0\"\n"- ++ "java=java\n"- ++ "if test -n \"$JAVA_HOME\"; then\n"- ++ " java=\"$JAVA_HOME/bin/java\"\n"- ++ "fi\n"- ++ "exec \"$java\" $java_args -jar $MYSELF \"$@\"\n"- ++ "exit 1\n"---------------------------------------------------------------------------- Code generation environment--data CodeGenerationEnv- = CodeGenerationEnv- { globalVariables :: [(Name, ArrayIndex)]- , localVariables :: [[(Int, Ident)]]- , localVarCounter :: Int- }--type CodeGeneration = StateT (CodeGenerationEnv) (Either String)--mkCodeGenEnv :: CodeGenerationEnv-mkCodeGenEnv = CodeGenerationEnv [] [] 0--varPos :: LVar -> CodeGeneration (Either ArrayIndex Ident)-varPos (Loc i) = do- vars <- (concat . localVariables) <$> get- case lookup i vars of- (Just varName) -> return (Right varName)- Nothing -> throwError $ "Invalid local variable id: " ++ show i-varPos (Glob name) = do- vars <- globalVariables <$> get- case lookup name vars of- (Just varIdx) -> return (Left varIdx)- Nothing -> throwError $ "Invalid global variable id: " ++ show name--pushScope :: CodeGeneration ()-pushScope =- modify (\ env -> env { localVariables = []:(localVariables env) })--popScope :: CodeGeneration ()-popScope = do- env <- get- let lVars = tail $ localVariables env- let vC = if null lVars then 0 else localVarCounter env- put $ env { localVariables = tail (localVariables env)- , localVarCounter = vC }--setVariable :: LVar -> CodeGeneration (Either ArrayIndex Ident)-setVariable (Loc i) = do- env <- get- let lVars = localVariables env- let getter = localVar $ localVarCounter env- let lVars' = ((i, getter) : head lVars) : tail lVars- put $ env { localVariables = lVars'- , localVarCounter = 1 + localVarCounter env}- return (Right getter)-setVariable (Glob n) = do- env <- get- let gVars = globalVariables env- let getter = globalContext @! length gVars- let gVars' = (n, getter):gVars- put (env { globalVariables = gVars' })- return (Left getter)--pushParams :: [Ident] -> CodeGeneration ()-pushParams paramNames =- let varMap = zipWith (flip (,)) paramNames [0..] in- modify (\ env -> env { localVariables = varMap:(localVariables env)- , localVarCounter = (length varMap) + (localVarCounter env) })--flatIndent :: String -> String-flatIndent (' ' : ' ' : xs) = flatIndent xs-flatIndent (x:xs) = x:flatIndent xs-flatIndent [] = []---------------------------------------------------------------------------- Maintaining control structures over code blocks--data BlockPostprocessor- = BlockPostprocessor- { ppInnerBlock :: [BlockStmt] -> Exp -> CodeGeneration [BlockStmt]- , ppOuterBlock :: [BlockStmt] -> CodeGeneration [BlockStmt]- }--ppExp :: BlockPostprocessor -> Exp -> CodeGeneration [BlockStmt]-ppExp pp exp = ((ppInnerBlock pp) [] exp) >>= ppOuterBlock pp--addReturn :: BlockPostprocessor-addReturn =- BlockPostprocessor- { ppInnerBlock = (\ block exp -> return $ block ++ [jReturn exp])- , ppOuterBlock = return- }--ignoreResult :: BlockPostprocessor-ignoreResult =- BlockPostprocessor- { ppInnerBlock = (\ block exp -> return block)- , ppOuterBlock = return- }--ignoreOuter :: BlockPostprocessor -> BlockPostprocessor-ignoreOuter pp = pp { ppOuterBlock = return }--throwRuntimeException :: BlockPostprocessor -> BlockPostprocessor-throwRuntimeException pp =- pp- { ppInnerBlock =- (\ blk exp -> return $- blk ++ [ BlockStmt $ Throw- ( InstanceCreation- []- (toClassType runtimeExceptionType)- [exp]- Nothing- )- ]- )- }---rethrowAsRuntimeException :: BlockPostprocessor -> BlockPostprocessor-rethrowAsRuntimeException pp =- pp- { ppOuterBlock =- (\ blk -> do- ex <- ppInnerBlock (throwRuntimeException pp) [] (ExpName $ J.Name [Ident "ex"])- ppOuterBlock pp- $ [ BlockStmt $ Try- (Block blk)- [Catch (FormalParam [] exceptionType False (VarId (Ident "ex"))) $- Block ex- ]- Nothing- ]- )- }---------------------------------------------------------------------------- File structure--mkCompilationUnit :: [(Name, SExp)] -> [(Name, SDecl)] -> [String] -> FilePath -> CodeGeneration CompilationUnit-mkCompilationUnit globalInit defs hdrs out = do- clsName <- mkClassName out- CompilationUnit Nothing ( [ ImportDecl False idrisRts True- , ImportDecl True idrisPrelude True- , ImportDecl False bigInteger False- , ImportDecl False runtimeException False- , ImportDecl False byteBuffer False- ] ++ otherHdrs- )- <$> mkTypeDecl clsName globalInit defs- where- idrisRts = J.Name $ map Ident ["org", "idris", "rts"]- idrisPrelude = J.Name $ map Ident ["org", "idris", "rts", "Prelude"]- bigInteger = J.Name $ map Ident ["java", "math", "BigInteger"]- runtimeException = J.Name $ map Ident ["java", "lang", "RuntimeException"]- byteBuffer = J.Name $ map Ident ["java", "nio", "ByteBuffer"]- otherHdrs = map ( (\ name -> ImportDecl False name False)- . J.Name- . map (Ident . T.unpack)- . T.splitOn (T.pack ".")- . T.pack)- $ filter (not . isSuffixOf ".h") hdrs---------------------------------------------------------------------------- Main class--mkTypeDecl :: Ident -> [(Name, SExp)] -> [(Name, SDecl)] -> CodeGeneration [TypeDecl]-mkTypeDecl name globalInit defs =- (\ body -> [ClassTypeDecl $ ClassDecl [ Public- , Annotation $ SingleElementAnnotation- (jName "SuppressWarnings")- (EVVal . InitExp $ jString "unchecked")- ]- name- []- Nothing- []- body])- <$> mkClassBody globalInit (map (second (prefixCallNamespaces name)) defs)--mkClassBody :: [(Name, SExp)] -> [(Name, SDecl)] -> CodeGeneration ClassBody-mkClassBody globalInit defs =- (\ globals defs -> ClassBody . (globals++) . addMainMethod . mergeInnerClasses $ defs)- <$> mkGlobalContext globalInit- <*> mapM mkDecl defs--mkGlobalContext :: [(Name, SExp)] -> CodeGeneration [Decl]-mkGlobalContext [] = return []-mkGlobalContext initExps = do- pushScope- varInit <-- mapM (\ (name, exp) -> do- pos <- setVariable (Glob name)- mkUpdate ignoreResult (Glob name) exp- ) initExps- popScope- return [ MemberDecl $ FieldDecl [Private, Static, Final]- (array objectType)- [ VarDecl (VarId $ globalContextID). Just . InitExp- $ ArrayCreate objectType [jInt $ length initExps] 0- ]- , InitDecl True (Block $ concat varInit)- ]--addMainMethod :: [Decl] -> [Decl]-addMainMethod decls- | findMainMethod decls = mkMainMethod : decls- | otherwise = decls- where- findMainMethod ((MemberDecl (MethodDecl _ _ _ name [] _ _)):_)- | name == mangle' (sMN 0 "runMain") = True- findMainMethod (_:decls) = findMainMethod decls- findMainMethod [] = False--mkMainMethod :: Decl-mkMainMethod =- simpleMethod- [Public, Static]- Nothing- "main"- [FormalParam [] (array stringType) False (VarId $ Ident "args")]- $ Block [ BlockStmt . ExpStmt- $ call "idris_initArgs" [ jConst "args" ]- , BlockStmt . ExpStmt $ call (mangle' (sMN 0 "runMain")) []- ]---------------------------------------------------------------------------- Inner classes (idris namespaces)--mergeInnerClasses :: [Decl] -> [Decl]-mergeInnerClasses = foldl' mergeInner []- where- mergeInner ((decl@(MemberDecl (MemberClassDecl (ClassDecl priv name targs ext imp (ClassBody body))))):decls)- decl'@(MemberDecl (MemberClassDecl (ClassDecl _ name' _ ext' imp' (ClassBody body'))))- | name == name' =- (MemberDecl $ MemberClassDecl $- ClassDecl priv- name- targs- (mplus ext ext')- (imp ++ imp')- (ClassBody $ mergeInnerClasses (body ++ body')))- : decls- | otherwise = decl:(mergeInner decls decl')- mergeInner (decl:decls) decl' = decl:(mergeInner decls decl')- mergeInner [] decl' = [decl']----mkDecl :: (Name, SDecl) -> CodeGeneration Decl-mkDecl ((NS n (ns:nss)), decl) =- (\ name body ->- MemberDecl $ MemberClassDecl $ ClassDecl [Public, Static] name [] Nothing [] body)- <$> mangle (UN ns)- <*> mkClassBody [] [(NS n nss, decl)]-mkDecl (_, SFun name params stackSize body) = do- (Ident methodName) <- mangle name- methodParams <- mapM mkFormalParam params- paramNames <- mapM mangle params- pushParams paramNames- methodBody <- mkExp addReturn body- popScope- return $- simpleMethod [Public, Static] (Just objectType) methodName methodParams- (Block methodBody)--mkFormalParam :: Name -> CodeGeneration FormalParam-mkFormalParam name =- (\ name -> FormalParam [Final] objectType False (VarId name))- <$> mangle name---------------------------------------------------------------------------- Expressions---- | Compile a simple expression and use the given continuation to postprocess--- the resulting value.-mkExp :: BlockPostprocessor -> SExp -> CodeGeneration [BlockStmt]--- Variables-mkExp pp (SV var) =- (Nothing <>@! var) >>= ppExp pp---- Applications-mkExp pp (SApp pushTail name args) =- mkApp pushTail name args >>= ppExp pp---- Bindings-mkExp pp (SLet var newExp inExp) =- mkLet pp var newExp inExp-mkExp pp (SUpdate var@(Loc i) newExp) = -- can only update locals- mkUpdate pp var newExp-mkExp pp (SUpdate var newExp) =- mkExp pp newExp---- Objects-mkExp pp (SCon _ conId _ args) =- mkIdrisObject conId args >>= ppExp pp---- Case expressions-mkExp pp (SCase up var alts) = mkCase pp True var alts-mkExp pp (SChkCase var alts) = mkCase pp False var alts---- Projections-mkExp pp (SProj var i) =- mkProjection var i >>= ppExp pp---- Constants-mkExp pp (SConst c) =- ppExp pp $ mkConstant c---- Foreign function calls-mkExp pp (SForeign lang resTy text params) =- mkForeign pp lang resTy text params---- Primitive functions-mkExp pp (SOp LFork [arg]) =- (mkThread arg) >>= ppExp pp-mkExp pp (SOp LPar [arg]) =- (Nothing <>@! arg) >>= ppExp pp-mkExp pp (SOp LRegisterPtr [ptr, i]) =- (Nothing <>@! ptr) >>= ppExp pp-mkExp pp (SOp LNoOp args) =- (Nothing <>@! (last args)) >>= ppExp pp-mkExp pp (SOp LNullPtr args) =- ppExp pp $ Lit Null-mkExp pp (SOp op args) =- (mkPrimitiveFunction op args) >>= ppExp pp---- Empty expressions-mkExp pp (SNothing) = ppExp pp $ Lit Null---- Errors-mkExp pp (SError err) = ppExp (throwRuntimeException pp) (jString err)---------------------------------------------------------------------------- Variable access--(<>@!) :: Maybe J.Type -> LVar -> CodeGeneration Exp-(<>@!) Nothing var =- either ArrayAccess (\ n -> ExpName $ J.Name [n]) <$> varPos var-(<>@!) (Just castTo) var =- (castTo <>) <$> (Nothing <>@! var)---------------------------------------------------------------------------- Application (wrap method calls in tail call closures)--mkApp :: Bool -> Name -> [LVar] -> CodeGeneration Exp-mkApp False name args =- (\ methodName params ->- (idrisClosureType ~> "unwrapTailCall") [call methodName params]- )- <$> mangleFull name- <*> mapM (Nothing <>@!) args-mkApp True name args = mkMethodCallClosure name args--mkMethodCallClosure :: Name -> [LVar] -> CodeGeneration Exp-mkMethodCallClosure name args =- (\ name args -> closure (call name args))- <$> mangleFull name- <*> mapM (Nothing <>@!) args---------------------------------------------------------------------------- Updates (change context array) and Let bindings (Update, execute)--mkUpdate :: BlockPostprocessor -> LVar -> SExp -> CodeGeneration [BlockStmt]-mkUpdate pp var exp =- mkExp- ( pp- { ppInnerBlock =- (\ blk rhs -> do- pos <- setVariable var- vExp <- Nothing <>@! var- ppInnerBlock pp (blk ++ [pos @:= rhs]) vExp- )- }- ) exp--mkLet :: BlockPostprocessor -> LVar -> SExp -> SExp -> CodeGeneration [BlockStmt]-mkLet pp var@(Loc pos) newExp inExp =- mkUpdate (pp { ppInnerBlock =- (\ blk _ -> do- inBlk <- mkExp pp inExp- return (blk ++ inBlk)- )- }- ) var newExp-mkLet _ (Glob _) _ _ = T.lift $ Left "Cannot let bind to global variable"---------------------------------------------------------------------------- Object creation--mkIdrisObject :: Int -> [LVar] -> CodeGeneration Exp-mkIdrisObject conId args =- (\ args ->- InstanceCreation [] (toClassType idrisObjectType) ((jInt conId):args) Nothing- )- <$> mapM (Nothing <>@!) args---------------------------------------------------------------------------- Case expressions--mkCase :: BlockPostprocessor -> Bool -> LVar -> [SAlt] -> CodeGeneration [BlockStmt]-mkCase pp checked var cases- | isDefaultOnlyCase cases = mkDefaultMatch pp cases- | isConstCase cases = do- ifte <- mkConstMatch (ignoreOuter pp) (\ pp -> mkDefaultMatch pp cases) var cases- ppOuterBlock pp [BlockStmt ifte]- | otherwise = do- switchExp <- mkGetConstructorId checked var- matchBlocks <- mkConsMatch (ignoreOuter pp) (\ pp -> mkDefaultMatch pp cases) var cases- ppOuterBlock pp [BlockStmt $ Switch switchExp matchBlocks]--isConstCase :: [SAlt] -> Bool-isConstCase ((SConstCase _ _):_) = True-isConstCase ((SDefaultCase _):cases) = isConstCase cases-isConstCase _ = False--isDefaultOnlyCase :: [SAlt] -> Bool-isDefaultOnlyCase [SDefaultCase _] = True-isDefaultOnlyCase [] = True-isDefaultOnlyCase _ = False--mkDefaultMatch :: BlockPostprocessor -> [SAlt] -> CodeGeneration [BlockStmt]-mkDefaultMatch pp (x@(SDefaultCase branchExpression):_) =- do pushScope- stmt <- mkExp pp branchExpression- popScope- return stmt-mkDefaultMatch pp (x:xs) = mkDefaultMatch pp xs-mkDefaultMatch pp [] =- ppExp (throwRuntimeException pp) (jString "Non-exhaustive pattern")--mkMatchConstExp :: LVar -> Const -> CodeGeneration Exp-mkMatchConstExp var c- | isPrimitive cty =- (\ var -> (primFnType ~> opName (LEq undefined)) [var, jc] ~==~ jInt 1)- <$> (Just cty <>@! var)- | isArray cty =- (\ var -> (arraysType ~> "equals") [var, jc])- <$> (Just cty <>@! var)- | isString cty =- (\ var -> ((primFnType ~> opName (LStrEq)) [var, jc] ~==~ jInt 1))- <$> (Just cty <>@! var)- | otherwise =- (\ var -> (var ~> "equals") [jc])- <$> (Just cty <>@! var)- where- cty = constType c- jc = mkConstant c--mkConstMatch :: BlockPostprocessor ->- (BlockPostprocessor -> CodeGeneration [BlockStmt]) ->- LVar ->- [SAlt] ->- CodeGeneration Stmt-mkConstMatch pp getDefaultStmts var ((SConstCase constant branchExpression):cases) = do- matchExp <- mkMatchConstExp var constant- pushScope- branchBlock <- mkExp pp branchExpression- popScope- otherBranches <- mkConstMatch pp getDefaultStmts var cases- return- $ IfThenElse matchExp (StmtBlock $ Block branchBlock) otherBranches-mkConstMatch pp getDefaultStmts var (c:cases) = mkConstMatch pp getDefaultStmts var cases-mkConstMatch pp getDefaultStmts _ [] = do- defaultBlock <- getDefaultStmts pp- return $ StmtBlock (Block defaultBlock)--mkGetConstructorId :: Bool -> LVar -> CodeGeneration Exp-mkGetConstructorId True var =- (\ var -> ((idrisObjectType <> var) ~> "getConstructorId") [])- <$> (Nothing <>@! var)-mkGetConstructorId False var =- (\ var match ->- Cond (InstanceOf var (toRefType idrisObjectType)) match (jInt (-1))- )- <$> (Nothing <>@! var)- <*> mkGetConstructorId True var--mkConsMatch :: BlockPostprocessor ->- (BlockPostprocessor -> CodeGeneration [BlockStmt]) ->- LVar ->- [SAlt] ->- CodeGeneration [SwitchBlock]-mkConsMatch pp getDefaultStmts var ((SConCase parentStackPos consIndex _ params branchExpression):cases) = do- pushScope- caseBranch <- mkCaseBinding pp var parentStackPos params branchExpression- popScope- otherBranches <- mkConsMatch pp getDefaultStmts var cases- return $- (SwitchBlock (SwitchCase $ jInt consIndex) caseBranch):otherBranches-mkConsMatch pp getDefaultStmts var (c:cases) = mkConsMatch pp getDefaultStmts var cases-mkConsMatch pp getDefaultStmts _ [] = do- defaultBlock <- getDefaultStmts pp- return $- [SwitchBlock Default defaultBlock]--mkCaseBinding :: BlockPostprocessor -> LVar -> Int -> [Name] -> SExp -> CodeGeneration [BlockStmt]-mkCaseBinding pp var stackStart params branchExpression =- mkExp pp (toLetIn var stackStart params branchExpression)- where- toLetIn :: LVar -> Int -> [Name] -> SExp -> SExp- toLetIn var stackStart members start =- foldr- (\ pos inExp -> SLet (Loc (stackStart + pos)) (SProj var pos) inExp)- start- [0.. (length members - 1)]---------------------------------------------------------------------------- Projection (retrieve the n-th field of an object)--mkProjection :: LVar -> Int -> CodeGeneration Exp-mkProjection var memberNr =- (\ var -> ArrayAccess $ ((var ~> "getData") []) @! memberNr)- <$> (Just idrisObjectType <>@! var)---------------------------------------------------------------------------- Constants--mkConstantArray :: (V.Unbox a) => J.Type -> (a -> Const) -> V.Vector a -> Exp-mkConstantArray cty elemToConst elems =- ArrayCreateInit- cty- 0- (ArrayInit . map (InitExp . mkConstant . elemToConst) $ V.toList elems)--mkConstant :: Const -> Exp-mkConstant c@(I x) = constType c <> (Lit . Word $ toInteger x)-mkConstant c@(BI x) = bigInteger (show x)-mkConstant c@(Fl x) = constType c <> (Lit . Double $ x)-mkConstant c@(Ch x) = constType c <> (Lit . Char $ x)-mkConstant c@(Str x) = constType c <> (Lit . String $ x)-mkConstant c@(B8 x) = constType c <> (Lit . Word $ toInteger x)-mkConstant c@(B16 x) = constType c <> (Lit . Word $ toInteger x)-mkConstant c@(B32 x) = constType c <> (Lit . Word $ toInteger x)-mkConstant c@(B64 x) = (bigInteger (show c) ~> "longValue") []-mkConstant c@(B8V x) = mkConstantArray (constType c) B8 x-mkConstant c@(B16V x) = mkConstantArray (constType c) B16 x-mkConstant c@(B32V x) = mkConstantArray (constType c) B32 x-mkConstant c@(B64V x) = mkConstantArray (constType c) B64 x-mkConstant c@(AType x) = ClassLit (Just $ box (constType c))-mkConstant c@(StrType ) = ClassLit (Just $ stringType)-mkConstant c@(PtrType ) = ClassLit (Just $ objectType)-mkConstant c@(ManagedPtrType) = ClassLit (Just $ objectType)-mkConstant c@(BufferType) = ClassLit (Just $ bufferType)-mkConstant c@(VoidType ) = ClassLit (Just $ voidType)-mkConstant c@(Forgot ) = ClassLit (Just $ objectType)---------------------------------------------------------------------------- Foreign function calls--mkForeign :: BlockPostprocessor -> FLang -> FType -> String -> [(FType, LVar)] -> CodeGeneration [BlockStmt]-mkForeign pp (LANG_C) resTy text params = mkForeign pp (LANG_JAVA FStatic) resTy text params-mkForeign pp (LANG_JAVA callType) resTy text params- | callType <- FStatic = do- method <- liftParsed (parser name text)- args <- foreignVarAccess params- wrapReturn resTy (call method args)- | callType <- FObject = do- method <- liftParsed (parser ident text)- (tgt:args) <- foreignVarAccess params- wrapReturn resTy ((tgt ~> (show $ pretty method)) args)- | callType <- FConstructor = do- clsTy <- liftParsed (parser classType text)- args <- foreignVarAccess params- wrapReturn resTy (InstanceCreation [] clsTy args Nothing)- where- foreignVarAccess args =- mapM (\ (fty, var) -> (foreignType fty <>@! var)) args-- pp' = rethrowAsRuntimeException pp-- wrapReturn FUnit exp =- ((ppInnerBlock pp') [BlockStmt $ ExpStmt exp] (Lit Null)) >>= ppOuterBlock pp'- wrapReturn _ exp =- ((ppInnerBlock pp') [] exp) >>= ppOuterBlock pp'---------------------------------------------------------------------------- Primitive functions--mkPrimitiveFunction :: PrimFn -> [LVar] -> CodeGeneration Exp-mkPrimitiveFunction op args =- (\ args -> (primFnType ~> opName op) (endiannessArguments op ++ args))- <$> sequence (zipWith (\ a t -> (Just t) <>@! a) args (sourceTypes op))--mkThread :: LVar -> CodeGeneration Exp-mkThread arg =- (\ closure -> (closure ~> "fork") []) <$> mkMethodCallClosure (sMN 0 "EVAL") [arg]--
src/IRTS/CodegenJavaScript.hs view
@@ -1213,6 +1213,8 @@ , (arg:_) <- args = jsCall "parseFloat" [translateReg arg] | (LIntFloat ITNative) <- op , (arg:_) <- args = translateReg arg+ | (LIntFloat ITBig) <- op+ , (arg:_) <- args = jsMeth (translateReg arg) "intValue" [] | (LFloatInt ITNative) <- op , (arg:_) <- args = translateReg arg | (LChInt ITNative) <- op@@ -1242,6 +1244,8 @@ , (arg:_) <- args = jsCall "Math.floor" [translateReg arg] | LFCeil <- op , (arg:_) <- args = jsCall "Math.ceil" [translateReg arg]+ | LFNegate <- op+ , (arg:_) <- args = JSPreOp "-" (translateReg arg) | LStrCons <- op , (lhs:rhs:_) <- args = invokeMeth lhs "concat" [rhs]
− src/IRTS/CodegenLLVM.hs
@@ -1,1320 +0,0 @@-{-# LANGUAGE GeneralizedNewtypeDeriving #-}-module IRTS.CodegenLLVM (codegenLLVM) where--import IRTS.CodegenCommon-import IRTS.Lang-import IRTS.Simplified-import IRTS.System-import qualified Idris.Core.TT as TT-import Idris.Core.TT (ArithTy(..), IntTy(..), NativeTy(..), nativeTyWidth)--import Util.System--import LLVM.General.Context-import LLVM.General.Diagnostic-import LLVM.General.AST-import LLVM.General.AST.AddrSpace-import LLVM.General.Target ( TargetMachine- , withTargetOptions, withTargetMachine, getTargetMachineDataLayout- , initializeAllTargets, lookupTarget- )-import LLVM.General.AST.DataLayout-import qualified LLVM.General.PassManager as PM-import qualified LLVM.General.Module as MO-import qualified LLVM.General.AST.IntegerPredicate as IPred-import qualified LLVM.General.AST.FloatingPointPredicate as FPred-import qualified LLVM.General.AST.Linkage as L-import qualified LLVM.General.AST.Visibility as V-import qualified LLVM.General.AST.CallingConvention as CC-import qualified LLVM.General.AST.Attribute as A-import qualified LLVM.General.AST.Global as G-import qualified LLVM.General.AST.Constant as C-import qualified LLVM.General.AST.Float as F-import qualified LLVM.General.Relocation as R-import qualified LLVM.General.CodeModel as CM-import qualified LLVM.General.CodeGenOpt as CGO--import Data.List-import Data.Maybe-import Data.Word-import Data.Map (Map)-import qualified Data.Map as M-import qualified Data.Set as S-import qualified Data.Vector.Unboxed as V-import Control.Applicative-import Control.Monad.RWS-import Control.Monad.Writer-import Control.Monad.State-import Control.Monad.Error--import qualified System.Info as SI (arch, os)-import System.IO-import System.Directory (removeFile)-import System.FilePath ((</>))-import System.Process (rawSystem)-import System.Exit (ExitCode(..))-import Debug.Trace--data Target = Target { triple :: String, dataLayout :: DataLayout }--codegenLLVM :: CodeGenerator-codegenLLVM ci = codegenLLVM' (simpleDecls ci) (targetTriple ci)- (targetCPU ci) (optimisation ci)- (outputFile ci) (outputType ci)--codegenLLVM' :: [(TT.Name, SDecl)] ->- String -> -- target triple- String -> -- target CPU- Word -> -- Optimization degree- FilePath -> -- output file name- OutputType ->- IO ()-codegenLLVM' defs triple cpu optimize file outty = withContext $ \context -> do- initializeAllTargets- (target, _) <- failInIO $ lookupTarget Nothing triple- withTargetOptions $ \options ->- withTargetMachine target triple cpu S.empty options R.Default CM.Default CGO.Default $ \tm ->- do layout <- getTargetMachineDataLayout tm- let ast = codegen (Target triple layout) (map snd defs)- result <- runErrorT . MO.withModuleFromAST context ast $ \m ->- do let opts = PM.defaultCuratedPassSetSpec- { PM.optLevel = Just optimize- , PM.simplifyLibCalls = Just True- , PM.useInlinerWithThreshold = Just 225- }- when (optimize /= 0) $ PM.withPassManager opts $ void . flip PM.runPassManager m- outputModule tm file outty m- case result of- Right _ -> return ()- Left msg -> ierror msg--failInIO :: ErrorT String IO a -> IO a-failInIO = either fail return <=< runErrorT--outputModule :: TargetMachine -> FilePath -> OutputType -> MO.Module -> IO ()-outputModule _ file Raw m = failInIO $ MO.writeBitcodeToFile file m-outputModule tm file Object m = failInIO $ MO.writeObjectToFile tm file m-outputModule tm file Executable m = withTmpFile $ \obj -> do- outputModule tm obj Object m- cc <- getCC- defs <- (</> "llvm" </> "libidris_rts.a") <$> getDataDir- exit <- rawSystem cc [obj, defs, "-lm", "-lgmp", "-lgc", "-o", file]- when (exit /= ExitSuccess) $ ierror "FAILURE: Linking"-outputModule _ _ MavenProject _ = ierror "FAILURE: unsupported output type"--withTmpFile :: (FilePath -> IO a) -> IO a-withTmpFile f = do- (path, handle) <- tempfile- hClose handle- result <- f path- removeFile path- return result--ierror :: String -> a-ierror msg = error $ "INTERNAL ERROR: IRTS.CodegenLLVM: " ++ msg--mainDef :: Global-mainDef =- functionDefaults- { G.returnType = IntegerType 32- , G.parameters =- ([ Parameter (IntegerType 32) (Name "argc") []- , Parameter (PointerType (PointerType (IntegerType 8) (AddrSpace 0)) (AddrSpace 0)) (Name "argv") []- ], False)- , G.name = Name "main"- , G.basicBlocks =- [ BasicBlock (UnName 0)- [ Do $ simpleCall "GC_init" [] -- Initialize Boehm GC- , Do $ simpleCall "__gmp_set_memory_functions"- [ ConstantOperand . C.GlobalReference . Name $ "__idris_gmpMalloc"- , ConstantOperand . C.GlobalReference . Name $ "__idris_gmpRealloc"- , ConstantOperand . C.GlobalReference . Name $ "__idris_gmpFree"- ]- , Do $ Store False (ConstantOperand . C.GlobalReference . Name $ "__idris_argc") - (LocalReference (Name "argc")) Nothing 0 []- , Do $ Store False (ConstantOperand . C.GlobalReference . Name $ "__idris_argv") - (LocalReference (Name "argv")) Nothing 0 []- , UnName 1 := idrCall "{runMain0}" [] ]- (Do $ Ret (Just (ConstantOperand (C.Int 32 0))) [])- ]}--initDefs :: Target -> [Definition]-initDefs tgt =- [ TypeDefinition (Name "valTy")- (Just $ StructureType False- [ IntegerType 32- , ArrayType 0 (PointerType valueType (AddrSpace 0))- ])- , TypeDefinition (Name "mpz")- (Just $ StructureType False- [ IntegerType 32- , IntegerType 32- , PointerType intPtr (AddrSpace 0)- ])- , GlobalDefinition $ globalVariableDefaults- { G.name = Name "__idris_intFmtStr"- , G.linkage = L.Internal- , G.isConstant = True- , G.hasUnnamedAddr = True- , G.type' = ArrayType 5 (IntegerType 8)- , G.initializer = Just $ C.Array (IntegerType 8) (map (C.Int 8 . fromIntegral . fromEnum) "%lld" ++ [C.Int 8 0])- }- , rtsFun "intStr" ptrI8 [IntegerType 64]- [ BasicBlock (UnName 0)- [ UnName 1 := simpleCall "GC_malloc_atomic" [ConstantOperand (C.Int (tgtWordSize tgt) 21)]- , UnName 2 := simpleCall "snprintf"- [ LocalReference (UnName 1)- , ConstantOperand (C.Int (tgtWordSize tgt) 21)- , ConstantOperand $ C.GetElementPtr True (C.GlobalReference . Name $ "__idris_intFmtStr") [C.Int 32 0, C.Int 32 0]- , LocalReference (UnName 0)- ]- ]- (Do $ Ret (Just (LocalReference (UnName 1))) [])- ]- , GlobalDefinition $ globalVariableDefaults- { G.name = Name "__idris_floatFmtStr"- , G.linkage = L.Internal- , G.isConstant = True- , G.hasUnnamedAddr = True- , G.type' = ArrayType 5 (IntegerType 8)- , G.initializer = Just $ C.Array (IntegerType 8) (map (C.Int 8 . fromIntegral . fromEnum) "%g" ++ [C.Int 8 0])- }- , rtsFun "floatStr" ptrI8 [FloatingPointType 64 IEEE]- [ BasicBlock (UnName 0)- [ UnName 1 := simpleCall "GC_malloc_atomic" [ConstantOperand (C.Int (tgtWordSize tgt) 21)]- , UnName 2 := simpleCall "snprintf"- [ LocalReference (UnName 1)- , ConstantOperand (C.Int (tgtWordSize tgt) 21)- , ConstantOperand $ C.GetElementPtr True (C.GlobalReference . Name $ "__idris_floatFmtStr") [C.Int 32 0, C.Int 32 0]- , LocalReference (UnName 0)- ]- ]- (Do $ Ret (Just (LocalReference (UnName 1))) [])- ]- , exfun "llvm.sin.f64" (FloatingPointType 64 IEEE) [ FloatingPointType 64 IEEE ] False- , exfun "llvm.cos.f64" (FloatingPointType 64 IEEE) [ FloatingPointType 64 IEEE ] False- , exfun "llvm.pow.f64" (FloatingPointType 64 IEEE) [ FloatingPointType 64 IEEE ] False- , exfun "llvm.ceil.f64" (FloatingPointType 64 IEEE) [ FloatingPointType 64 IEEE ] False- , exfun "llvm.floor.f64" (FloatingPointType 64 IEEE) [ FloatingPointType 64 IEEE ] False- , exfun "llvm.exp.f64" (FloatingPointType 64 IEEE) [ FloatingPointType 64 IEEE ] False- , exfun "llvm.log.f64" (FloatingPointType 64 IEEE) [ FloatingPointType 64 IEEE ] False- , exfun "llvm.sqrt.f64" (FloatingPointType 64 IEEE) [ FloatingPointType 64 IEEE ] False- , exfun "tan" (FloatingPointType 64 IEEE) [ FloatingPointType 64 IEEE ] False- , exfun "asin" (FloatingPointType 64 IEEE) [ FloatingPointType 64 IEEE ] False- , exfun "acos" (FloatingPointType 64 IEEE) [ FloatingPointType 64 IEEE ] False- , exfun "atan" (FloatingPointType 64 IEEE) [ FloatingPointType 64 IEEE ] False- , exfun "llvm.trap" VoidType [] False- -- , exfun "llvm.llvm.memcpy.p0i8.p0i8.i32" VoidType [ptrI8, ptrI8, IntegerType 32, IntegerType 32, IntegerType 1] False- -- , exfun "llvm.llvm.memcpy.p0i8.p0i8.i64" VoidType [ptrI8, ptrI8, IntegerType 64, IntegerType 32, IntegerType 1] False- , exfun "memcpy" ptrI8 [ptrI8, ptrI8, intPtr] False- , exfun "llvm.invariant.start" (PointerType (StructureType False []) (AddrSpace 0)) [IntegerType 64, ptrI8] False- , exfun "snprintf" (IntegerType 32) [ptrI8, intPtr, ptrI8] True- , exfun "strcmp" (IntegerType 32) [ptrI8, ptrI8] False- , exfun "strlen" intPtr [ptrI8] False- , exfun "GC_init" VoidType [] False- , exfun "GC_malloc" ptrI8 [intPtr] False- , exfun "GC_malloc_atomic" ptrI8 [intPtr] False- , exfun "__gmp_set_memory_functions" VoidType- [ PointerType (FunctionType ptrI8 [intPtr] False) (AddrSpace 0)- , PointerType (FunctionType ptrI8 [ptrI8, intPtr, intPtr] False) (AddrSpace 0)- , PointerType (FunctionType VoidType [ptrI8, intPtr] False) (AddrSpace 0)- ] False- , exfun "__gmpz_init" VoidType [pmpz] False- , exfun "__gmpz_init_set_str" (IntegerType 32) [pmpz, ptrI8, IntegerType 32] False- , exfun "__gmpz_get_str" ptrI8 [ptrI8, IntegerType 32, pmpz] False- , exfun "__gmpz_get_ui" intPtr [pmpz] False- , exfun "__gmpz_cmp" (IntegerType 32) [pmpz, pmpz] False- , exfun "__gmpz_fdiv_q_2exp" VoidType [pmpz, pmpz, intPtr] False- , exfun "__gmpz_mul_2exp" VoidType [pmpz, pmpz, intPtr] False- , exfun "__gmpz_get_d" (FloatingPointType 64 IEEE) [pmpz] False- , exfun "__gmpz_set_d" VoidType [pmpz, FloatingPointType 64 IEEE] False- , exfun "mpz_get_ull" (IntegerType 64) [pmpz] False- , exfun "mpz_init_set_ull" VoidType [pmpz, IntegerType 64] False- , exfun "mpz_init_set_sll" VoidType [pmpz, IntegerType 64] False- , exfun "__idris_strCons" ptrI8 [IntegerType 8, ptrI8] False- , exfun "__idris_readStr" ptrI8 [ptrI8] False -- Actually pointer to FILE, but it's opaque anyway- , exfun "__idris_gmpMalloc" ptrI8 [intPtr] False- , exfun "__idris_gmpRealloc" ptrI8 [ptrI8, intPtr, intPtr] False- , exfun "__idris_gmpFree" VoidType [ptrI8, intPtr] False- , exfun "__idris_strRev" ptrI8 [ptrI8] False- , exfun "strtoll" (IntegerType 64) [ptrI8, PointerType ptrI8 (AddrSpace 0), IntegerType 32] False- , exfun "putErr" VoidType [ptrI8] False- , exVar (stdinName tgt) ptrI8- , exVar (stdoutName tgt) ptrI8- , exVar (stderrName tgt) ptrI8- , exVar "__idris_argc" (IntegerType 32)- , exVar "__idris_argv" (PointerType ptrI8 (AddrSpace 0))- , GlobalDefinition mainDef- ] ++ map mpzBinFun ["add", "sub", "mul", "fdiv_q", "fdiv_r", "and", "ior", "xor"]- where- intPtr = IntegerType (tgtWordSize tgt)- ptrI8 = PointerType (IntegerType 8) (AddrSpace 0)- pmpz = PointerType mpzTy (AddrSpace 0)-- mpzBinFun n = exfun ("__gmpz_" ++ n) VoidType [pmpz, pmpz, pmpz] False-- rtsFun :: String -> Type -> [Type] -> [BasicBlock] -> Definition- rtsFun name rty argtys def =- GlobalDefinition $ functionDefaults- { G.linkage = L.Internal- , G.returnType = rty- , G.parameters = (flip map argtys $ \ty -> Parameter ty (UnName 0) [], False)- , G.name = Name $ "__idris_" ++ name- , G.basicBlocks = def- }-- exfun :: String -> Type -> [Type] -> Bool -> Definition- exfun name rty argtys vari =- GlobalDefinition $ functionDefaults- { G.returnType = rty- , G.name = Name name- , G.parameters = (flip map argtys $ \ty -> Parameter ty (UnName 0) [], vari)- }- exVar :: String -> Type -> Definition- exVar name ty = GlobalDefinition $ globalVariableDefaults { G.name = Name name, G.type' = ty }--isApple :: Target -> Bool-isApple (Target { triple = t }) = isJust . stripPrefix "-apple" $ dropWhile (/= '-') t--stdinName, stdoutName, stderrName :: Target -> String-stdinName t | isApple t = "__stdinp"-stdinName _ = "stdin"-stdoutName t | isApple t = "__stdoutp"-stdoutName _ = "stdout"-stderrName t | isApple t = "__stderrp"-stderrName _ = "stderr"--getStdIn, getStdOut, getStdErr :: Codegen Operand-getStdIn = ConstantOperand . C.GlobalReference . Name . stdinName <$> asks target-getStdOut = ConstantOperand . C.GlobalReference . Name . stdoutName <$> asks target-getStdErr = ConstantOperand . C.GlobalReference . Name . stderrName <$> asks target--codegen :: Target -> [SDecl] -> Module-codegen tgt defs = Module "idris" (Just . dataLayout $ tgt) (Just . triple $ tgt) (initDefs tgt ++ globals ++ gendefs)- where- (gendefs, _, globals) = runRWS (mapM cgDef defs) tgt initialMGS--valueType :: Type-valueType = NamedTypeReference (Name "valTy")--nullValue :: C.Constant-nullValue = C.Null (PointerType valueType (AddrSpace 0))--primTy :: Type -> Type-primTy inner = StructureType False [IntegerType 32, inner]--mpzTy :: Type-mpzTy = NamedTypeReference (Name "mpz")--conType :: Word64 -> Type-conType nargs = StructureType False- [ IntegerType 32- , ArrayType nargs (PointerType valueType (AddrSpace 0))- ]--data MGS = MGS { mgsNextGlobalName :: Word- , mgsForeignSyms :: Map String (FType, [FType])- }--type Modgen = RWS Target [Definition] MGS--initialMGS :: MGS-initialMGS = MGS { mgsNextGlobalName = 0- , mgsForeignSyms = M.empty- }--cgDef :: SDecl -> Modgen Definition-cgDef (SFun name argNames _ expr) = do- nextGlobal <- gets mgsNextGlobalName- existingForeignSyms <- gets mgsForeignSyms- tgt <- ask- let (_, CGS { nextGlobalName = nextGlobal', foreignSyms = foreignSyms' }, (allocas, bbs, globals)) =- runRWS (do r <- cgExpr expr- case r of- Nothing -> terminate $ Unreachable []- Just r' -> terminate $ Ret (Just r') [])- (CGR tgt (show name))- (CGS 0 nextGlobal (Name "begin") [] (map (Just . LocalReference . Name . show) argNames) existingForeignSyms)- entryTerm = case bbs of- [] -> Do $ Ret Nothing []- BasicBlock n _ _:_ -> Do $ Br n []- tell globals- put (MGS { mgsNextGlobalName = nextGlobal', mgsForeignSyms = foreignSyms' })- return . GlobalDefinition $ functionDefaults- { G.linkage = L.Internal- , G.callingConvention = CC.Fast- , G.name = Name (show name)- , G.returnType = PointerType valueType (AddrSpace 0)- , G.parameters = (flip map argNames $ \argName ->- Parameter (PointerType valueType (AddrSpace 0)) (Name (show argName)) []- , False)- , G.basicBlocks =- BasicBlock (Name "entry")- (map (\(n, t) -> n := Alloca t Nothing 0 []) allocas)- entryTerm- : bbs- }--type CGW = ([(Name, Type)], [BasicBlock], [Definition])--type Env = [Maybe Operand]--data CGS = CGS { nextName :: Word- , nextGlobalName :: Word- , currentBlockName :: Name- , instAccum :: [Named Instruction]- , lexenv :: Env- , foreignSyms :: Map String (FType, [FType])- }--data CGR = CGR { target :: Target- , funcName :: String }--type Codegen = RWS CGR CGW CGS--getFuncName :: Codegen String-getFuncName = asks funcName--getGlobalUnName :: Codegen Name-getGlobalUnName = do- i <- gets nextGlobalName- modify $ \s -> s { nextGlobalName = 1 + i }- return (UnName i)--getUnName :: Codegen Name-getUnName = do- i <- gets nextName- modify $ \s -> s { nextName = 1 + i }- return (UnName i)--getName :: String -> Codegen Name-getName n = do- i <- gets nextName- modify $ \s -> s { nextName = 1 + i }- return (Name $ n ++ show i)--alloca :: Name -> Type -> Codegen ()-alloca n t = tell ([(n, t)], [], [])--terminate :: Terminator -> Codegen ()-terminate term = do- name <- gets currentBlockName- insts <- gets instAccum- modify $ \s -> s { instAccum = ierror "Not in a block"- , currentBlockName = ierror "Not in a block" }- tell ([], [BasicBlock name insts (Do term)], [])--newBlock :: Name -> Codegen ()-newBlock name = modify $ \s -> s { instAccum = []- , currentBlockName = name- }--inst :: Instruction -> Codegen Operand-inst i = do- n <- getUnName- modify $ \s -> s { instAccum = instAccum s ++ [n := i] }- return $ LocalReference n--ninst :: String -> Instruction -> Codegen Operand-ninst name i = do- n <- getName name- modify $ \s -> s { instAccum = instAccum s ++ [n := i] }- return $ LocalReference n--inst' :: Instruction -> Codegen ()-inst' i = modify $ \s -> s { instAccum = instAccum s ++ [Do i] }--insts :: [Named Instruction] -> Codegen ()-insts is = modify $ \s -> s { instAccum = instAccum s ++ is }--var :: LVar -> Codegen (Maybe Operand)-var (Loc level) = (!! level) <$> gets lexenv-var (Glob n) = return . Just . ConstantOperand . C.GlobalReference . Name $ show n--binds :: Env -> Codegen (Maybe Operand) -> Codegen (Maybe Operand)-binds vals cg = do- envLen <- length <$> gets lexenv- modify $ \s -> s { lexenv = lexenv s ++ vals }- value <- cg- modify $ \s -> s { lexenv = take envLen $ lexenv s }- return value--replaceElt :: Int -> a -> [a] -> [a]-replaceElt _ val [] = error "replaceElt: Ran out of list"-replaceElt 0 val (x:xs) = val:xs-replaceElt n val (x:xs) = x : replaceElt (n-1) val xs--alloc' :: Operand -> Codegen Operand-alloc' size = inst $ simpleCall "GC_malloc" [size]--allocAtomic' :: Operand -> Codegen Operand-allocAtomic' size = inst $ simpleCall "GC_malloc_atomic" [size]--alloc :: Type -> Codegen Operand-alloc ty = do- size <- sizeOf ty- mem <- alloc' size- inst $ BitCast mem (PointerType ty (AddrSpace 0)) []--allocAtomic :: Type -> Codegen Operand-allocAtomic ty = do- size <- sizeOf ty- mem <- allocAtomic' size- inst $ BitCast mem (PointerType ty (AddrSpace 0)) []--sizeOf :: Type -> Codegen Operand-sizeOf ty = ConstantOperand . C.PtrToInt- (C.GetElementPtr True (C.Null (PointerType ty (AddrSpace 0))) [C.Int 32 1])- . IntegerType <$> getWordSize--loadInv :: Operand -> Instruction-loadInv ptr = Load False ptr Nothing 0 [("invariant.load", MetadataNode [])]--tgtWordSize :: Target -> Word32-tgtWordSize (Target { dataLayout = DataLayout { pointerLayouts = l } }) =- fst . fromJust $ M.lookup (AddrSpace 0) l--getWordSize :: Codegen Word32-getWordSize = tgtWordSize <$> asks target--cgExpr :: SExp -> Codegen (Maybe Operand)-cgExpr (SV v) = var v-cgExpr (SApp tailcall fname args) = do- argSlots <- mapM var args- case sequence argSlots of- Nothing -> return Nothing- Just argVals -> do- fn <- var (Glob fname)- Just <$> inst ((idrCall (show fname) argVals) { isTailCall = tailcall })-cgExpr (SLet _ varExpr bodyExpr) = do- val <- cgExpr varExpr- binds [val] $ cgExpr bodyExpr-cgExpr (SUpdate (Loc level) expr) = do- val <- cgExpr expr- modify $ \s -> s { lexenv = replaceElt level val (lexenv s) }- return val-cgExpr (SUpdate x expr) = cgExpr expr-cgExpr (SCon _ tag name args) = do- argSlots <- mapM var args- case sequence argSlots of- Nothing -> return Nothing- Just argVals -> do- let ty = conType . fromIntegral . length $ argVals- con <- alloc ty- tagPtr <- inst $ GetElementPtr True con [ConstantOperand (C.Int 32 0), ConstantOperand (C.Int 32 0)] []- inst' $ Store False tagPtr (ConstantOperand (C.Int 32 (fromIntegral tag))) Nothing 0 []- forM_ (zip argVals [0..]) $ \(arg, i) -> do- ptr <- inst $ GetElementPtr True con [ ConstantOperand (C.Int 32 0)- , ConstantOperand (C.Int 32 1)- , ConstantOperand (C.Int 32 i)] []- inst' $ Store False ptr arg Nothing 0 []- ptrI8 <- inst $ BitCast con (PointerType (IntegerType 8) (AddrSpace 0)) []- inst' $ simpleCall "llvm.invariant.start" [ConstantOperand $ C.Int 64 (-1), ptrI8]- Just <$> inst (BitCast con (PointerType valueType (AddrSpace 0)) [])-cgExpr (SCase _ inspect alts) = do- val <- var inspect- case val of- Nothing -> return Nothing- Just v -> cgCase v alts-cgExpr (SChkCase inspect alts) = do- mval <- var inspect- case mval of- Nothing -> return Nothing- Just val ->- do endBBN <- getName "endChkCase"- notNullBBN <- getName "notNull"- originBlock <- gets currentBlockName- isNull <- inst $ ICmp IPred.EQ val (ConstantOperand nullValue) []- terminate $ CondBr isNull endBBN notNullBBN []- newBlock notNullBBN- ptr <- inst $ BitCast val (PointerType (IntegerType 32) (AddrSpace 0)) []- flag <- inst $ Load False ptr Nothing 0 []- isVal <- inst $ ICmp IPred.EQ flag (ConstantOperand (C.Int 32 (-1))) []- conBBN <- getName "constructor"- terminate $ CondBr isVal endBBN conBBN []- newBlock conBBN- result <- cgCase val alts- caseExitBlock <- gets currentBlockName- case result of- Nothing -> do- terminate $ Unreachable []- newBlock endBBN- return $ Just val- Just caseVal -> do- terminate $ Br endBBN []- newBlock endBBN- Just <$> inst (Phi (PointerType valueType (AddrSpace 0))- [(val, originBlock), (val, notNullBBN), (caseVal, caseExitBlock)] [])-cgExpr (SProj conVar idx) = do- val <- var conVar- case val of- Nothing -> return Nothing- Just v ->- do ptr <- inst $ GetElementPtr True v- [ ConstantOperand (C.Int 32 0)- , ConstantOperand (C.Int 32 1)- , ConstantOperand (C.Int 32 (fromIntegral idx))- ] []- Just <$> inst (Load False ptr Nothing 0 [])-cgExpr (SConst c) = Just <$> cgConst c-cgExpr (SForeign LANG_C rty fname args) = do- func <- ensureCDecl fname rty (map fst args)- argVals <- forM args $ \(fty, v) -> do- v' <- var v- case v' of- Just val -> return $ Just (fty, val)- Nothing -> return Nothing- case sequence argVals of- Nothing -> return Nothing- Just argVals' -> do- argUVals <- mapM (uncurry unbox) argVals'- result <- inst Call { isTailCall = False- , callingConvention = CC.C- , returnAttributes = []- , function = Right func- , arguments = map (\v -> (v, [])) argUVals- , functionAttributes = []- , metadata = []- }- Just <$> box rty result-cgExpr (SOp fn args) = do- argVals <- mapM var args- case sequence argVals of- Just ops -> Just <$> cgOp fn ops- Nothing -> return Nothing-cgExpr SNothing = return . Just . ConstantOperand $ nullValue-cgExpr (SError msg) = do- str <- addGlobal' (ArrayType (2 + fromIntegral (length msg)) (IntegerType 8))- (cgConst' (TT.Str (msg ++ "\n")))- inst' $ simpleCall "putErr" [ConstantOperand $ C.GetElementPtr True str [ C.Int 32 0- , C.Int 32 0]]- inst' Call { isTailCall = True- , callingConvention = CC.C- , returnAttributes = []- , function = Right . ConstantOperand . C.GlobalReference . Name $ "llvm.trap"- , arguments = []- , functionAttributes = [A.NoReturn]- , metadata = []- }- return Nothing--cgCase :: Operand -> [SAlt] -> Codegen (Maybe Operand)-cgCase val alts =- case find isConstCase alts of- Just (SConstCase (TT.BI _) _) -> cgChainCase val defExp constAlts- Just (SConstCase (TT.Str _) _) -> cgChainCase val defExp constAlts- Just (SConstCase _ _) -> cgPrimCase val defExp constAlts- Nothing -> cgConCase val defExp conAlts- where- defExp = getDefExp =<< find isDefCase alts- constAlts = filter isConstCase alts- conAlts = filter isConCase alts-- isConstCase (SConstCase {}) = True- isConstCase _ = False-- isConCase (SConCase {}) = True- isConCase _ = False-- isDefCase (SDefaultCase _) = True- isDefCase _ = False-- getDefExp (SDefaultCase e) = Just e- getDefExp _ = Nothing--cgPrimCase :: Operand -> Maybe SExp -> [SAlt] -> Codegen (Maybe Operand)-cgPrimCase caseValPtr defExp alts = do- let caseTy = case head alts of- SConstCase (TT.I _) _ -> IntegerType 32- SConstCase (TT.B8 _) _ -> IntegerType 8- SConstCase (TT.B16 _) _ -> IntegerType 16- SConstCase (TT.B32 _) _ -> IntegerType 32- SConstCase (TT.B64 _) _ -> IntegerType 64- SConstCase (TT.Fl _) _ -> FloatingPointType 64 IEEE- SConstCase (TT.Ch _) _ -> IntegerType 32- realPtr <- inst $ BitCast caseValPtr (PointerType (primTy caseTy) (AddrSpace 0)) []- valPtr <- inst $ GetElementPtr True realPtr [ConstantOperand (C.Int 32 0), ConstantOperand (C.Int 32 1)] []- caseVal <- inst $ Load False valPtr Nothing 0 []- defBlockName <- getName "default"- exitBlockName <- getName "caseExit"- namedAlts <- mapM (\a -> do n <- nameAlt defBlockName a; return (n, a)) alts- terminate $ Switch caseVal defBlockName (map (\(n, SConstCase c _) -> (cgConst' c, n)) namedAlts) []- initEnv <- gets lexenv- defResult <- cgDefaultAlt exitBlockName defBlockName defExp- results <- forM namedAlts $ \(name, SConstCase _ exp) -> cgAlt initEnv exitBlockName name Nothing exp- finishCase initEnv exitBlockName (defResult:results)--cgConCase :: Operand -> Maybe SExp -> [SAlt] -> Codegen (Maybe Operand)-cgConCase con defExp alts = do- tagPtr <- inst $ GetElementPtr True con [ConstantOperand (C.Int 32 0), ConstantOperand (C.Int 32 0)] []- tag <- inst $ Load False tagPtr Nothing 0 []- defBlockName <- getName "default"- exitBlockName <- getName "caseExit"- namedAlts <- mapM (\a -> do n <- nameAlt defBlockName a; return (n, a)) alts- terminate $ Switch tag defBlockName (map (\(n, SConCase _ tag _ _ _) ->- (C.Int 32 (fromIntegral tag), n)) namedAlts) []- initEnv <- gets lexenv- defResult <- cgDefaultAlt exitBlockName defBlockName defExp- results <- forM namedAlts $ \(name, SConCase _ _ _ argns exp) ->- cgAlt initEnv exitBlockName name (Just (con, map show argns)) exp- finishCase initEnv exitBlockName (defResult:results)--cgChainCase :: Operand -> Maybe SExp -> [SAlt] -> Codegen (Maybe Operand)-cgChainCase caseValPtr defExp alts = do- let (caseTy, comparator) =- case head alts of- SConstCase (TT.BI _) _ -> (FArith (ATInt ITBig), "__gmpz_cmp")- SConstCase (TT.Str _) _ -> (FString, "strcmp")- caseVal <- unbox caseTy caseValPtr- defBlockName <- getName "default"- exitBlockName <- getName "caseExit"- namedAlts <- mapM (\a -> do n <- nameAlt defBlockName a; return (n, a)) alts- initEnv <- gets lexenv- results <- forM namedAlts $ \(name, SConstCase c e) ->- do const <- unbox caseTy =<< cgConst c- cmp <- inst $ simpleCall comparator [const, caseVal]- cmpResult <- inst $ ICmp IPred.EQ cmp (ConstantOperand (C.Int 32 0)) []- elseName <- getName "else"- terminate $ CondBr cmpResult name elseName []- result <- cgAlt initEnv exitBlockName name Nothing e- newBlock elseName- return result- modify $ \s -> s { lexenv = initEnv }- fname <- getFuncName- defaultVal <- cgExpr (fromMaybe (SError $ "Inexhaustive case failure in " ++ fname) defExp)- defaultBlock <- gets currentBlockName- defaultEnv <- gets lexenv- defResult <- case defaultVal of- Just v -> do- terminate $ Br exitBlockName []- return $ Just (v, defaultBlock, defaultEnv)- Nothing -> do- terminate $ Unreachable []- return Nothing- finishCase initEnv exitBlockName (defResult:results)--finishCase :: Env -> Name -> [Maybe (Operand, Name, Env)] -> Codegen (Maybe Operand)-finishCase initEnv exitBlockName results = do- let definedResults = mapMaybe id results- case definedResults of- [] -> do modify $ \s -> s { lexenv = initEnv }- return Nothing- xs -> do- newBlock exitBlockName- mergeEnvs $ map (\(_, altBlock, altEnv) -> (altBlock, altEnv)) xs- Just <$> inst (Phi (PointerType valueType (AddrSpace 0))- (map (\(altVal, altBlock, _) -> (altVal, altBlock)) xs) [])---cgDefaultAlt :: Name -> Name -> Maybe SExp -> Codegen (Maybe (Operand, Name, Env))-cgDefaultAlt exitName name exp = do- newBlock name- fname <- getFuncName- val <- cgExpr (fromMaybe (SError $ "Inexhaustive case failure in " ++ fname) exp)- env <- gets lexenv- block <- gets currentBlockName- case val of- Just v ->- do terminate $ Br exitName []- return $ Just (v, block, env)- Nothing ->- do terminate $ Unreachable []- return Nothing--cgAlt :: Env -> Name -> Name -> Maybe (Operand, [String]) -> SExp- -> Codegen (Maybe (Operand, Name, Env))-cgAlt initEnv exitBlockName name destr exp = do- modify $ \s -> s { lexenv = initEnv }- newBlock name- locals <- case destr of- Nothing -> return []- Just (con, argns) ->- forM (zip argns [0..]) $ \(argName, i) ->- do ptr <- inst $ GetElementPtr True con [ ConstantOperand (C.Int 32 0)- , ConstantOperand (C.Int 32 1)- , ConstantOperand (C.Int 32 i)] []- Just <$> ninst argName (Load False ptr Nothing 0 [])- altVal <- binds locals $ cgExpr exp- altEnv <- gets lexenv- altBlock <- gets currentBlockName- case altVal of- Just v -> do- terminate $ Br exitBlockName []- return $ Just (v, altBlock, altEnv)- Nothing -> do- terminate $ Unreachable []- return Nothing--mergeEnvs :: [(Name, Env)] -> Codegen ()-mergeEnvs es = do- let vars = transpose- . map (\(block, env) -> map (\x -> (x, block)) env)- $ es- env <- forM vars $ \var ->- case var of- [] -> ierror "mergeEnvs: impossible"- [(v, _)] -> return v- vs@((v, _):_)- | all (== v) (map fst vs) -> return v- | otherwise ->- let valid = map (\(a, b) -> (fromJust a, b)) . filter (isJust . fst) $ vs in- Just <$> inst (Phi (PointerType valueType (AddrSpace 0)) valid [])- modify $ \s -> s { lexenv = env }--nameAlt :: Name -> SAlt -> Codegen Name-nameAlt d (SDefaultCase _) = return d-nameAlt _ (SConCase _ _ name _ _) = getName (show name)-nameAlt _ (SConstCase const _) = getName (show const)--isHeapFTy :: FType -> Bool-isHeapFTy f = elem f [FString, FPtr, FAny, FArith (ATInt ITBig)]--box :: FType -> Operand -> Codegen Operand-box FUnit _ = return $ ConstantOperand nullValue-box fty fval = do- let ty = primTy (ftyToTy fty)- val <- if isHeapFTy fty then alloc ty else allocAtomic ty- tagptr <- inst $ GetElementPtr True val [ConstantOperand (C.Int 32 0), ConstantOperand (C.Int 32 0)] []- valptr <- inst $ GetElementPtr True val [ConstantOperand (C.Int 32 0), ConstantOperand (C.Int 32 1)] []- inst' $ Store False tagptr (ConstantOperand (C.Int 32 (-1))) Nothing 0 []- inst' $ Store False valptr fval Nothing 0 []- ptrI8 <- inst $ BitCast val (PointerType (IntegerType 8) (AddrSpace 0)) []- inst' $ simpleCall "llvm.invariant.start" [ConstantOperand $ C.Int 64 (-1), ptrI8]- inst $ BitCast val (PointerType valueType (AddrSpace 0)) []--unbox :: FType -> Operand -> Codegen Operand-unbox FUnit x = return x-unbox fty bval = do- val <- inst $ BitCast bval (PointerType (primTy (ftyToTy fty)) (AddrSpace 0)) []- fvalptr <- inst $ GetElementPtr True val [ConstantOperand (C.Int 32 0), ConstantOperand (C.Int 32 1)] []- inst $ Load False fvalptr Nothing 0 []--cgConst' :: TT.Const -> C.Constant-cgConst' (TT.I i) = C.Int 32 (fromIntegral i)-cgConst' (TT.B8 i) = C.Int 8 (fromIntegral i)-cgConst' (TT.B16 i) = C.Int 16 (fromIntegral i)-cgConst' (TT.B32 i) = C.Int 32 (fromIntegral i)-cgConst' (TT.B64 i) = C.Int 64 (fromIntegral i)-cgConst' (TT.B8V v) = C.Vector (map ((C.Int 8) . fromIntegral) . V.toList $ v)-cgConst' (TT.B16V v) = C.Vector (map ((C.Int 16) . fromIntegral) . V.toList $ v)-cgConst' (TT.B32V v) = C.Vector (map ((C.Int 32) . fromIntegral) . V.toList $ v)-cgConst' (TT.B64V v) = C.Vector (map ((C.Int 64) . fromIntegral) . V.toList $ v)--cgConst' (TT.BI i) = C.Array (IntegerType 8) (map (C.Int 8 . fromIntegral . fromEnum) (show i) ++ [C.Int 8 0])-cgConst' (TT.Fl f) = C.Float (F.Double f)-cgConst' (TT.Ch c) = C.Int 32 . fromIntegral . fromEnum $ c-cgConst' (TT.Str s) = C.Array (IntegerType 8) (map (C.Int 8 . fromIntegral . fromEnum) s ++ [C.Int 8 0])-cgConst' x = ierror $ "Unsupported constant: " ++ show x--cgConst :: TT.Const -> Codegen Operand-cgConst c@(TT.I _) = box (FArith (ATInt ITNative)) (ConstantOperand $ cgConst' c)-cgConst c@(TT.B8 _) = box (FArith (ATInt (ITFixed IT8))) (ConstantOperand $ cgConst' c)-cgConst c@(TT.B16 _) = box (FArith (ATInt (ITFixed IT16))) (ConstantOperand $ cgConst' c)-cgConst c@(TT.B32 _) = box (FArith (ATInt (ITFixed IT32))) (ConstantOperand $ cgConst' c)-cgConst c@(TT.B64 _) = box (FArith (ATInt (ITFixed IT64))) (ConstantOperand $ cgConst' c)-cgConst c@(TT.B8V v) = box (FArith (ATInt (ITVec IT8 (V.length v)))) (ConstantOperand $ cgConst' c)-cgConst c@(TT.B16V v) = box (FArith (ATInt (ITVec IT16 (V.length v)))) (ConstantOperand $ cgConst' c)-cgConst c@(TT.B32V v) = box (FArith (ATInt (ITVec IT32 (V.length v)))) (ConstantOperand $ cgConst' c)-cgConst c@(TT.B64V v) = box (FArith (ATInt (ITVec IT64 (V.length v)))) (ConstantOperand $ cgConst' c)-cgConst c@(TT.Fl _) = box (FArith ATFloat) (ConstantOperand $ cgConst' c)-cgConst c@(TT.Ch _) = box (FArith (ATInt ITChar)) (ConstantOperand $ cgConst' c)-cgConst c@(TT.Str s) = do- str <- addGlobal' (ArrayType (1 + fromIntegral (length s)) (IntegerType 8)) (cgConst' c)- box FString (ConstantOperand $ C.GetElementPtr True str [C.Int 32 0, C.Int 32 0])-cgConst c@(TT.BI i) = do- let stringRepLen = (if i < 0 then 2 else 1) + fromInteger (numDigits 10 i)- str <- addGlobal' (ArrayType stringRepLen (IntegerType 8)) (cgConst' c)- mpz <- alloc mpzTy- inst $ simpleCall "__gmpz_init_set_str" [mpz- , ConstantOperand $ C.GetElementPtr True str [ C.Int 32 0, C.Int 32 0]- , ConstantOperand $ C.Int 32 10- ]- box (FArith (ATInt ITBig)) mpz-cgConst x = return $ ConstantOperand nullValue--numDigits :: Integer -> Integer -> Integer-numDigits b n = 1 + fst (ilog b n) where- ilog b n- | n < b = (0, n)- | otherwise = let (e, r) = ilog (b*b) n- in if r < b then (2*e, r) else (2*e+1, r `div` b)--addGlobal :: Global -> Codegen ()-addGlobal def = tell ([], [], [GlobalDefinition def])--addGlobal' :: Type -> C.Constant -> Codegen C.Constant-addGlobal' ty val = do- name <- getGlobalUnName- addGlobal $ globalVariableDefaults- { G.name = name- , G.linkage = L.Internal- , G.hasUnnamedAddr = True- , G.isConstant = True- , G.type' = ty- , G.initializer = Just val- }- return . C.GlobalReference $ name---ensureCDecl :: String -> FType -> [FType] -> Codegen Operand-ensureCDecl name rty argtys = do- syms <- gets foreignSyms- case M.lookup name syms of- Nothing -> do addGlobal (ffunDecl name rty argtys)- modify $ \s -> s { foreignSyms = M.insert name (rty, argtys) (foreignSyms s) }- Just (rty', argtys') -> unless (rty == rty' && argtys == argtys') . fail $- "Mismatched type declarations for foreign symbol \"" ++ name ++ "\": " ++ show (rty, argtys) ++ " vs " ++ show (rty', argtys')- return $ ConstantOperand (C.GlobalReference (Name name))--ffunDecl :: String -> FType -> [FType] -> Global-ffunDecl name rty argtys =- functionDefaults- { G.returnType = ftyToTy rty- , G.name = Name name- , G.parameters = (flip map argtys $ \fty ->- Parameter (ftyToTy fty) (UnName 0) []- , False)- }--ftyToTy :: FType -> Type-ftyToTy (FArith (ATInt ITNative)) = IntegerType 32-ftyToTy (FArith (ATInt ITBig)) = PointerType mpzTy (AddrSpace 0)-ftyToTy (FArith (ATInt (ITFixed ty))) = IntegerType (fromIntegral $ nativeTyWidth ty)-ftyToTy (FArith (ATInt (ITVec e c)))- = VectorType (fromIntegral c) (IntegerType (fromIntegral $ nativeTyWidth e))-ftyToTy (FArith (ATInt ITChar)) = IntegerType 32-ftyToTy (FArith ATFloat) = FloatingPointType 64 IEEE-ftyToTy FString = PointerType (IntegerType 8) (AddrSpace 0)-ftyToTy FUnit = VoidType-ftyToTy FPtr = PointerType (IntegerType 8) (AddrSpace 0)-ftyToTy FAny = valueType---- Only use when known not to be ITBig-itWidth :: IntTy -> Word32-itWidth ITNative = 32-itWidth ITChar = 32-itWidth (ITFixed x) = fromIntegral $ nativeTyWidth x-itWidth x = ierror $ "itWidth: " ++ show x--itConst :: IntTy -> Integer -> C.Constant-itConst (ITFixed n) x = C.Int (fromIntegral $ nativeTyWidth n) x-itConst ITNative x = itConst (ITFixed IT32) x-itConst ITChar x = itConst (ITFixed IT32) x-itConst (ITVec elts size) x = C.Vector (replicate size (itConst (ITFixed elts) x))--cgOp :: PrimFn -> [Operand] -> Codegen Operand-cgOp (LTrunc ITBig ity) [x] = do- nx <- unbox (FArith (ATInt ITBig)) x- val <- inst $ simpleCall "mpz_get_ull" [nx]- v <- case ity of- (ITFixed IT64) -> return val- _ -> inst $ Trunc val (ftyToTy (FArith (ATInt ity))) []- box (FArith (ATInt ity)) v-cgOp (LZExt from ITBig) [x] = do- nx <- unbox (FArith (ATInt from)) x- nx' <- case from of- (ITFixed IT64) -> return nx- _ -> inst $ ZExt nx (IntegerType 64) []- mpz <- alloc mpzTy- inst' $ simpleCall "mpz_init_set_ull" [mpz, nx']- box (FArith (ATInt ITBig)) mpz-cgOp (LSExt from ITBig) [x] = do- nx <- unbox (FArith (ATInt from)) x- nx' <- case from of- (ITFixed IT64) -> return nx- _ -> inst $ SExt nx (IntegerType 64) []- mpz <- alloc mpzTy- inst' $ simpleCall "mpz_init_set_sll" [mpz, nx']- box (FArith (ATInt ITBig)) mpz---- ITChar, ITNative, and IT32 all share representation-cgOp (LChInt ITNative) [x] = return x-cgOp (LIntCh ITNative) [x] = return x--cgOp (LSLt (ATInt ITBig)) [x,y] = mpzCmp IPred.SLT x y-cgOp (LSLe (ATInt ITBig)) [x,y] = mpzCmp IPred.SLE x y-cgOp (LEq (ATInt ITBig)) [x,y] = mpzCmp IPred.EQ x y-cgOp (LSGe (ATInt ITBig)) [x,y] = mpzCmp IPred.SGE x y-cgOp (LSGt (ATInt ITBig)) [x,y] = mpzCmp IPred.SGT x y-cgOp (LPlus (ATInt ITBig)) [x,y] = mpzBin "add" x y-cgOp (LMinus (ATInt ITBig)) [x,y] = mpzBin "sub" x y-cgOp (LTimes (ATInt ITBig)) [x,y] = mpzBin "mul" x y-cgOp (LSDiv (ATInt ITBig)) [x,y] = mpzBin "fdiv_q" x y-cgOp (LSRem (ATInt ITBig)) [x,y] = mpzBin "fdiv_r" x y-cgOp (LAnd ITBig) [x,y] = mpzBin "and" x y-cgOp (LOr ITBig) [x,y] = mpzBin "ior" x y-cgOp (LXOr ITBig) [x,y] = mpzBin "xor" x y-cgOp (LCompl ITBig) [x] = mpzUn "com" x-cgOp (LSHL ITBig) [x,y] = mpzBit "mul_2exp" x y-cgOp (LASHR ITBig) [x,y] = mpzBit "fdiv_q_2exp" x y--cgOp (LTrunc ITNative (ITFixed to)) [x]- | 32 >= nativeTyWidth to = iCoerce Trunc IT32 to x-cgOp (LZExt ITNative (ITFixed to)) [x]- | 32 <= nativeTyWidth to = iCoerce ZExt IT32 to x-cgOp (LSExt ITNative (ITFixed to)) [x]- | 32 <= nativeTyWidth to = iCoerce SExt IT32 to x--cgOp (LTrunc (ITFixed from) ITNative) [x]- | nativeTyWidth from >= 32 = iCoerce Trunc from IT32 x-cgOp (LZExt (ITFixed from) ITNative) [x]- | nativeTyWidth from <= 32 = iCoerce ZExt from IT32 x-cgOp (LSExt (ITFixed from) ITNative) [x]- | nativeTyWidth from <= 32 = iCoerce SExt from IT32 x--cgOp (LTrunc (ITFixed from) (ITFixed to)) [x]- | nativeTyWidth from > nativeTyWidth to = iCoerce Trunc from to x-cgOp (LZExt (ITFixed from) (ITFixed to)) [x]- | nativeTyWidth from < nativeTyWidth to = iCoerce ZExt from to x-cgOp (LSExt (ITFixed from) (ITFixed to)) [x]- | nativeTyWidth from < nativeTyWidth to = iCoerce SExt from to x--cgOp (LSLt (ATInt ity)) [x,y] = iCmp ity IPred.SLT x y-cgOp (LSLe (ATInt ity)) [x,y] = iCmp ity IPred.SLE x y-cgOp (LLt ity) [x,y] = iCmp ity IPred.ULT x y-cgOp (LLe ity) [x,y] = iCmp ity IPred.ULE x y-cgOp (LEq (ATInt ity)) [x,y] = iCmp ity IPred.EQ x y-cgOp (LSGe (ATInt ity)) [x,y] = iCmp ity IPred.SGE x y-cgOp (LSGt (ATInt ity)) [x,y] = iCmp ity IPred.SGT x y-cgOp (LGe ity) [x,y] = iCmp ity IPred.UGE x y-cgOp (LGt ity) [x,y] = iCmp ity IPred.UGT x y-cgOp (LPlus ty@(ATInt _)) [x,y] = binary ty x y (Add False False)-cgOp (LMinus ty@(ATInt _)) [x,y] = binary ty x y (Sub False False)-cgOp (LTimes ty@(ATInt _)) [x,y] = binary ty x y (Mul False False)-cgOp (LSDiv ty@(ATInt _)) [x,y] = binary ty x y (SDiv False)-cgOp (LSRem ty@(ATInt _)) [x,y] = binary ty x y SRem-cgOp (LUDiv ity) [x,y] = binary (ATInt ity) x y (UDiv False)-cgOp (LURem ity) [x,y] = binary (ATInt ity) x y URem-cgOp (LAnd ity) [x,y] = binary (ATInt ity) x y And-cgOp (LOr ity) [x,y] = binary (ATInt ity) x y Or-cgOp (LXOr ity) [x,y] = binary (ATInt ity) x y Xor-cgOp (LCompl ity) [x] = unary (ATInt ity) x (Xor . ConstantOperand $ itConst ity (-1))-cgOp (LSHL ity) [x,y] = binary (ATInt ity) x y (Shl False False)-cgOp (LLSHR ity) [x,y] = binary (ATInt ity) x y (LShr False)-cgOp (LASHR ity) [x,y] = binary (ATInt ity) x y (AShr False)--cgOp (LSLt ATFloat) [x,y] = fCmp FPred.OLT x y-cgOp (LSLe ATFloat) [x,y] = fCmp FPred.OLE x y-cgOp (LEq ATFloat) [x,y] = fCmp FPred.OEQ x y-cgOp (LSGe ATFloat) [x,y] = fCmp FPred.OGE x y-cgOp (LSGt ATFloat) [x,y] = fCmp FPred.OGT x y-cgOp (LPlus ATFloat) [x,y] = binary ATFloat x y FAdd-cgOp (LMinus ATFloat) [x,y] = binary ATFloat x y FSub-cgOp (LTimes ATFloat) [x,y] = binary ATFloat x y FMul -cgOp (LSDiv ATFloat) [x,y] = binary ATFloat x y FDiv--cgOp LFExp [x] = nunary ATFloat "llvm.exp.f64" x -cgOp LFLog [x] = nunary ATFloat "llvm.log.f64" x-cgOp LFSin [x] = nunary ATFloat "llvm.sin.f64" x-cgOp LFCos [x] = nunary ATFloat "llvm.cos.f64" x-cgOp LFTan [x] = nunary ATFloat "tan" x-cgOp LFASin [x] = nunary ATFloat "asin" x-cgOp LFACos [x] = nunary ATFloat "acos" x-cgOp LFATan [x] = nunary ATFloat "atan" x-cgOp LFSqrt [x] = nunary ATFloat "llvm.sqrt.f64" x-cgOp LFFloor [x] = nunary ATFloat "llvm.floor.f64" x-cgOp LFCeil [x] = nunary ATFloat "llvm.ceil.f64" x--cgOp (LIntFloat ITBig) [x] = do- x' <- unbox (FArith (ATInt ITBig)) x- uflt <- inst $ simpleCall "__gmpz_get_d" [ x' ]- box (FArith ATFloat) uflt--cgOp (LIntFloat ity) [x] = do- x' <- unbox (FArith (ATInt ity)) x- x'' <- inst $ SIToFP x' (FloatingPointType 64 IEEE) []- box (FArith ATFloat) x''--cgOp (LFloatInt ITBig) [x] = do- x' <- unbox (FArith ATFloat) x- z <- alloc mpzTy- inst' $ simpleCall "__gmpz_init" [z]- inst' $ simpleCall "__gmpz_set_d" [ z, x' ]- box (FArith (ATInt ITBig)) z--cgOp (LFloatInt ity) [x] = do- x' <- unbox (FArith ATFloat) x- x'' <- inst $ FPToSI x' (ftyToTy $ cmpResultTy ity) []- box (FArith (ATInt ity)) x''--cgOp LFloatStr [x] = do- x' <- unbox (FArith ATFloat) x- ustr <- inst (idrCall "__idris_floatStr" [x'])- box FString ustr --cgOp LNoOp xs = return $ last xs--cgOp (LMkVec ety c) xs | c == length xs = do- nxs <- mapM (unbox (FArith (ATInt (ITFixed ety)))) xs- vec <- foldM (\v (e, i) -> inst $ InsertElement v e (ConstantOperand (C.Int 32 i)) [])- (ConstantOperand $ C.Vector (replicate c (C.Undef (IntegerType . fromIntegral $ nativeTyWidth ety))))- (zip nxs [0..])- box (FArith (ATInt (ITVec ety c))) vec--cgOp (LIdxVec ety c) [v,i] = do- nv <- unbox (FArith (ATInt (ITVec ety c))) v- ni <- unbox (FArith (ATInt (ITFixed IT32))) i- elt <- inst $ ExtractElement nv ni []- box (FArith (ATInt (ITFixed ety))) elt--cgOp (LUpdateVec ety c) [v,i,e] = do- let fty = FArith (ATInt (ITVec ety c))- nv <- unbox fty v- ni <- unbox (FArith (ATInt (ITFixed IT32))) i- ne <- unbox (FArith (ATInt (ITFixed ety))) e- nv' <- inst $ InsertElement nv ne ni []- box fty nv'--cgOp (LBitCast from to) [x] = do- nx <- unbox (FArith from) x- nx' <- inst $ BitCast nx (ftyToTy (FArith to)) []- box (FArith to) nx'--cgOp LStrEq [x,y] = do- x' <- unbox FString x- y' <- unbox FString y- cmp <- inst $ simpleCall "strcmp" [x', y']- flag <- inst $ ICmp IPred.EQ cmp (ConstantOperand (C.Int 32 0)) []- val <- inst $ ZExt flag (IntegerType 32) []- box (FArith (ATInt (ITFixed IT32))) val--cgOp LStrLt [x,y] = do- nx <- unbox FString x- ny <- unbox FString y- cmp <- inst $ simpleCall "strcmp" [nx, ny]- flag <- inst $ ICmp IPred.ULT cmp (ConstantOperand (C.Int 32 0)) []- val <- inst $ ZExt flag (IntegerType 32) []- box (FArith (ATInt (ITFixed IT32))) val--cgOp (LIntStr ITBig) [x] = do- x' <- unbox (FArith (ATInt ITBig)) x- ustr <- inst $ simpleCall "__gmpz_get_str"- [ ConstantOperand (C.Null (PointerType (IntegerType 8) (AddrSpace 0)))- , ConstantOperand (C.Int 32 10)- , x'- ]- box FString ustr-cgOp (LIntStr ity) [x] = do- x' <- unbox (FArith (ATInt ity)) x- x'' <- if itWidth ity < 64- then inst $ SExt x' (IntegerType 64) []- else return x'- box FString =<< inst (idrCall "__idris_intStr" [x''])-cgOp (LStrInt ITBig) [s] = do- ns <- unbox FString s- mpz <- alloc mpzTy- inst $ simpleCall "__gmpz_init_set_str" [mpz, ns, ConstantOperand $ C.Int 32 10]- box (FArith (ATInt ITBig)) mpz-cgOp (LStrInt ity) [s] = do- ns <- unbox FString s- nx <- inst $ simpleCall "strtoll"- [ns- , ConstantOperand $ C.Null (PointerType (PointerType (IntegerType 8) (AddrSpace 0)) (AddrSpace 0))- , ConstantOperand $ C.Int 32 10- ]- nx' <- case ity of- (ITFixed IT64) -> return nx- _ -> inst $ Trunc nx (IntegerType (itWidth ity)) []- box (FArith (ATInt ity)) nx'--cgOp LStrConcat [x,y] = cgStrCat x y--cgOp LStrCons [c,s] = do- nc <- unbox (FArith (ATInt ITChar)) c- ns <- unbox FString s- nc' <- inst $ Trunc nc (IntegerType 8) []- r <- inst $ simpleCall "__idris_strCons" [nc', ns]- box FString r--cgOp LStrHead [c] = do- s <- unbox FString c- c <- inst $ Load False s Nothing 0 []- c' <- inst $ ZExt c (IntegerType 32) []- box (FArith (ATInt ITChar)) c'--cgOp LStrIndex [s, i] = do- ns <- unbox FString s- ni <- unbox (FArith (ATInt (ITFixed IT32))) i- p <- inst $ GetElementPtr True ns [ni] []- c <- inst $ Load False p Nothing 0 []- c' <- inst $ ZExt c (IntegerType 32) []- box (FArith (ATInt ITChar)) c'--cgOp LStrTail [c] = do- s <- unbox FString c- c <- inst $ GetElementPtr True s [ConstantOperand $ C.Int 32 1] []- box FString c--cgOp LStrLen [s] = do- ns <- unbox FString s- len <- inst $ simpleCall "strlen" [ns]- ws <- getWordSize- len' <- case ws of- 32 -> return len- x | x > 32 -> inst $ Trunc len (IntegerType 32) []- | x < 32 -> inst $ ZExt len (IntegerType 32) []- box (FArith (ATInt (ITFixed IT32))) len'--cgOp LStrRev [s] = do- ns <- unbox FString s- box FString =<< inst (simpleCall "__idris_strRev" [ns])--cgOp LReadStr [p] = do- np <- unbox FPtr p- s <- inst $ simpleCall "__idris_readStr" [np]- box FString s--cgOp LStdIn [] = do- stdin <- getStdIn- ptr <- inst $ loadInv stdin- box FPtr ptr-cgOp LStdOut [] = do- stdout <- getStdOut- ptr <- inst $ loadInv stdout- box FPtr ptr-cgOp LStdErr [] = do- stdErr <- getStdErr- ptr <- inst $ loadInv stdErr- box FPtr ptr--cgOp LNullPtr [] = box FPtr (ConstantOperand $ C.Null (PointerType (IntegerType 8) (AddrSpace 0)))--cgOp prim args = ierror $ "Unimplemented primitive: <" ++ show prim ++ ">("- ++ intersperse ',' (take (length args) ['a'..]) ++ ")"--iCoerce :: (Operand -> Type -> InstructionMetadata -> Instruction) -> NativeTy -> NativeTy -> Operand -> Codegen Operand-iCoerce _ from to x | from == to = return x-iCoerce operator from to x = do- x' <- unbox (FArith (ATInt (ITFixed from))) x- x'' <- inst $ operator x' (ftyToTy (FArith (ATInt (ITFixed to)))) []- box (FArith (ATInt (ITFixed to))) x''--cgStrCat :: Operand -> Operand -> Codegen Operand-cgStrCat x y = do- x' <- unbox FString x- y' <- unbox FString y- xlen <- inst $ simpleCall "strlen" [x']- ylen <- inst $ simpleCall "strlen" [y']- zlen <- inst $ Add False True xlen ylen []- ws <- getWordSize- total <- inst $ Add False True zlen (ConstantOperand (C.Int ws 1)) []- mem <- allocAtomic' total- inst $ simpleCall "memcpy" [mem, x', xlen]- i <- inst $ PtrToInt mem (IntegerType ws) []- offi <- inst $ Add False True i xlen []- offp <- inst $ IntToPtr offi (PointerType (IntegerType 8) (AddrSpace 0)) []- inst $ simpleCall "memcpy" [offp, y', ylen]- j <- inst $ PtrToInt offp (IntegerType ws) []- offj <- inst $ Add False True j ylen []- end <- inst $ IntToPtr offj (PointerType (IntegerType 8) (AddrSpace 0)) []- inst' $ Store False end (ConstantOperand (C.Int 8 0)) Nothing 0 []- box FString mem--binary :: ArithTy -> Operand -> Operand- -> (Operand -> Operand -> InstructionMetadata -> Instruction) -> Codegen Operand-binary ty x y instCon = do- nx <- unbox (FArith ty) x- ny <- unbox (FArith ty) y- nr <- inst $ instCon nx ny []- box (FArith ty) nr--unary :: ArithTy -> Operand - -> (Operand -> InstructionMetadata -> Instruction) -> Codegen Operand-unary ty x instCon = do- nx <- unbox (FArith ty) x- nr <- inst $ instCon nx []- box (FArith ty) nr--nunary :: ArithTy -> String- -> Operand -> Codegen Operand-nunary ty name x = do- nx <- unbox (FArith ty) x- nr <- inst $ simpleCall name [nx]- box (FArith ty) nr--iCmp :: IntTy -> IPred.IntegerPredicate -> Operand -> Operand -> Codegen Operand-iCmp ity pred x y = do- nx <- unbox (FArith (ATInt ity)) x- ny <- unbox (FArith (ATInt ity)) y- nr <- inst $ ICmp pred nx ny []- nr' <- inst $ SExt nr (ftyToTy $ cmpResultTy ity) []- box (cmpResultTy ity) nr'--fCmp :: FPred.FloatingPointPredicate -> Operand -> Operand -> Codegen Operand-fCmp pred x y = do- nx <- unbox (FArith ATFloat) x- ny <- unbox (FArith ATFloat) y- nr <- inst $ FCmp pred nx ny []- box (FArith (ATInt (ITFixed IT32))) nr--cmpResultTy :: IntTy -> FType-cmpResultTy v@(ITVec _ _) = FArith (ATInt v)-cmpResultTy _ = FArith (ATInt (ITFixed IT32))--mpzBin :: String -> Operand -> Operand -> Codegen Operand-mpzBin name x y = do- nx <- unbox (FArith (ATInt ITBig)) x- ny <- unbox (FArith (ATInt ITBig)) y- nz <- alloc mpzTy- inst' $ simpleCall "__gmpz_init" [nz]- inst' $ simpleCall ("__gmpz_" ++ name) [nz, nx, ny]- box (FArith (ATInt ITBig)) nz--mpzBit :: String -> Operand -> Operand -> Codegen Operand-mpzBit name x y = do- nx <- unbox (FArith (ATInt ITBig)) x- ny <- unbox (FArith (ATInt ITBig)) y- bitcnt <- inst $ simpleCall "__gmpz_get_ui" [ny]- nz <- alloc mpzTy- inst' $ simpleCall "__gmpz_init" [nz]- inst' $ simpleCall ("__gmpz_" ++ name) [nz, nx, bitcnt]- box (FArith (ATInt ITBig)) nz--mpzUn :: String -> Operand -> Codegen Operand-mpzUn name x = do- nx <- unbox (FArith (ATInt ITBig)) x- nz <- alloc mpzTy- inst' $ simpleCall "__gmpz_init" [nz]- inst' $ simpleCall ("__gmpz_" ++ name) [nz, nx]- box (FArith (ATInt ITBig)) nz--mpzCmp :: IPred.IntegerPredicate -> Operand -> Operand -> Codegen Operand-mpzCmp pred x y = do- nx <- unbox (FArith (ATInt ITBig)) x- ny <- unbox (FArith (ATInt ITBig)) y- cmp <- inst $ simpleCall "__gmpz_cmp" [nx, ny]- result <- inst $ ICmp pred cmp (ConstantOperand (C.Int 32 0)) []- i <- inst $ ZExt result (IntegerType 32) []- box (FArith (ATInt (ITFixed IT32))) i--simpleCall :: String -> [Operand] -> Instruction-simpleCall name args =- Call { isTailCall = False- , callingConvention = CC.C- , returnAttributes = []- , function = Right . ConstantOperand . C.GlobalReference . Name $ name- , arguments = map (\x -> (x, [])) args- , functionAttributes = []- , metadata = []- }--idrCall :: String -> [Operand] -> Instruction-idrCall name args =- Call { isTailCall = False- , callingConvention = CC.Fast- , returnAttributes = []- , function = Right . ConstantOperand . C.GlobalReference . Name $ name- , arguments = map (\x -> (x, [])) args- , functionAttributes = []- , metadata = []- }--assert :: Operand -> String -> Codegen ()-assert condition message = do- passed <- getName "assertPassed"- failed <- getName "assertFailed"- terminate $ CondBr condition passed failed []- newBlock failed- cgExpr (SError message)- terminate $ Unreachable []- newBlock passed
src/IRTS/Compiler.hs view
@@ -8,14 +8,8 @@ import IRTS.Simplified import IRTS.CodegenCommon import IRTS.CodegenC-import IRTS.CodegenJava import IRTS.DumpBC import IRTS.CodegenJavaScript-#ifdef IDRIS_LLVM-import IRTS.CodegenLLVM-#else-import Util.LLVMStubs-#endif import IRTS.Inliner import Idris.AbsSyntax@@ -94,11 +88,10 @@ Just f -> runIO $ writeFile f (dumpDefuns defuns) triple <- Idris.AbsSyntax.targetTriple cpu <- Idris.AbsSyntax.targetCPU- optimise <- optLevel iLOG "Building output" case checked of- OK c -> do return $ CodegenInfo f outty triple cpu optimise+ OK c -> do return $ CodegenInfo f outty triple cpu hdrs impdirs objs libs flags NONE c (toAlist defuns) tagged@@ -127,8 +120,6 @@ = case codegen of -- Built-in code generators (FIXME: lift these out!) Via "c" -> codegenC ir - Via "java" -> codegenJava ir - Via "llvm" -> codegenLLVM ir -- Any external code generator Via cg -> do let cmd = "idris-" ++ cg ++ " " ++ mainmod ++ " -o " ++ outputFile ir
src/IRTS/DumpBC.hs view
@@ -65,7 +65,7 @@ "OP " ++ serializeReg a ++ " " ++ show b ++ " [" ++ interMap c ", " serializeReg ++ "]" NULL r -> "NULL " ++ serializeReg r ERROR s -> "ERROR \"" ++ s ++ "\"" -- FIXME: s may contain quotes-+ -- Issue #1596 serialize :: [(Name, [BC])] -> String serialize decls = interMap decls "\n\n" serializeDecl
− src/IRTS/Java/ASTBuilding.hs
@@ -1,141 +0,0 @@-module IRTS.Java.ASTBuilding where--import IRTS.Java.JTypes--import Language.Java.Syntax hiding (Name)-import qualified Language.Java.Syntax as J--toClassType :: J.Type -> ClassType-toClassType (RefType (ClassRefType ct)) = ct-toClassType t = error $ "Not a class type: " ++ (show t)--toRefType :: J.Type -> RefType-toRefType (RefType rt) = rt-toRefType t = error $ "Not a ref type: " ++ (show t)--class InvocationTarget a where- (~>) :: a -> String -> [Argument] -> Exp--instance InvocationTarget ClassType where- (~>) (ClassType ts) method args =- MethodInv $ TypeMethodCall- (J.Name $ map fst ts)- (concatMap (map fromActType . snd) ts)- (Ident method)- args- where- fromActType (ActualType refType) = refType--instance InvocationTarget Exp where- (~>) exp method args =- MethodInv $ PrimaryMethodCall- exp- []- (Ident method)- args--instance InvocationTarget J.Type where- (~>) t method args = ((toClassType t) ~> method) args--class Callable a where- call :: a -> [Argument] -> Exp--instance Callable String where- call method args =- MethodInv $ MethodCall (J.Name [Ident method]) args--instance Callable Ident where- call method args =- MethodInv $ MethodCall (J.Name [method]) args--instance Callable J.Name where- call method args =- MethodInv $ MethodCall method args--(<>) :: Type -> Exp -> Exp-(<>) = Cast--localVar :: Int -> Ident-localVar i = Ident $ "loc" ++ show i--(@!) :: Exp -> Int -> ArrayIndex-(@!) target pos =- ArrayIndex target (Lit $ Int (toInteger pos))--(@:=) :: Either ArrayIndex Ident -> Exp -> BlockStmt-(@:=) (Right lhs) rhs =- LocalVars [Final] objectType [VarDecl (VarId lhs) (Just $ InitExp rhs)]-(@:=) (Left lhs) rhs =- BlockStmt . ExpStmt $ Assign (ArrayLhs lhs) EqualA rhs--(~&&~) :: Exp -> Exp -> Exp-(~&&~) e1 e2 = BinOp e1 CAnd e2--(~==~) :: Exp -> Exp -> Exp-(~==~) e1 e2 = BinOp e1 Equal e2--addToBlock :: [BlockStmt] -> Exp -> [BlockStmt]-addToBlock blk exp = blk ++ [BlockStmt $ ExpStmt exp]--jName :: String -> J.Name-jName n = J.Name [Ident n]--jConst :: String -> Exp-jConst = ExpName . jName--jReturn :: Exp -> BlockStmt-jReturn = BlockStmt . Return . Just--jInt :: Int -> Exp-jInt = Lit . Int . toInteger--jString :: String -> Exp-jString = Lit . String--simpleMethod :: [Modifier] -> Maybe J.Type -> String -> [FormalParam] -> Block -> Decl-simpleMethod mods t name params body =- MemberDecl $ MethodDecl- mods- []- t- (Ident $ name)- params- []- (MethodBody . Just $ body)--declareFinalObjectArray :: Ident -> Maybe VarInit -> BlockStmt-declareFinalObjectArray name init =- LocalVars [Final]- (array objectType)- [ VarDecl- (VarDeclArray . VarId $ name)- init- ]--arrayInitExps :: [Exp] -> VarInit-arrayInitExps = InitArray . ArrayInit . map (InitExp)--extendWithNull :: [Exp] -> Int -> [Exp]-extendWithNull exps additionalZeros =- exps ++ (replicate additionalZeros (Lit $ Null))--closure :: Exp -> Exp-closure body =- InstanceCreation- []- (toClassType idrisClosureType)- []- (Just $ ClassBody- [ simpleMethod- [Public, Final] (Just objectType) "call" []- (Block [jReturn body])- ]- )--bigInteger :: String -> Exp-bigInteger s =- InstanceCreation- []- (toClassType bigIntegerType)- [Lit $ String s]- Nothing
− src/IRTS/Java/JTypes.hs
@@ -1,331 +0,0 @@-{-# LANGUAGE PatternGuards #-}-module IRTS.Java.JTypes where--import Idris.Core.TT-import IRTS.Lang-import Language.Java.Syntax-import qualified Language.Java.Syntax as J--import qualified Data.Vector.Unboxed as V---------------------------------------------------------------------------- Primitive types--charType :: J.Type-charType =- PrimType CharT--byteType :: J.Type-byteType = PrimType ByteT--shortType :: J.Type-shortType = PrimType ShortT--integerType :: J.Type-integerType = PrimType IntT--longType :: J.Type-longType = PrimType LongT--doubleType :: J.Type-doubleType = PrimType DoubleT--array :: J.Type -> J.Type-array t = RefType . ArrayType $ t--addressType :: J.Type-addressType = longType---------------------------------------------------------------------------- Boxed types--objectType :: J.Type-objectType =- RefType . ClassRefType $ ClassType [(Ident "Object", [])]--bigIntegerType :: J.Type-bigIntegerType =- RefType . ClassRefType $ ClassType [(Ident "BigInteger", [])]--stringType :: J.Type-stringType =- RefType . ClassRefType $ ClassType [(Ident "String", [])]--bufferType :: J.Type-bufferType =- RefType . ClassRefType $ ClassType [(Ident "ByteBuffer", [])]--threadType :: J.Type-threadType =- RefType . ClassRefType $ ClassType [(Ident "Thread", [])]--callableType :: J.Type-callableType =- RefType . ClassRefType $ ClassType [(Ident "Callable", [])]--voidType :: J.Type-voidType =- RefType . ClassRefType $ ClassType [(Ident "Void", [])]--box :: J.Type -> J.Type-box (PrimType CharT ) = RefType . ClassRefType $ ClassType [(Ident "Character", [])]-box (PrimType ByteT ) = RefType . ClassRefType $ ClassType [(Ident "Byte", [])]-box (PrimType ShortT ) = RefType . ClassRefType $ ClassType [(Ident "Short", [])]-box (PrimType IntT ) = RefType . ClassRefType $ ClassType [(Ident "Integer", [])]-box (PrimType LongT ) = RefType . ClassRefType $ ClassType [(Ident "Long", [])]-box (PrimType DoubleT) = RefType . ClassRefType $ ClassType [(Ident "Double", [])]-box t = t--isFloating :: J.Type -> Bool-isFloating (PrimType DoubleT) = True-isFloating (PrimType FloatT) = True-isFloating _ = False--isPrimitive :: J.Type -> Bool-isPrimitive (PrimType _) = True-isPrimitive _ = False--isArray :: J.Type -> Bool-isArray (RefType (ArrayType _)) = True-isArray _ = False--isString :: J.Type -> Bool-isString (RefType (ClassRefType (ClassType [(Ident "String", _)]))) = True-isString _ = False---------------------------------------------------------------------------- Idris rts classes--idrisClosureType :: J.Type-idrisClosureType =- RefType . ClassRefType $ ClassType [(Ident "Closure", [])]--idrisTailCallClosureType :: J.Type-idrisTailCallClosureType =- RefType . ClassRefType $ ClassType [(Ident "TailCallClosure", [])]--idrisObjectType :: J.Type-idrisObjectType =- RefType . ClassRefType $ ClassType [(Ident "IdrisObject", [])]--foreignWrapperType :: J.Type-foreignWrapperType =- RefType . ClassRefType $ ClassType [(Ident "ForeignWrapper", [])]--primFnType :: J.Type-primFnType =- RefType . ClassRefType $ ClassType [(Ident "PrimFn", [])]---------------------------------------------------------------------------- Java utility classes--arraysType :: J.Type-arraysType =- RefType . ClassRefType $ ClassType [(Ident "Arrays", [])]--mathType :: J.Type-mathType =- RefType . ClassRefType $ ClassType [(Ident "Math", [])]----------------------------------------------------------------------------- Exception types--exceptionType :: J.Type-exceptionType =- RefType . ClassRefType $ ClassType [(Ident "Exception", [])]--runtimeExceptionType :: J.Type-runtimeExceptionType =- RefType . ClassRefType $ ClassType [(Ident "RuntimeException", [])]---------------------------------------------------------------------------- Integer types--nativeTyToJType :: NativeTy -> J.Type-nativeTyToJType IT8 = byteType-nativeTyToJType IT16 = shortType-nativeTyToJType IT32 = integerType-nativeTyToJType IT64 = longType--intTyToJType :: IntTy -> J.Type-intTyToJType (ITFixed nt) = nativeTyToJType nt-intTyToJType (ITNative) = integerType-intTyToJType (ITBig) = bigIntegerType-intTyToJType (ITChar) = charType-intTyToJType (ITVec nt _) = array $ nativeTyToJType nt--arithTyToJType :: ArithTy -> J.Type-arithTyToJType (ATInt it) = intTyToJType it-arithTyToJType (ATFloat) = doubleType---------------------------------------------------------------------------- Context variables--localContextID :: Ident-localContextID = Ident "context"--localContext :: Exp-localContext = ExpName $ Name [localContextID]--globalContextID :: Ident-globalContextID = Ident "globalContext"--globalContext :: Exp-globalContext = ExpName $ Name [globalContextID]--newContextID :: Ident-newContextID = Ident "new_context"--newContext :: Exp-newContext = ExpName $ Name [newContextID]--contextArray :: LVar -> Exp-contextArray (Loc _) = localContext-contextArray (Glob _) = globalContext--contextParam :: FormalParam-contextParam = FormalParam [Final] (array objectType) False (VarId localContextID)---------------------------------------------------------------------------- Constant types--constType :: Const -> J.Type-constType (I _) = arithTyToJType (ATInt ITNative)-constType (BI _) = arithTyToJType (ATInt ITBig )-constType (Fl _) = arithTyToJType (ATFloat )-constType (Ch _) = arithTyToJType (ATInt ITChar )-constType (Str _) = stringType-constType (B8 _) = arithTyToJType (ATInt $ ITFixed IT8 )-constType (B16 _) = arithTyToJType (ATInt $ ITFixed IT16)-constType (B32 _) = arithTyToJType (ATInt $ ITFixed IT32)-constType (B64 _) = arithTyToJType (ATInt $ ITFixed IT64)-constType (B8V v) = arithTyToJType (ATInt . ITVec IT8 $ V.length v)-constType (B16V v) = arithTyToJType (ATInt . ITVec IT16 $ V.length v)-constType (B32V v) = arithTyToJType (ATInt . ITVec IT32 $ V.length v)-constType (B64V v) = arithTyToJType (ATInt . ITVec IT64 $ V.length v)-constType _ = objectType---------------------------------------------------------------------------- Foreign types--foreignType :: FType -> Maybe J.Type-foreignType (FArith at) = Just $ arithTyToJType at-foreignType (FFunction ) = Just $ callableType-foreignType (FFunctionIO ) = Just $ callableType-foreignType (FString ) = Just $ stringType-foreignType (FUnit ) = Nothing-foreignType (FPtr ) = Just $ objectType-foreignType (FAny ) = Just $ objectType---------------------------------------------------------------------------- Primitive operation analysis--opName :: PrimFn -> String-opName x- | (LSExt _ to) <- x = "LSExt" ++ (suffixFor to)- | (LZExt _ to) <- x = "LZExt" ++ (suffixFor to)- | (LTrunc _ to) <- x = "LTrunc" ++ (suffixFor to)- | (LFloatInt to) <- x = "LFloatInt" ++ (suffixFor to)- | (LStrInt to) <- x = "LStrInt" ++ (suffixFor to)- | (LChInt to) <- x = "LChInt" ++ (suffixFor to)- | (LPeek to _) <- x = "LPeek" ++ (suffixFor to)- | otherwise = takeWhile ((/=) ' ') $ show x- where- suffixFor (ITFixed nt) = show nt- suffixFor (ITNative) = show IT32- suffixFor (ITBig) = show ITBig- suffixFor (ITChar) = show ITChar- suffixFor (ITVec nt _) = "ITVec" ++ (show $ nativeTyWidth nt)--sourceTypes :: PrimFn -> [J.Type]-sourceTypes (LPlus from) = [arithTyToJType from, arithTyToJType from]-sourceTypes (LMinus from) = [arithTyToJType from, arithTyToJType from]-sourceTypes (LTimes from) = [arithTyToJType from, arithTyToJType from]-sourceTypes (LUDiv from) = [intTyToJType from, intTyToJType from]-sourceTypes (LSDiv from) = [arithTyToJType from, arithTyToJType from]-sourceTypes (LURem from) = [intTyToJType from, intTyToJType from]-sourceTypes (LSRem from) = [arithTyToJType from, arithTyToJType from]-sourceTypes (LAnd from) = [intTyToJType from, intTyToJType from]-sourceTypes (LOr from) = [intTyToJType from, intTyToJType from]-sourceTypes (LXOr from) = [intTyToJType from, intTyToJType from]-sourceTypes (LCompl from) = [intTyToJType from]-sourceTypes (LSHL from) = [intTyToJType from, intTyToJType from]-sourceTypes (LLSHR from) = [intTyToJType from, intTyToJType from]-sourceTypes (LASHR from) = [intTyToJType from, intTyToJType from]-sourceTypes (LEq from) = [arithTyToJType from, arithTyToJType from]-sourceTypes (LSLt from) = [arithTyToJType from, arithTyToJType from]-sourceTypes (LSLe from) = [arithTyToJType from, arithTyToJType from]-sourceTypes (LSGt from) = [arithTyToJType from, arithTyToJType from]-sourceTypes (LSGe from) = [arithTyToJType from, arithTyToJType from]-sourceTypes (LLt from) = [intTyToJType from, intTyToJType from]-sourceTypes (LLe from) = [intTyToJType from, intTyToJType from]-sourceTypes (LGt from) = [intTyToJType from, intTyToJType from]-sourceTypes (LGe from) = [intTyToJType from, intTyToJType from]-sourceTypes (LSExt from _) = [intTyToJType from]-sourceTypes (LZExt from _) = [intTyToJType from]-sourceTypes (LTrunc from _) = [intTyToJType from]-sourceTypes (LStrConcat) = repeat stringType-sourceTypes (LStrLt) = [stringType, stringType]-sourceTypes (LStrEq) = [stringType, stringType]-sourceTypes (LStrLen) = [stringType]-sourceTypes (LIntFloat from) = [intTyToJType from]-sourceTypes (LFloatInt _) = [doubleType]-sourceTypes (LIntStr from) = [intTyToJType from]-sourceTypes (LStrInt from) = [stringType]-sourceTypes (LFloatStr) = [doubleType]-sourceTypes (LStrFloat) = [stringType]-sourceTypes (LChInt _) = [charType]-sourceTypes (LIntCh from) = [intTyToJType from]-sourceTypes (LPrintNum) = [objectType]-sourceTypes (LPrintStr) = [stringType]-sourceTypes (LReadStr) = [objectType]-sourceTypes (LFExp) = [doubleType]-sourceTypes (LFLog) = [doubleType]-sourceTypes (LFSin) = [doubleType]-sourceTypes (LFCos) = [doubleType]-sourceTypes (LFTan) = [doubleType]-sourceTypes (LFASin) = [doubleType]-sourceTypes (LFACos) = [doubleType]-sourceTypes (LFATan) = [doubleType]-sourceTypes (LFSqrt) = [doubleType]-sourceTypes (LFFloor) = [doubleType]-sourceTypes (LFCeil) = [doubleType]-sourceTypes (LMkVec nt n) = replicate n (nativeTyToJType nt)-sourceTypes (LIdxVec nt _) = [array $ nativeTyToJType nt, integerType]-sourceTypes (LUpdateVec nt _) = [array $ nativeTyToJType nt, integerType, nativeTyToJType nt]-sourceTypes (LStrHead) = [stringType]-sourceTypes (LStrTail) = [stringType]-sourceTypes (LStrCons) = [charType, stringType]-sourceTypes (LStrIndex) = [stringType, integerType]-sourceTypes (LStrRev) = [stringType]-sourceTypes (LStdIn) = []-sourceTypes (LStdOut) = []-sourceTypes (LStdErr) = []-sourceTypes (LAllocate) = [addressType]-sourceTypes (LAppendBuffer) =- [bufferType, addressType, addressType, addressType, addressType, bufferType]-sourceTypes (LSystemInfo) = [integerType]-sourceTypes (LAppend nt _) = [bufferType, addressType, addressType, intTyToJType nt]-sourceTypes (LPeek _ _) = [bufferType, addressType]-sourceTypes (LFork) = [objectType]-sourceTypes (LPar) = [objectType]-sourceTypes (LVMPtr) = []-sourceTypes (LNullPtr) = [objectType]-sourceTypes (LNoOp) = repeat objectType---------------------------------------------------------------------------- Endianess markers--endiannessConstant :: Endianness -> Exp-endiannessConstant c =- ExpName . Name . map Ident $ ["java", "nio", "ByteOrder", endiannessConstant' c]- where- endiannessConstant' BE = "BIG_ENDIAN"- endiannessConstant' LE = "LITTLE_ENDIAN"- endiannessConstant' (IRTS.Lang.Native) = endiannessConstant' BE--endiannessArguments :: PrimFn -> [Exp]-endiannessArguments (LAppend _ end) = [endiannessConstant end]-endiannessArguments (LPeek _ end) = [endiannessConstant end]-endiannessArguments _ = []
− src/IRTS/Java/Mangling.hs
@@ -1,116 +0,0 @@-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE MultiParamTypeClasses #-}--module IRTS.Java.Mangling where--import Idris.Core.TT-import IRTS.Lang-import IRTS.Simplified--import Control.Applicative-import Control.Monad-import Control.Monad.Error-import Data.Char--import Language.Java.Parser-import Language.Java.Pretty-import Language.Java.Syntax hiding (Name)-import qualified Language.Java.Syntax as J--import System.FilePath-import Debug.Trace--prefixCallNamespaces :: Ident -> SDecl -> SDecl-prefixCallNamespaces name (SFun fname args i e) =- SFun fname args i (prefixCallNamespacesExp name e)- where- prefixCallNamespacesExp :: Ident -> SExp -> SExp- prefixCallNamespacesExp (Ident name) (SApp tail (NS n ns) args) =- SApp tail (NS n (txt name:ns)) args- prefixCallNamespacesExp name (SLet var e1 e2) =- SLet var (prefixCallNamespacesExp name e1) (prefixCallNamespacesExp name e2)- prefixCallNamespacesExp name (SUpdate var e) =- SUpdate var (prefixCallNamespacesExp name e)- prefixCallNamespacesExp name (SCase up var alts) =- SCase up var (map (prefixCallNamespacesCase name) alts)- prefixCallNamespacesExp name (SChkCase var alts) =- SChkCase var (map (prefixCallNamespacesCase name) alts)- prefixCallNamespacesExp _ exp = exp-- prefixCallNamespacesCase :: Ident -> SAlt -> SAlt- prefixCallNamespacesCase name (SConCase x y n ns e) =- SConCase x y n ns (prefixCallNamespacesExp name e)- prefixCallNamespacesCase name (SConstCase c e) =- SConstCase c (prefixCallNamespacesExp name e)- prefixCallNamespacesCase name (SDefaultCase e) =- SDefaultCase (prefixCallNamespacesExp name e)--liftParsed :: (Show e, MonadError String m) => Either e a -> m a-liftParsed = either (\ err -> throwError $ "Parser error: " ++ (show err))- (return)--mkClassName :: (MonadError String m) => FilePath -> m Ident-mkClassName path =- liftParsed . parser ident . takeBaseName $ takeFileName path--mangleWithPrefix :: (Applicative m, MonadError String m) => String -> Name -> m Ident-mangleWithPrefix prefix (NS name _) = mangleWithPrefix prefix name-mangleWithPrefix prefix (MN i name) =- (\ (Ident x) -> Ident $ x ++ ('_' : show i))- <$> mangleWithPrefix prefix (UN name)-mangleWithPrefix prefix (UN name) =- liftParsed- . parser ident- . (prefix ++)- . cleanNonLetter- $ cleanWs False (str name)- where- cleanNonLetter (x:xs)- | x == '#' = "_Hash" ++ cleanNonLetter xs- | x == '@' = "_At" ++ cleanNonLetter xs- | x == '$' = "_Dollar" ++ cleanNonLetter xs- | x == '!' = "_Bang" ++ cleanNonLetter xs- | x == '.' = "_Dot" ++ cleanNonLetter xs- | x == '\'' = "_Prime" ++ cleanNonLetter xs- | x == '*' = "_Times" ++ cleanNonLetter xs- | x == '+' = "_Plus" ++ cleanNonLetter xs- | x == '/' = "_Divide" ++ cleanNonLetter xs- | x == '-' = "_Minus" ++ cleanNonLetter xs- | x == '%' = "_Mod" ++ cleanNonLetter xs- | x == '<' = "_LessThan" ++ cleanNonLetter xs- | x == '=' = "_Equals" ++ cleanNonLetter xs- | x == '>' = "_MoreThan" ++ cleanNonLetter xs- | x == '[' = "_LSBrace" ++ cleanNonLetter xs- | x == ']' = "_RSBrace" ++ cleanNonLetter xs- | x == '(' = "_LBrace" ++ cleanNonLetter xs- | x == ')' = "_RBrace" ++ cleanNonLetter xs- | x == ':' = "_Colon" ++ cleanNonLetter xs- | x == ' ' = "_Space" ++ cleanNonLetter xs- | x == ',' = "_Comma" ++ cleanNonLetter xs- | x == '_' = "__" ++ cleanNonLetter xs- -- 10 digits is the most possible to represent 2^32 (ie all of unicode)- | not (isAlphaNum x) = "_" ++ (padToWith 10 '0' . show $ ord x) ++ cleanNonLetter xs- | otherwise = x:cleanNonLetter xs- cleanNonLetter [] = []- cleanWs capitalize (x:xs)- | isSpace x = cleanWs True xs- | capitalize = (toUpper x) : (cleanWs False xs)- | otherwise = x : (cleanWs False xs)- cleanWs _ [] = []- padToWith :: Int -> a -> [a] -> [a]- padToWith n p xs = replicate (length xs - n) p ++ xs-mangleWithPrefix prefix s@(SN _) = mangleWithPrefix prefix (sUN (showCG s))--mangle :: (Applicative m, MonadError String m) => Name -> m Ident-mangle = mangleWithPrefix "__IDRCG__"--mangle' :: Name -> Ident-mangle' = either error id . mangleWithPrefix "__IDRCG__"--mangleFull :: (Applicative m, MonadError String m) => Name -> m J.Name-mangleFull (NS name (rootns:nss)) =- (\ r n ns -> J.Name (r:(ns ++ [n])))- <$> mangleWithPrefix "" (UN rootns)- <*> mangle name- <*> mapM (mangle . UN) nss-mangleFull n = J.Name . (:[]) <$> mangle n
− src/IRTS/Java/Pom.hs
@@ -1,95 +0,0 @@-module IRTS.Java.Pom (pomString) where--import Data.List (unfoldr)-import Text.XML.Light---------------------------------------------------------------------------- String <-> XML processing--uattr :: String -> String -> Attr-uattr k v = Attr (QName k Nothing Nothing) v---- from http://stackoverflow.com/a/4978733/283260-splitOn :: Eq a => a -> [a] -> [[a]]-splitOn chr = unfoldr sep where- sep [] = Nothing- sep l = Just . fmap (drop 1) . break (==chr) $ l--parseToDep :: String -> Element-parseToDep tuple =- case splitOn ':' tuple of- [g, a, v] -> dependency g a v- _ -> blank_element--dependency :: String -> String -> String -> Element-dependency g a v = unode "dependency" (groupArtifactVersion g a v)--groupArtifactVersion :: String -> String -> String -> [Element]-groupArtifactVersion g a v = [- unode "groupId" g,- unode "artifactId" a,- unode "version" v- ]--pomString :: String -> String -> [String] -> String-pomString c a d = ppElement $ pom c a d---------------------------------------------------------------------------- The pom template for idris projects--pom :: String -> String -> [String] -> Element-pom clsName artifactName dependencies = unode "project" ([- uattr "xmlns" "http://maven.apache.org/POM/4.0.0",- uattr "xmlns:xsi" "http://www.w3.org/2001/XMLSchema-instance",- uattr "xsi:schemaLocation" "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"- ],- [- unode "modelVersion" "4.0.0",- unode "groupId" "org.idris-lang",- unode "artifactId" artifactName,- unode "packaging" "jar",- unode "version" "1.0",- unode "name" artifactName,- unode "properties" [- unode "project.build.sourceEncoding" "UTF-8",- unode "skipTest" "true"- ],- unode "dependencies" (- dependency "org.idris-lang" "idris" "0.9.14" :- map parseToDep dependencies- ),- unode "build" [- unode "finalName" artifactName,- unode "plugins" [- unode "plugin" (- unode "configuration" [- unode "source" "1.7",- unode "target" "1.7"- ] : groupArtifactVersion "org.apache.maven.plugins" "maven-compiler-plugin" "3.0"- ),- unode "plugin" (- unode "configuration" (- unode "skipTests" "${skipTests}"- ) : groupArtifactVersion "org.apache.maven.plugins" "maven-surefile-plugin" "2.14"- ),- unode "plugin" (- unode "executions" [- unode "execution" [- unode "phase" "package",- unode "goals" (- unode "goal" "shade"- ),- unode "configuration" (- unode "transformers" (- unode "transformer" (- uattr "implementation" "org.apache.maven.plugins.shade.resource.ManifestResourceTransformer",- unode "mainClass" clsName- )- )- )- ]- ] : groupArtifactVersion "org.apache.maven.plugins" "maven-shade-plugin" "2.1"- )- ]- ]- ])
src/IRTS/Lang.hs view
@@ -52,7 +52,7 @@ | LBitCast ArithTy ArithTy -- Only for values of equal width | LFExp | LFLog | LFSin | LFCos | LFTan | LFASin | LFACos | LFATan- | LFSqrt | LFFloor | LFCeil+ | LFSqrt | LFFloor | LFCeil | LFNegate -- construction element extraction element insertion | LMkVec NativeTy Int | LIdxVec NativeTy Int | LUpdateVec NativeTy Int
src/Idris/AbsSyntax.hs view
@@ -21,7 +21,7 @@ import Control.Monad.State import Control.Monad.Error(throwError) -import Data.List+import Data.List hiding (insert,union) import Data.Char import qualified Data.Text as T import Data.Either@@ -111,9 +111,16 @@ idris_language_extensions = ErrorReflection : idris_language_extensions i } -addTrans :: (Term, Term) -> Idris ()-addTrans t = do i <- getIState- putIState $ i { idris_transforms = t : idris_transforms i }+-- Transforms are organised by the function being applied on the lhs of the+-- transform, to make looking up appropriate transforms quicker+addTrans :: Name -> (Term, Term) -> Idris ()+addTrans basefn t + = do i <- getIState+ let t' = case lookupCtxtExact basefn (idris_transforms i) of+ Just def -> (t : def)+ Nothing -> [t]+ putIState $ i { idris_transforms = addDef basefn t' + (idris_transforms i) } addErrRev :: (Term, Term) -> Idris () addErrRev t = do i <- getIState@@ -279,7 +286,7 @@ addCoercion n = do i <- getIState putIState $ i { idris_coercions = nub $ n : idris_coercions i } -addDocStr :: Name -> Docstring -> [(Name, Docstring)] -> Idris ()+addDocStr :: Name -> Docstring DocTerm -> [(Name, Docstring DocTerm)] -> Idris () addDocStr n doc args = do i <- getIState putIState $ i { idris_docstrings = addDef n (doc, args) (idris_docstrings i) }@@ -491,7 +498,7 @@ addDeferred' :: NameType -> [(Name, (Int, Maybe Name, Type, Bool))] -> Idris () addDeferred' nt ns- = do mapM_ (\(n, (i, _, t, _)) -> updateContext (addTyDecl n nt (tidyNames [] 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 ++@@ -500,11 +507,11 @@ -- 'tidyNames' is to generate user accessible names in case they are -- needed in tactic scripts tidyNames used (Bind (MN i x) b sc)- = let n' = uniqueName (UN x) used in- Bind n' b $ tidyNames (n':used) sc+ = let n' = uniqueNameSet (UN x) used in+ Bind n' b $ tidyNames (S.insert n' used) sc tidyNames used (Bind n b sc)- = let n' = uniqueName n used in- Bind n' b $ tidyNames (n':used) sc+ = let n' = uniqueNameSet n used in+ Bind n' b $ tidyNames (S.insert n' used) sc tidyNames used b = b solveDeferred :: Name -> Idris ()@@ -601,13 +608,39 @@ setErrContext :: Bool -> Idris () setErrContext t = do i <- getIState let opts = idris_options i- let opt' = opts { opt_errContext = t }- putIState $ i { idris_options = opt' }+ let opts' = opts { opt_errContext = t }+ putIState $ i { idris_options = opts' } errContext :: Idris Bool errContext = do i <- getIState return (opt_errContext (idris_options i)) +getOptimise :: Idris [Optimisation]+getOptimise = do i <- getIState+ return (opt_optimise (idris_options i))++setOptimise :: [Optimisation] -> Idris ()+setOptimise newopts = do i <- getIState+ let opts = idris_options i+ let opts' = opts { opt_optimise = newopts }+ putIState $ i { idris_options = opts' }++addOptimise :: Optimisation -> Idris ()+addOptimise opt = do opts <- getOptimise+ setOptimise (nub (opt : opts))++removeOptimise :: Optimisation -> Idris ()+removeOptimise opt = do opts <- getOptimise+ setOptimise ((nub opts) \\ [opt])++-- Set appropriate optimisation set for the given level. We only have+-- one optimisation that is configurable at the moment, however!+setOptLevel :: Int -> Idris ()+setOptLevel n | n <= 0 = setOptimise []+setOptLevel 1 = setOptimise []+setOptLevel 2 = setOptimise [PETransform]+setOptLevel n | n >= 3 = setOptimise [PETransform]+ useREPL :: Idris Bool useREPL = do i <- getIState return (opt_repl (idris_options i))@@ -701,16 +734,6 @@ targetCPU = do i <- getIState return (opt_cpu (idris_options i)) -setOptLevel :: Word -> Idris ()-setOptLevel t = do i <- getIState- let opts = idris_options i- opt' = opts { opt_optLevel = t }- putIState $ i { idris_options = opt' }--optLevel :: Idris Word-optLevel = do i <- getIState- return (opt_optLevel (idris_options i))- verbose :: Idris Bool verbose = do i <- getIState return (opt_verbose (idris_options i))@@ -1033,7 +1056,6 @@ [] -> 0 -- must be locally bound, if it's not an error... pri (PPi _ _ x y) = max 5 (max (pri x) (pri y)) pri (PTrue _ _) = 0- pri (PFalse _) = 0 pri (PRefl _ _) = 1 pri (PEq _ _ _ l r) = max 1 (max (pri l) (pri r)) pri (PRewrite _ l r _) = max 1 (max (pri l) (pri r))@@ -1052,21 +1074,36 @@ addStatics :: Name -> Term -> PTerm -> Idris () addStatics n tm ptm = do let (statics, dynamics) = initStatics tm ptm+ ist <- getIState+ let paramnames + = nub $ case lookupCtxtExact n (idris_fninfo ist) of+ Just p -> getNamesFrom 0 (fn_params p) tm +++ concatMap (getParamNames ist) (map snd statics)+ _ -> concatMap (getParamNames ist) (map snd statics)+ let stnames = nub $ concatMap freeArgNames (map snd statics)- let dnames = nub $ concatMap freeArgNames (map snd dynamics)+ let dnames = (nub $ concatMap freeArgNames (map snd dynamics))+ \\ paramnames -- also get the arguments which are 'uniquely inferrable' from -- statics (see sec 4.2 of "Scrapping Your Inefficient Engine")+ -- or parameters to the type of a static let statics' = nub $ map fst statics ++ filter (\x -> not (elem x dnames)) stnames let stpos = staticList statics' tm i <- getIState when (not (null statics)) $- logLvl 5 $ show n ++ " " ++ show statics' ++ "\n" ++ show dynamics- ++ "\n" ++ show stnames ++ "\n" ++ show dnames+ logLvl 3 $ "Statics for " ++ show n ++ " " ++ show tm ++ "\n"+ ++ showTmImpls ptm ++ "\n"+ ++ show statics ++ "\n" ++ show dynamics+ ++ "\n" ++ show paramnames+ ++ "\n" ++ show stpos putIState $ i { idris_statics = addDef n stpos (idris_statics i) } addIBC (IBCStatic n) where- initStatics (Bind n (Pi ty _) sc) (PPi p _ _ s)+ initStatics (Bind n (Pi ty _) sc) (PPi p n' t s)+ | n /= n' = let (static, dynamic) = initStatics sc (PPi p n' t s) in+ (static, (n, ty) : dynamic)+ initStatics (Bind n (Pi ty _) sc) (PPi p n' _ s) = let (static, dynamic) = initStatics (instantiate (P Bound n ty) sc) s in if pstatic p == Static then ((n, ty) : static, dynamic) else if (not (searchArg p)) @@ -1074,8 +1111,25 @@ else (static, dynamic) initStatics t pt = ([], []) + getParamNames ist tm | (P _ n _ , args) <- unApply tm+ = case lookupCtxtExact n (idris_datatypes ist) of+ Just ti -> getNamePos 0 (param_pos ti) args+ Nothing -> []+ where getNamePos i ps [] = []+ getNamePos i ps (P _ n _ : as) + | i `elem` ps = n : getNamePos (i + 1) ps as+ getNamePos i ps (_ : as) = getNamePos (i + 1) ps as+ getParamNames ist (Bind t (Pi (P _ n _) _) sc)+ = n : getParamNames ist sc+ getParamNames ist _ = []++ getNamesFrom i ps (Bind n (Pi _ _) sc)+ | i `elem` ps = n : getNamesFrom (i + 1) ps sc+ | otherwise = getNamesFrom (i + 1) ps sc+ getNamesFrom i ps sc = []+ freeArgNames (Bind n (Pi ty _) sc) - = nub $ freeArgNames ty + = nub $ freeNames ty ++ freeNames sc -- treat '->' as fn here freeArgNames tm = let (_, args) = unApply tm in concatMap freeNames args @@ -1760,7 +1814,6 @@ match (PRefl _ _) (PRefl _ _) = return [] match (PResolveTC _) (PResolveTC _) = return [] match (PTrue _ _) (PTrue _ _) = return []- match (PFalse _) (PFalse _) = return [] match (PReturn _) (PReturn _) = return [] match (PPi _ _ t s) (PPi _ _ t' s') = do mt <- match' t t' ms <- match' s s'@@ -1856,8 +1909,9 @@ -- about with shadowing anywhere else). mkUniqueNames :: [Name] -> PTerm -> PTerm-mkUniqueNames env tm = evalState (mkUniq tm) env where- inScope = boundNamesIn tm+mkUniqueNames env tm = evalState (mkUniq tm) (S.fromList env) where+ inScope :: S.Set Name+ inScope = S.fromList $ boundNamesIn tm mkUniqA arg = do t' <- mkUniq (getTm arg) return (arg { getTm = t' })@@ -1872,40 +1926,40 @@ -- long as there are no bindings inside tactics though. mkUniqT tac = return tac - mkUniq :: PTerm -> State [Name] PTerm+ mkUniq :: PTerm -> State (S.Set Name) PTerm mkUniq (PLam n ty sc) = do env <- get (n', sc') <-- if n `elem` env- then do let n' = uniqueName (initN n (length env))- (env ++ inScope)+ 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) else return (n, sc)- put (n' : env)+ put (S.insert n' env) ty' <- mkUniq ty sc'' <- mkUniq sc' return $! PLam n' ty' sc'' mkUniq (PPi p n ty sc) = do env <- get (n', sc') <-- if n `elem` env- then do let n' = uniqueName (initN n (length env))- (env ++ inScope)+ 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) else return (n, sc)- put (n' : env)+ put (S.insert n' env) ty' <- mkUniq ty sc'' <- mkUniq sc' return $! PPi p n' ty' sc'' mkUniq (PLet n ty val sc) = do env <- get (n', sc') <-- if n `elem` env- then do let n' = uniqueName (initN n (length env))- (env ++ inScope)+ 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) else return (n, sc)- put (n' : env)+ put (S.insert n' env) ty' <- mkUniq ty; val' <- mkUniq val sc'' <- mkUniq sc' return $! PLet n' ty' val' sc''@@ -1928,11 +1982,11 @@ mkUniq (PDPair fc p (PRef fc' n) t sc) | t /= Placeholder = do env <- get- (n', sc') <- if n `elem` env- then do let n' = uniqueName n (env ++ inScope)+ (n', sc') <- if n `S.member` env+ then do let n' = uniqueNameSet n (S.union env inScope) return (n', shadow n n' sc) else return (n, sc)- put (n' : env)+ put (S.insert n' env) t' <- mkUniq t sc'' <- mkUniq sc' return $! PDPair fc p (PRef fc' n') t' sc''
src/Idris/AbsSyntaxTree.hs view
@@ -29,7 +29,7 @@ import Data.Either import qualified Data.Set as S import Data.Word (Word)-import Data.Maybe (fromMaybe)+import Data.Maybe (fromMaybe, mapMaybe) import Data.Traversable (Traversable) import Data.Foldable (Foldable) @@ -75,11 +75,11 @@ opt_importdirs :: [FilePath], opt_triple :: String, opt_cpu :: String,- opt_optLevel :: Word, opt_cmdline :: [Opt], -- remember whole command line opt_origerr :: Bool, opt_autoSolve :: Bool, -- ^ automatically apply "solve" tactic in prover- opt_autoImport :: [FilePath] -- ^ e.g. Builtins+Prelude+ opt_autoImport :: [FilePath], -- ^ e.g. Builtins+Prelude+ opt_optimise :: [Optimisation] } deriving (Show, Eq) @@ -99,17 +99,22 @@ , opt_importdirs = [] , opt_triple = "" , opt_cpu = ""- , opt_optLevel = 2 , opt_cmdline = [] , opt_origerr = False , opt_autoSolve = True , opt_autoImport = []+ , opt_optimise = defaultOptimise } data PPOption = PPOption { ppopt_impl :: Bool -- ^^ whether to show implicits } deriving (Show) +data Optimisation = PETransform -- partial eval and associated transforms+ deriving (Show, Eq)++defaultOptimise = [PETransform]+ -- | Pretty printing options with default verbosity. defaultPPOption :: PPOption defaultPPOption = PPOption { ppopt_impl = False }@@ -158,9 +163,10 @@ idris_flags :: Ctxt [FnOpt], idris_callgraph :: Ctxt CGInfo, -- name, args used in each pos idris_calledgraph :: Ctxt [Name],- idris_docstrings :: Ctxt (Docstring, [(Name, Docstring)]),+ idris_docstrings :: Ctxt (Docstring DocTerm, [(Name, Docstring DocTerm)]), idris_tyinfodata :: Ctxt TIData, idris_fninfo :: Ctxt FnInfo,+ idris_transforms :: Ctxt [(Term, Term)], idris_totcheck :: [(FC, Name)], -- names to check totality on idris_defertotcheck :: [(FC, Name)], -- names to check at the end idris_totcheckfail :: [(FC, String)],@@ -170,7 +176,6 @@ -- ^ Full application LHS on source line idris_metavars :: [(Name, (Maybe Name, Int, Bool))], -- ^ The currently defined but not proven metavariables idris_coercions :: [Name],- idris_transforms :: [(Term, Term)], idris_errRev :: [(Term, Term)], syntax_rules :: [Syntax], syntax_keywords :: [String],@@ -238,7 +243,7 @@ primDefs = [sUN "unsafePerformPrimIO", sUN "mkLazyForeignPrim", sUN "mkForeignPrim",- sUN "FalseElim"]+ sUN "void"] -- information that needs writing for the current module's .ibc file data IBCWrite = IBCFix FixDecl@@ -264,7 +269,7 @@ | IBCTotal Name Totality | IBCFlags Name [FnOpt] | IBCFnInfo Name FnInfo- | IBCTrans (Term, Term)+ | IBCTrans Name (Term, Term) | IBCErrRev (Term, Term) | IBCCG Name | IBCDoc Name@@ -284,8 +289,8 @@ idrisInit = IState initContext [] [] emptyContext emptyContext emptyContext emptyContext emptyContext emptyContext emptyContext emptyContext emptyContext emptyContext emptyContext- emptyContext emptyContext emptyContext- [] [] [] defaultOpts 6 [] [] [] [] [] [] [] [] [] [] [] [] []+ emptyContext emptyContext emptyContext emptyContext+ [] [] [] defaultOpts 6 [] [] [] [] [] [] [] [] [] [] [] [] [] [] Nothing [] Nothing [] [] Nothing Nothing [] Hidden False [] Nothing [] [] (RawOutput stdout) True defaultTheme [] (0, emptyContext) emptyContext M.empty AutomaticWidth S.empty Nothing Nothing []@@ -363,7 +368,12 @@ | CallsWho Name | MakeDoc String -- IdrisDoc | Warranty+ | PrintDef Name+ | PPrint OutputFmt Int PTerm+ | TransformInfo Name +data OutputFmt = HTMLOutput | LaTeXOutput+ data Opt = Filename String | Quiet | NoBanner@@ -389,6 +399,7 @@ | ErrContext | ShowImpl | Verbose+ | Port String -- REPL TCP port | IBCSubDir String | ImportDir String | PkgBuild String@@ -410,7 +421,9 @@ | EvalExpr String | TargetTriple String | TargetCPU String- | OptLevel Word+ | OptLevel Int+ | AddOpt Optimisation+ | RemoveOpt Optimisation | Client String | ShowOrigErr | AutoWidth -- ^ Automatically adjust terminal width@@ -479,7 +492,7 @@ impl = Imp [] Dynamic False expl = Exp [] Dynamic False expl_param = Exp [] Dynamic True-constraint = Constraint [] Dynamic+constraint = Constraint [] Static tacimpl t = TacImp [] Dynamic t data FnOpt = Inlinable -- always evaluate when simplifying@@ -530,19 +543,19 @@ -- datatypes and typeclasses. data PDecl' t = PFix FC Fixity [String] -- ^ Fixity declaration- | PTy Docstring [(Name, Docstring)] SyntaxInfo FC FnOpts Name t -- ^ Type declaration- | PPostulate Docstring SyntaxInfo FC FnOpts Name t -- ^ Postulate+ | PTy (Docstring (Either Err PTerm)) [(Name, Docstring (Either Err PTerm))] SyntaxInfo FC FnOpts Name t -- ^ Type declaration+ | PPostulate (Docstring (Either Err PTerm)) SyntaxInfo FC FnOpts Name t -- ^ Postulate | PClauses FC FnOpts Name [PClause' t] -- ^ Pattern clause | PCAF FC Name t -- ^ Top level constant- | PData Docstring [(Name, Docstring)] SyntaxInfo FC DataOpts (PData' t) -- ^ Data declaration.+ | PData (Docstring (Either Err PTerm)) [(Name, Docstring (Either Err PTerm))] SyntaxInfo FC DataOpts (PData' t) -- ^ Data declaration. | PParams FC [(Name, t)] [PDecl' t] -- ^ Params block | PNamespace String [PDecl' t] -- ^ New namespace- | PRecord Docstring SyntaxInfo FC Name t DataOpts Docstring Name t -- ^ Record declaration- | PClass Docstring SyntaxInfo FC+ | PRecord (Docstring (Either Err PTerm)) SyntaxInfo FC Name t DataOpts (Docstring (Either Err PTerm)) Name t -- ^ Record declaration+ | PClass (Docstring (Either Err PTerm)) SyntaxInfo FC [t] -- constraints Name [(Name, t)] -- parameters- [(Name, Docstring)] -- parameter docstrings+ [(Name, Docstring (Either Err PTerm))] -- parameter docstrings [PDecl' t] -- declarations -- ^ Type class: arguments are documentation, syntax info, source location, constraints, -- class name, parameters, method declarations@@ -593,7 +606,7 @@ -- | Data declaration data PData' t = PDatadecl { d_name :: Name, -- ^ The name of the datatype d_tcon :: t, -- ^ Type constructor- d_cons :: [(Docstring, [(Name, Docstring)], Name, t, FC, [Name])] -- ^ Constructors+ d_cons :: [(Docstring (Either Err PTerm), [(Name, Docstring (Either Err PTerm))], Name, t, FC, [Name])] -- ^ Constructors } -- ^ Data declaration | PLaterdecl { d_name :: Name, d_tcon :: t }@@ -692,37 +705,36 @@ data PunInfo = IsType | IsTerm | TypeOrTerm deriving (Eq, Show) -- | High level language terms-data PTerm = PQuote Raw- | PRef FC Name+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- | PPatvar FC Name- | PLam Name PTerm PTerm+ | PPatvar FC Name -- ^ A pattern variable+ | PLam Name PTerm PTerm -- ^ A lambda abstraction | PPi Plicity Name PTerm PTerm -- ^ (n : t1) -> t2- | PLet Name PTerm PTerm PTerm+ | PLet Name PTerm PTerm PTerm -- ^ A let binding | PTyped PTerm PTerm -- ^ Term with explicit type | PApp FC PTerm [PArg] -- ^ e.g. IO (), List Char, length x | PAppBind FC PTerm [PArg] -- ^ implicitly bound application | PMatchApp FC Name -- ^ Make an application by type matching- | PCase FC PTerm [(PTerm, PTerm)]+ | PCase FC PTerm [(PTerm, PTerm)] -- ^ A case expression. Args are source location, scrutinee, and a list of pattern/RHS pairs | PTrue FC PunInfo -- ^ Unit type..?- | PFalse FC -- ^ _|_- | PRefl FC PTerm- | PResolveTC FC+ | PRefl FC PTerm -- ^ The canonical proof of the equality type+ | PResolveTC FC -- ^ Solve this dictionary by type class resolution | PEq FC PTerm PTerm PTerm PTerm -- ^ Heterogeneous equality type: A = B- | PRewrite FC PTerm PTerm (Maybe PTerm)- | PPair FC PunInfo PTerm PTerm- | PDPair FC PunInfo PTerm PTerm PTerm- | PAlternative Bool [PTerm] -- True if only one may work+ | 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)+ | PAlternative Bool [PTerm] -- ^ True if only one may work. (| A, B, C|) | PHidden PTerm -- ^ Irrelevant or hidden pattern | PType -- ^ 'Type' type | PUniverse Universe -- ^ Some universe - | PGoal FC PTerm Name PTerm+ | PGoal FC PTerm Name PTerm -- ^ quoteGoal, used for %reflection functions | PConstant Const -- ^ Builtin types- | Placeholder- | PDoBlock [PDo]- | PIdiom FC PTerm+ | Placeholder -- ^ Underscore+ | PDoBlock [PDo] -- ^ Do notation+ | PIdiom FC PTerm -- ^ Idiom brackets | PReturn FC- | PMetavar Name+ | PMetavar Name -- ^ A metavariable, ?name | PProof [PTactic] -- ^ Proof script | PTactics [PTactic] -- ^ As PProof, but no auto solving | PElabError Err -- ^ Error to report on elaboration@@ -968,6 +980,11 @@ data Syntax = Rule [SSymbol] PTerm SynContext deriving Show++syntaxNames :: Syntax -> [Name]+syntaxNames (Rule syms _ _) = mapMaybe ename syms+ where ename (Keyword n) = Just n+ ename _ = Nothing {-! deriving instance Binary Syntax deriving instance NFData Syntax@@ -979,6 +996,8 @@ | Expr Name | SimpleExpr Name deriving Show+ + {-! deriving instance Binary SSymbol deriving instance NFData SSymbol@@ -1014,14 +1033,14 @@ maxline :: Maybe Int, mut_nesting :: Int, dsl_info :: DSL,- syn_in_quasiquote :: Bool }+ syn_in_quasiquote :: Int } deriving Show {-! deriving instance NFData SyntaxInfo deriving instance Binary SyntaxInfo !-} -defaultSyntax = Syn [] [] [] [] id False False Nothing 0 initDSL False+defaultSyntax = Syn [] [] [] [] id False False Nothing 0 initDSL 0 expandNS :: SyntaxInfo -> Name -> Name expandNS syn n@(NS _ _) = n@@ -1059,51 +1078,26 @@ --- Handy primitives: Unit, False, Pair, MkPair, =, mkForeign, Elim type class+-- Handy primitives: Unit, False, Pair, MkPair, =, mkForeign -primNames = [unitTy, unitCon,- falseTy, pairTy, pairCon,- eqTy, eqCon, inferTy, inferCon]+primNames = [eqTy, eqCon, inferTy, inferCon] -unitDoc = parseDocstring . T.pack $ "The canonical single-element type, also known as the trivially true proposition."-unitTy = sMN 0 "__Unit"-unitCon = sMN 0 "__II"-unitDecl = PDatadecl unitTy PType- [(parseDocstring . T.pack $ "The trivial constructor for `()`. ", [], unitCon, PRef bi unitTy, bi, [])]-unitOpts = [DefaultEliminator]+unitTy = sUN "Unit"+unitCon = sUN "MkUnit" -falseDoc = parseDocstring . T.pack $+falseDoc = fmap (const $ Msg "") . parseDocstring . T.pack $ "The empty type, also known as the trivially false proposition." ++ "\n\n" ++- "Use `FalseElim` or `absurd` to prove anything if you have a variable " ++- "of type `_|_` in scope."-falseTy = sMN 0 "__False"-falseDecl = PDatadecl falseTy PType []-falseOpts = []+ "Use `void` or `absurd` to prove anything if you have a variable " +++ "of type `Void` in scope."+falseTy = sUN "Void" -pairDoc = parseDocstring . T.pack $ "The non-dependent pair type, also known as conjunction."-pairTy = sMN 0 "__Pair"-pairCon = sMN 0 "__MkPair"-pairDecl = PDatadecl pairTy (piBind [(n "A", PType), (n "B", PType)] PType)- [(pairConDoc, pairConParamDoc,- pairCon, PPi impl (n "A") PType (- PPi impl (n "B") PType (- PPi expl (n "a") (PRef bi (n "A")) (- PPi expl (n "b") (PRef bi (n "B"))- (PApp bi (PRef bi pairTy) [pexp (PRef bi (n "A")),- pexp (PRef bi (n "B"))])))), bi, [])]- where n a = sMN 0 a- pairConDoc = parseDocstring . T.pack $ "A pair of elements"- pairConParamDoc = [(n "a", parseDocstring . T.pack $ "the left element of the pair"),- (n "b", parseDocstring . T.pack $ "the right element of the pair")]-pairOpts = []-pairParamDoc = [(n "A", parseDocstring . T.pack $ "the type of the left elements in the pair"),- (n "B", parseDocstring . T.pack $ "the type of the left elements in the pair")]- where n a = sMN 0 a+pairTy = sUN "Pair"+pairCon = sUN "MkPair" eqTy = sUN "="-eqCon = sUN "refl"-eqDoc = parseDocstring . T.pack $+eqCon = sUN "Refl"+eqDoc = fmap (const (Left $ Msg "")) . parseDocstring . T.pack $ "The propositional equality type. A proof that `x` = `y`." ++ "\n\n" ++ "To use such a proof, pattern-match on it, and the two equal things will " ++@@ -1126,29 +1120,22 @@ pexp (PRef bi (n "x")), pexp (PRef bi (n "x"))])), bi, [])] where n a = sUN a- reflDoc = parseDocstring . T.pack $+ reflDoc = annotCode (const (Left $ Msg "")) . parseDocstring . T.pack $ "A proof that `x` in fact equals `x`. To construct this, you must have already " ++ "shown that both sides are in fact equal."- reflParamDoc = [(n "A", parseDocstring . T.pack $ "the type at which the equality is proven"),- (n "x", parseDocstring . T.pack $ "the element shown to be equal to itself.")]+ reflParamDoc = [(n "A", annotCode (const (Left $ Msg "")) . parseDocstring . T.pack $ "the type at which the equality is proven"),+ (n "x", annotCode (const (Left $ Msg "")) . parseDocstring . T.pack $ "the element shown to be equal to itself.")] -eqParamDoc = [(n "A", parseDocstring . T.pack $ "the type of the left side of the equality"),- (n "B", parseDocstring . T.pack $ "the type of the right side of the equality")+eqParamDoc = [(n "A", annotCode (const (Left $ Msg "")) . parseDocstring . T.pack $ "the type of the left side of the equality"),+ (n "B", annotCode (const (Left $ Msg "")) . parseDocstring . T.pack $ "the type of the right side of the equality") ] where n a = sUN a eqOpts = [] -elimName = sUN "__Elim"-elimMethElimTy = sUN "__elimTy"-elimMethElim = sUN "elim"-elimDecl = PClass (parseDocstring . T.pack $ "Type class for eliminators") defaultSyntax bi [] elimName [(sUN "scrutineeType", PType)] []- [PTy emptyDocstring [] defaultSyntax bi [TotalFn] elimMethElimTy PType,- PTy emptyDocstring [] defaultSyntax bi [TotalFn] elimMethElim (PRef bi elimMethElimTy)]- -- Defined in builtins.idr sigmaTy = sUN "Sigma"-existsCon = sUN "Sg_intro"+existsCon = sUN "MkSigma" piBind :: [(Name, PTerm)] -> PTerm -> PTerm piBind = piBindp expl@@ -1206,6 +1193,8 @@ 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 isPostulateName :: Name -> IState -> Bool isPostulateName n ist = S.member n (idris_postulates ist)@@ -1244,10 +1233,9 @@ text "\\" <> bindingOf n False <+> text "=>" <$> prettySe 10 ((n, False):bnd) sc prettySe p bnd (PLet n ty v sc) =- bracket p 2 $- kwd "let" <+> bindingOf n False <+> text "=" </>- prettySe 10 bnd v <+> kwd "in" </>- prettySe 10 ((n, False):bnd) sc+ bracket p 2 . group . align $+ kwd "let" <+> (group . align . hang 2 $ bindingOf n False <+> text "=" <$> prettySe 10 bnd v) </>+ kwd "in" <+> (group . align . hang 2 $ prettySe 10 ((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 2 . group $@@ -1334,15 +1322,23 @@ sc (l, r) = nest nestingSize $ prettySe 10 bnd l <+> text "=>" <+> prettySe 10 bnd r prettySe p bnd (PHidden tm) = text "." <> prettySe 0 bnd tm- prettySe p bnd (PRefl _ _) = annName eqCon $ text "refl"+ prettySe p bnd (PRefl _ _) = annName eqCon $ text "Refl" prettySe p bnd (PResolveTC _) = text "resolvetc" 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 (PFalse _) = annName falseTy $ text "_|_"- prettySe p bnd (PEq _ _ _ l r) =- bracket p 2 . align . group $- prettySe 10 bnd l <+> eq <$> group (prettySe 10 bnd r)+ prettySe p bnd (PEq _ lt rt l r)+ | ppopt_impl ppo =+ bracket p 1 $+ enclose lparen rparen eq <+>+ align (group (vsep (map (prettyArgS bnd)+ [PImp 0 False [] (sUN "A") lt,+ PImp 0 False [] (sUN "B") rt,+ PExp 0 [] (sUN "x") l,+ PExp 0 [] (sUN "y") r])))+ | otherwise =+ bracket p 2 . align . group $+ prettySe 10 bnd l <+> eq <$> group (prettySe 10 bnd r) where eq = annName eqTy (text "=") prettySe p bnd (PRewrite _ l r _) = bracket p 2 $@@ -1480,11 +1476,6 @@ getFixity :: String -> Maybe Fixity getFixity = flip M.lookup fixities -prettyDocumentedIst :: IState -> (Name, PTerm, Maybe Docstring) -> Doc OutputAnnotation-prettyDocumentedIst ist (name, ty, docs) =- prettyName True True [] name <+> colon <+> align (prettyIst ist ty) <$>- fromMaybe empty (fmap (\d -> renderDocstring d <> line) docs)- -- | Pretty-printer helper for the binding site of a name bindingOf :: Name -- ^^ the bound name -> Bool -- ^^ whether the name is implicit@@ -1505,7 +1496,6 @@ baseName (UN n) = T.unpack n baseName (NS n ns) = baseName n baseName (MN i s) = T.unpack s - baseName n | n == falseTy = "_|_" baseName other = show other nameSpace = case n of (NS n' ns) -> if showNS then (concatMap (++ ".") . map T.unpack . reverse) ns else ""@@ -1635,7 +1625,6 @@ size (PAppBind fc name args) = 1 + size args size (PCase fc trm bdy) = 1 + size trm + size bdy size (PTrue fc _) = 1- size (PFalse fc) = 1 size (PRefl fc _) = 1 size (PResolveTC fc) = 1 size (PEq fc _ _ left right) = 1 + size left + size right
src/Idris/Apropos.hs view
@@ -38,10 +38,9 @@ isApropos str (NS n' ns) = isApropos str n' || any (textIn str) ns -- Handle special names from stdlib isApropos str n | (n == unitTy || n == unitCon) && str == T.pack "()" = True- | n == falseTy && str == T.pack "_|_" = True | (n == pairTy || n == pairCon) && str == T.pack "," = True | n == eqTy && str == T.pack "=" = True- | n == eqCon && (T.toLower str) == T.pack "refl" = True+ | n == eqCon && (T.toLower str) == T.pack "Refl" = True | (n == sigmaTy || n == existsCon) && str == T.pack "**" = True isApropos _ _ = False -- we don't care about case blocks, MNs, etc @@ -71,7 +70,7 @@ instance Apropos Const where isApropos str c = textIn str (T.pack (show c)) -instance Apropos Docstring where+instance Apropos (Docstring a) where isApropos str d = containsText str d instance (Apropos a, Apropos b) => Apropos (a, b) where
src/Idris/Chaser.hs view
@@ -70,7 +70,7 @@ buildTree :: [FilePath] -> -- already guaranteed built FilePath -> Idris [ModuleTree]-buildTree built fp = btree [] fp +buildTree built fp = btree [] fp -- = idrisCatch (btree [] fp) -- (\e -> do now <- runIO $ getCurrentTime -- iputStrLn (show e)@@ -114,6 +114,10 @@ -- 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
src/Idris/CmdOptions.hs view
@@ -64,7 +64,7 @@ parser :: Parser [Opt] parser = runA $ proc () -> do flags <- asA parseFlags -< ()- files <- asA (many $ argument ((fmap . fmap) Filename str) (metavar "FILES")) -< ()+ files <- asA (many $ argument (fmap Filename str) (metavar "FILES")) -< () A parseVersion >>> A helper -< (flags ++ files) parseFlags :: Parser [Opt]@@ -80,7 +80,7 @@ <|> flag' NoBuiltins (long "nobuiltins") <|> flag' NoREPL (long "check" <> help "Typecheck only, don't start the REPL") <|> (Output <$> strOption (short 'o' <> long "output" <> metavar "FILE" <> help "Specify output file"))- <|> flag' TypeCase (long "typecase")+-- <|> flag' TypeCase (long "typecase") <|> flag' TypeInType (long "typeintype") <|> flag' DefaultTotal (long "total" <> help "Require functions to be total by default") <|> flag' DefaultPartial (long "partial")@@ -96,6 +96,7 @@ <|> (ImportDir <$> strOption (short 'i' <> long "idrispath" <> help "Add directory to the list of import paths")) <|> flag' WarnOnly (long "warn") <|> (Pkg <$> strOption (short 'p' <> long "package"))+ <|> (Port <$> strOption (long "port" <> metavar "PORT" <> help "REPL TCP port")) -- Package commands <|> (PkgBuild <$> strOption (long "build" <> metavar "IPKG" <> help "Build package")) <|> (PkgInstall <$> strOption (long "install" <> metavar "IPKG" <> help "Install package"))@@ -115,11 +116,13 @@ <|> (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 langage extension (TypeProviders or ErrorReflection)"))+ <|> ((\s -> Extension $ getExt s) <$> strOption (long "extension" <> short 'X' <> metavar "EXT" <> help "Turn on language extension (TypeProviders or ErrorReflection)")) <|> flag' (OptLevel 3) (long "O3") <|> flag' (OptLevel 2) (long "O2") <|> flag' (OptLevel 1) (long "O1") <|> flag' (OptLevel 0) (long "O0")+ <|> flag' (AddOpt PETransform) (long "partial-eval")+ <|> flag' (RemoveOpt PETransform) (long "no-partial-eval") <|> (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)"))
src/Idris/Core/Binary.hs view
@@ -1,3 +1,5 @@+{-# OPTIONS_GHC -fwarn-incomplete-patterns -Werror #-}+ {-| Binary instances for the core datatypes -} module Idris.Core.Binary where @@ -7,6 +9,169 @@ import Idris.Core.TT +instance Binary ErrorReportPart where+ put (TextPart msg) = do putWord8 0 ; put msg+ put (NamePart n) = do putWord8 1 ; put n+ put (TermPart t) = do putWord8 2 ; put t+ put (SubReport ps) = do putWord8 3 ; put ps++ get = do i <- getWord8+ case i of+ 0 -> fmap TextPart get+ 1 -> fmap NamePart get+ 2 -> fmap TermPart get+ 3 -> fmap SubReport get+ _ -> error "Corrupted binary data for ErrorReportPart"++instance Binary a => Binary (Err' a) where+ put (Msg str) = do putWord8 0+ put str+ put (InternalMsg str) = do putWord8 1+ put str+ put (CantUnify x y z e ctxt i) = do putWord8 2+ put x+ put y+ put z+ put e+ put ctxt+ put i+ put (InfiniteUnify n t ctxt) = do putWord8 3+ put n+ put t+ put ctxt+ put (CantConvert x y ctxt) = do putWord8 4+ put x+ put y+ put ctxt+ put (CantSolveGoal x ctxt) = do putWord8 5+ put x+ put ctxt+ put (UnifyScope n1 n2 x ctxt) = do putWord8 6+ put n1+ put n2+ put x+ put ctxt+ put (CantInferType str) = do putWord8 7+ put str+ put (NonFunctionType t1 t2) = do putWord8 8+ put t1+ put t2+ put (NotEquality t1 t2) = do putWord8 9+ put t1+ put t2+ put (TooManyArguments n) = do putWord8 10+ put n+ put (CantIntroduce t) = do putWord8 11+ put t+ put (NoSuchVariable n) = do putWord8 12+ put n+ put (NoTypeDecl n) = do putWord8 13+ put n+ put (NotInjective x y z) = do putWord8 14+ put x+ put y+ put z+ put (CantResolve t) = do putWord8 15+ put t+ put (CantResolveAlts ns) = do putWord8 16+ put ns+ put (IncompleteTerm t) = do putWord8 17+ put t+ put UniverseError = putWord8 18+ put (UniqueError u n) = do putWord8 19+ put u+ put n+ put (UniqueKindError u n) = do putWord8 20+ put u+ put n+ put ProgramLineComment = putWord8 21+ put (Inaccessible n) = do putWord8 22+ put n+ put (NonCollapsiblePostulate n) = do putWord8 23+ put n+ put (AlreadyDefined n) = do putWord8 24+ put n+ put (ProofSearchFail e) = do putWord8 25+ put e+ put (NoRewriting t) = do putWord8 26+ put t+ put (At fc e) = do putWord8 27+ put fc+ put e+ put (Elaborating str n e) = do putWord8 28+ put str+ put n+ put e+ put (ElaboratingArg n1 n2 ns e) = do putWord8 29+ put n1+ put n2+ put ns+ put e+ put (ProviderError str) = do putWord8 30+ put str+ put (LoadingFailed str e) = do putWord8 31+ put str+ put e+ put (ReflectionError parts e) = do putWord8 32+ put parts+ put e+ put (ReflectionFailed str e) = do putWord8 33+ put str+ put e++ get = do i <- getWord8+ case i of+ 0 -> fmap Msg get+ 1 -> fmap InternalMsg get+ 2 -> do x <- get ; y <- get ; z <- get ; e <- get ; ctxt <- get ; i <- get+ return $ CantUnify x y z e ctxt i+ 3 -> do x <- get ; y <- get ; z <- get+ return $ InfiniteUnify x y z+ 4 -> do x <- get ; y <- get ; z <- get+ return $ CantConvert x y z+ 5 -> do x <- get ; y <- get+ return $ CantSolveGoal x y+ 6 -> do w <- get ; x <- get ; y <- get ; z <- get+ return $ UnifyScope w x y z+ 7 -> fmap CantInferType get+ 8 -> do x <- get ; y <- get+ return $ NonFunctionType x y+ 9 -> do x <- get ; y <- get+ return $ NotEquality x y+ 10 -> fmap TooManyArguments get+ 11 -> fmap CantIntroduce get+ 12 -> fmap NoSuchVariable get+ 13 -> fmap NoTypeDecl get+ 14 -> do x <- get ; y <- get ; z <- get+ return $ NotInjective x y z+ 15 -> fmap CantResolve get+ 16 -> fmap CantResolveAlts get+ 17 -> fmap IncompleteTerm get+ 18 -> return UniverseError+ 19 -> do x <- get ; y <- get+ return $ UniqueError x y+ 20 -> do x <- get ; y <- get+ return $ UniqueKindError x y+ 21 -> return ProgramLineComment+ 22 -> fmap Inaccessible get+ 23 -> fmap NonCollapsiblePostulate get+ 24 -> fmap AlreadyDefined get+ 25 -> fmap ProofSearchFail get+ 26 -> fmap NoRewriting get+ 27 -> do x <- get ; y <- get+ return $ At x y+ 28 -> do x <- get ; y <- get ; z <- get+ return $ Elaborating x y z+ 29 -> do w <- get ; x <- get ; y <- get ; z <- get+ return $ ElaboratingArg w x y z+ 30 -> fmap ProviderError get+ 31 -> do x <- get ; y <- get+ return $ LoadingFailed x y+ 32 -> do x <- get ; y <- get+ return $ ReflectionError x y+ 33 -> do x <- get ; y <- get+ return $ ReflectionFailed x y+ _ -> error "Corrupted binary data for Err'" ----- Generated by 'derive' instance Binary FC where@@ -145,6 +310,7 @@ B64V x1 -> putWord8 24 >> put x1 BufferType -> putWord8 25 ManagedPtrType -> putWord8 26+ VoidType -> putWord8 27 get = do i <- getWord8 case i of@@ -187,7 +353,7 @@ 24 -> fmap B64V get 25 -> return BufferType 26 -> return ManagedPtrType-+ 27 -> return VoidType _ -> error "Corrupted binary data for Const" @@ -208,6 +374,8 @@ put x1 RForce x1 -> do putWord8 5 put x1+ RUType x1 -> do putWord8 6+ put x1 get = do i <- getWord8 case i of@@ -225,6 +393,8 @@ return (RConstant x1) 5 -> do x1 <- get return (RForce x1)+ 6 -> do x1 <- get+ return (RUType x1) _ -> error "Corrupted binary data for Raw"
src/Idris/Core/Constraints.hs view
@@ -11,7 +11,7 @@ import Control.Monad.State import Data.List import Data.Maybe-import qualified Data.Map as M+import qualified Data.Map.Strict as M import Debug.Trace @@ -20,7 +20,8 @@ ucheck cs = acyclic rels (map fst (M.toList rels)) where lhs (ULT l _) = l lhs (ULE l _) = l- rels = mkRels cs M.empty+ cs' = nub cs+ rels = mkRels cs' M.empty type Relations = M.Map UExp [(UConstraint, FC)] @@ -44,13 +45,13 @@ checkCycle :: FC -> Relations -> [(UExp, FC)] -> Int -> [UExp] -> TC () checkCycle fc r path inc [] = return () checkCycle fc r path inc (c : cs)- = do check fc path inc c+ = do check fc r path inc c -- Remove c from r since we know there's no cycles now let r' = M.insert c [] r checkCycle fc r' path inc cs - check fc path inc (UVar x) | x < 0 = return ()- check fc path inc cv+ check fc r path inc (UVar x) | x < 0 = return ()+ check fc r path inc cv | inc > 0 && cv `elem` map fst path = Error $ At fc UniverseError -- FIXME: Make informative@@ -59,10 +60,11 @@ -- fine, because they must all be equal, so stop. | inc == 0 && cv `elem` map fst path = return ()- | otherwise = case M.lookup cv r of- Nothing -> return ()- Just cs -> mapM_ (next ((cv, fc):path) inc) cs+ | otherwise + = case M.lookup cv r of+ Nothing -> return ()+ Just cs -> mapM_ (next r ((cv, fc):path) inc) cs - next path inc (ULT l r, fc) = check fc path (inc + 1) r- next path inc (ULE l r, fc) = check fc path inc r+ next r path inc (ULT l x, fc) = check fc r path (inc + 1) x+ next r path inc (ULE l x, fc) = check fc r path inc x
src/Idris/Core/Elaborate.hs view
@@ -373,6 +373,7 @@ -- | 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 = do env <- get_env hs <- get_holes if (n `elem` map fst env) then do apply (Var n) []; solve@@ -380,6 +381,7 @@ UN _ -> return $! n MN _ _ -> unique_hole n NS _ _ -> return $! n+ x -> return $! n processTactic' (PatVar n') patbind :: Name -> Elab' aux ()
src/Idris/Core/Evaluate.hs view
@@ -8,7 +8,8 @@ Context, initContext, ctxtAlist, uconstraints, next_tvar, addToCtxt, setAccess, setTotal, setMetaInformation, addCtxtDef, addTyDecl, addDatatype, addCasedef, simplifyCasedef, addOperator,- lookupNames, lookupTyName, lookupTyNameExact, lookupTy, lookupTyExact, lookupP, lookupDef, lookupNameDef, lookupDefExact, lookupDefAcc, lookupVal,+ lookupNames, lookupTyName, lookupTyNameExact, lookupTy, lookupTyExact, + lookupP, lookupDef, lookupNameDef, lookupDefExact, lookupDefAcc, lookupDefAccExact, lookupVal, mapDefCtxt, lookupTotal, lookupNameTotal, lookupMetaInformation, lookupTyEnv, isDConName, isTConName, isConName, isFnName, Value(..), Quote(..), initEval, uniqueNameCtxt, uniqueBindersCtxt, definitions,@@ -88,12 +89,17 @@ = evalState (do val <- eval tr ctxt [] (map finalEntry env) (finalise t) [] quote 0 val) initEval -specialise :: Context -> Env -> [(Name, Int)] -> TT Name -> TT Name+-- 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 -> + (TT Name, [(Name, Int)]) specialise ctxt env limits t- = evalState (do val <- eval False ctxt []+ = let (tm, st) =+ runState (do val <- eval False ctxt [] (map finalEntry env) (finalise t) [Spec]- quote 0 val) (initEval { limited = limits })+ quote 0 val) (initEval { limited = limits }) in+ (tm, limited st) -- | Like normalise, but we only reduce functions that are marked as okay to -- inline (and probably shouldn't reduce lets?)@@ -167,13 +173,17 @@ _ -> return $ (True, (n, 100) : filter (\ (n', _) -> n/=n') ns) -deduct :: Name -> Eval ()-deduct n = do ES ls num <- get+fnCount :: Int -> Name -> Eval ()+fnCount inc n + = do ES ls num <- get case lookup n ls of- Just i -> do put $ ES ((n, (i-1)) :+ Just i -> do put $ ES ((n, (i - inc)) : filter (\ (n', _) -> n/=n') ls) num _ -> return () +deduct = fnCount 1+reinstate = fnCount (-1)+ -- | Evaluate in a context of locally named things (i.e. not de Bruijn indexed, -- such as we might have during construction of a proof) @@ -380,8 +390,11 @@ | length ns <= length args = do let args' = take (length ns) args let rest = drop (length ns) args- when spec $ deduct n -- successful, so deduct usages+ when spec $ deduct n t <- evTree ntimes stk top env (zip ns args') tree+ when spec $ case t of+ Nothing -> reinstate n -- Blocked, count n again+ Just _ -> return () -- (zipWith (\n , t) -> (n, t)) ns args') tree return (t, rest) | otherwise = return (Nothing, args)@@ -973,6 +986,14 @@ [(Def, Accessibility)] lookupDefAcc n mkpublic ctxt = map mkp $ lookupCtxt n (definitions ctxt)+ -- io_bind a special case for REPL prettiness+ where mkp (d, a, _, _) = if mkpublic && (not (n == sUN "io_bind" || n == sUN "io_return"))+ then (d, Public) else (d, a)++lookupDefAccExact :: Name -> Bool -> Context ->+ Maybe (Def, Accessibility)+lookupDefAccExact n mkpublic ctxt+ = fmap mkp $ lookupCtxtExact n (definitions ctxt) -- io_bind a special case for REPL prettiness where mkp (d, a, _, _) = if mkpublic && (not (n == sUN "io_bind" || n == sUN "io_return")) then (d, Public) else (d, a)
src/Idris/Core/Execute.hs view
@@ -60,6 +60,7 @@ | EBind Name (Binder ExecVal) (ExecVal -> Exec ExecVal) | EApp ExecVal ExecVal | EType UExp+ | EUType Universe | EErased | EConstant Const | forall a. EPtr (Ptr a)@@ -72,6 +73,7 @@ show (EBind n b body) = "EBind " ++ show b ++ " <<fn>>" show (EApp e1 e2) = show e1 ++ " (" ++ show e2 ++ ")" show (EType _) = "Type"+ show (EUType _) = "UType" show EErased = "[__]" show (EConstant c) = show c show (EPtr p) = "<<ptr " ++ show p ++ ">>"@@ -102,6 +104,7 @@ e2' <- toTT e2 return $ App e1' e2' toTT (EType u) = return $ TType u+toTT (EUType u) = return $ UType u toTT EErased = return Erased toTT (EConstant c) = return (Constant c) toTT (EThunk ctxt env tm) = do env' <- mapM toBinder env@@ -205,6 +208,7 @@ doExec env ctxt Erased = return EErased doExec env ctxt Impossible = fail "Tried to execute an impossible case" doExec env ctxt (TType u) = return (EType u)+doExec env ctxt (UType u) = return (EUType u) execApp :: ExecEnv -> Context -> ExecVal -> [ExecVal] -> Exec ExecVal execApp env ctxt v [] = return v -- no args is just a constant! can result from function calls@@ -404,7 +408,7 @@ -- | Look up primitive operations in the global table and transform them into ExecVal functions getOp :: Name -> [ExecVal] -> Maybe (Exec ExecVal) getOp fn [_, _, x] | fn == pbm = Just (return x)-getOp fn [EP _ fn' _] +getOp fn [EP _ fn' _] | fn == prs && fn' == pstd = Just $ do line <- execIO getLine return (EConstant (Str line))@@ -548,7 +552,7 @@ _ -> trace ("failed to construct ffun") Nothing getFTy :: ExecVal -> Maybe FType-getFTy (EApp (EP _ (UN fi) _) (EP _ (UN intTy) _)) +getFTy (EApp (EP _ (UN fi) _) (EP _ (UN intTy) _)) | fi == txt "FIntT" = case str intTy of "ITNative" -> Just (FArith (ATInt ITNative))
src/Idris/Core/ProofState.hs view
@@ -618,8 +618,8 @@ (tmv, tmt) <- lift $ check ctxt env tm let tmt' = normalise ctxt env tmt let (tacn, tacstr, tactt) = if induction- then (ElimN, "an eliminator", "induction")- else (CaseN, "a case function", "case analysis")+ then (ElimN, "an eliminator", "Induction")+ else (CaseN, "a case function", "Case analysis") case unApply tmt' of (P _ tnm _, tyargs) -> do case lookupTy (SN (tacn tnm)) ctxt of@@ -651,10 +651,10 @@ mapM_ addConsHole (reverse consargs') let res' = forget $ res (scv, sct) <- lift $ check ctxt env res'- let scv' = specialise ctxt env [] scv+ let (scv', _) = specialise ctxt env [] scv return scv'- [] -> fail $ tactt ++ " needs " ++ tacstr ++ " for " ++ show tnm- xs -> fail $ "Multiple definitions found when searching for " ++ tacstr ++ "of " ++ show tnm+ [] -> lift $ tfail $ Msg $ tactt ++ " needs " ++ tacstr ++ " for " ++ show tnm+ xs -> lift $ tfail $ Msg $ "Multiple definitions found when searching for " ++ tacstr ++ "of " ++ show tnm _ -> fail $ "Unkown type for " ++ if induction then "induction" else "case analysis" where scname = sMN 0 "scarg" makeConsArg (nm, ty) = P Bound nm ty@@ -705,7 +705,7 @@ -- reduce let bindings only simplify :: RunTactic simplify ctxt env (Bind x (Hole ty) sc) =- do return $ Bind x (Hole (specialise ctxt env [] ty)) sc+ do return $ Bind x (Hole (fst (specialise ctxt env [] ty))) sc simplify ctxt env t = return t check_in :: Raw -> RunTactic
src/Idris/Core/TT.hs view
@@ -29,7 +29,8 @@ import Data.Char import Numeric (showIntAtBase) import qualified Data.Text as T-import Data.List+import Data.List hiding (insert)+import Data.Set(Set, member, fromList, insert) import Data.Maybe (listToMaybe) import Data.Foldable (Foldable) import Data.Traversable (Traversable)@@ -102,6 +103,8 @@ | AnnFC FC | AnnTextFmt TextFormatting | AnnTerm [(Name, Bool)] (TT Name) -- ^ pprint bound vars, original term+ | AnnSearchResult Ordering -- ^ more general, isomorphic, or more specific+ | AnnErr Err -- | Used for error reflection data ErrorReportPart = TextPart String@@ -116,7 +119,7 @@ -- | Idris errors. Used as exceptions in the compiler, but reported to users -- if they reach the top level.-data Err' t +data Err' t = Msg String | InternalMsg String | CantUnify Bool t t (Err' t) [(Name, t)] Int@@ -1134,13 +1137,18 @@ uniqueName n hs | n `elem` hs = uniqueName (nextName n) hs | otherwise = n +uniqueNameSet :: Name -> Set Name -> Name+uniqueNameSet n hs | n `member` hs = uniqueNameSet (nextName n) hs+ | otherwise = n+ uniqueBinders :: [Name] -> TT Name -> TT Name-uniqueBinders ns (Bind n b sc)- = let n' = uniqueName n ns- ns' = n' : ns in- Bind n' (fmap (uniqueBinders ns') b) (uniqueBinders ns' sc)-uniqueBinders ns (App f a) = App (uniqueBinders ns f) (uniqueBinders ns a)-uniqueBinders ns t = t+uniqueBinders ns = ubSet (fromList ns) where+ ubSet ns (Bind n b sc)+ = let n' = uniqueNameSet n ns+ ns' = insert n' ns in+ Bind n' (fmap (ubSet ns') b) (ubSet ns' sc)+ ubSet ns (App f a) = App (ubSet ns f) (ubSet ns a)+ ubSet ns t = t nextName (NS x s) = NS (nextName x) s
src/Idris/Core/Unify.hs view
@@ -222,7 +222,7 @@ = Bind n (Hole ty) (instantiate (P Bound n ty) sc) explicitHole t = t -trimSolutions ns = dropPairs ns+trimSolutions ns = followSols (dropPairs ns) where dropPairs [] = [] dropPairs (n@(x, P _ x' _) : ns) | x == x' = dropPairs ns@@ -232,7 +232,13 @@ (n, P _ n' _) -> not (n == x' && n' == x) _ -> True) ns) dropPairs (n : ns) = n : dropPairs ns- ++ followSols [] = []+ followSols ((n, P _ t _) : ns)+ | Just t' <- lookup t ns+ = followSols ((n, t') : ns) -- Are we guaranteed no cycles?+ followSols (n : ns) = n : followSols ns+ expandLets env (x, tm) = (x, doSubst (reverse env) tm) where doSubst [] tm = tm
src/Idris/Coverage.hs view
@@ -65,7 +65,7 @@ logLvl 5 $ show lhss logLvl 5 $ show (map length argss) ++ "\n" ++ show (map length all_args) logLvl 10 $ show argss ++ "\n" ++ show all_args- logLvl 1 $ "Original: \n" +++ logLvl 3 $ "Original: \n" ++ showSep "\n" (map (\t -> showTm i (delab' i t True True)) xs) -- add an infinite supply of explicit arguments to update the possible -- cases for (the return type may be variadic, or function type, so@@ -76,11 +76,11 @@ p ++ repeat (PExp 0 [] (sMN 0 "gcarg") Placeholder) _ -> repeat (pexp Placeholder) let tryclauses = mkClauses parg all_args- logLvl 2 $ show (length tryclauses) ++ " initially to check"- logLvl 1 $ showSep "\n" (map (showTm i) tryclauses)+ logLvl 3 $ show (length tryclauses) ++ " initially to check"+ logLvl 2 $ showSep "\n" (map (showTm i) tryclauses) let new = filter (noMatch i) (nub tryclauses)- logLvl 1 $ show (length new) ++ " clauses to check for impossibility"- logLvl 3 $ "New clauses: \n" ++ showSep "\n" (map (showTm i) new)+ logLvl 2 $ show (length new) ++ " clauses to check for impossibility"+ logLvl 4 $ "New clauses: \n" ++ showSep "\n" (map (showTm i) new) -- ++ " from:\n" ++ showSep "\n" (map (showImp True) tryclauses) return new -- return (map (\t -> PClause n t [] PImpossible []) new)@@ -468,8 +468,8 @@ buildSCG (_, n) = do ist <- getIState case lookupCtxt n (idris_callgraph ist) of- [cg] -> case lookupDef n (tt_ctxt ist) of- [CaseOp _ _ _ pats _ cd] ->+ [cg] -> case lookupDefExact n (tt_ctxt ist) of+ Just (CaseOp _ _ _ pats _ cd) -> let (args, sc) = cases_totcheck cd in do logLvl 2 $ "Building SCG for " ++ show n ++ " from\n" ++ show pats ++ "\n" ++ show sc
src/Idris/DataOpts.hs view
@@ -97,6 +97,7 @@ -- Nat special cases -- TODO: Would be nice if this was configurable in idris source!+ -- Issue #1597 https://github.com/idris-lang/Idris-dev/issues/1597 doOpts (NS (UN z) [nat, prelude]) [] | z == txt "Z" && nat == txt "Nat" && prelude == txt "Prelude" = Constant (BI 0)@@ -105,4 +106,3 @@ = App (App (P Ref (sUN "prim__addBigInt") Erased) k) (Constant (BI 1)) doOpts n args = mkApp (P (DCon tag arity uniq) n Erased) args-
src/Idris/DeepSeq.hs view
@@ -7,46 +7,46 @@ import Control.DeepSeq import qualified Cheapskate.Types as CT+import qualified Idris.Docstrings as D --- Manual from imported libs-instance NFData CT.Doc where- rnf (CT.Doc opts contents) = rnf opts `seq` rnf contents `seq` ()+instance NFData a => NFData (D.Docstring a) where+ rnf (D.DocString opts contents) = rnf opts `seq` rnf contents `seq` () instance NFData CT.Options where- rnf (CT.Options x1 x2 x3 x4) = rnf x1 `seq` rnf x2 `seq` rnf x3 `seq` rnf x4 `seq` ()+ rnf (CT.Options x1 x2 x3 x4) = rnf x1 `seq` rnf x2 `seq` rnf x3 `seq` rnf x4 `seq` () -instance NFData CT.Block where- rnf (CT.Para lines) = rnf lines `seq` ()- rnf (CT.Header i lines) = rnf i `seq` rnf lines `seq` ()- rnf (CT.Blockquote bs) = rnf bs `seq` ()- rnf (CT.List b t xs) = rnf b `seq` rnf t `seq` rnf xs `seq` ()- rnf (CT.CodeBlock attr txt) = rnf attr `seq` rnf txt `seq` ()- rnf (CT.HtmlBlock txt) = rnf txt `seq` ()- rnf CT.HRule = ()+instance NFData a => NFData (D.Block a) where+ rnf (D.Para lines) = rnf lines `seq` ()+ rnf (D.Header i lines) = rnf i `seq` rnf lines `seq` ()+ rnf (D.Blockquote bs) = rnf bs `seq` ()+ rnf (D.List b t xs) = rnf b `seq` rnf t `seq` rnf xs `seq` ()+ rnf (D.CodeBlock attr txt tm) = rnf attr `seq` rnf txt `seq` ()+ rnf (D.HtmlBlock txt) = rnf txt `seq` ()+ rnf D.HRule = () -instance NFData CT.Inline where- rnf (CT.Str txt) = rnf txt `seq` ()- rnf CT.Space = ()- rnf CT.SoftBreak = ()- rnf CT.LineBreak = ()- rnf (CT.Emph xs) = rnf xs `seq` ()- rnf (CT.Strong xs) = rnf xs `seq` ()- rnf (CT.Code xs) = rnf xs `seq` ()- rnf (CT.Link a b xs) = rnf a `seq` rnf b `seq` rnf xs `seq` ()- rnf (CT.Image a b c) = rnf a `seq` rnf b `seq` rnf c `seq` ()- rnf (CT.Entity a) = rnf a `seq` ()- rnf (CT.RawHtml x) = rnf x `seq` ()+instance NFData a => NFData (D.Inline a) where+ rnf (D.Str txt) = rnf txt `seq` ()+ rnf D.Space = ()+ rnf D.SoftBreak = ()+ rnf D.LineBreak = ()+ rnf (D.Emph xs) = rnf xs `seq` ()+ rnf (D.Strong xs) = rnf xs `seq` ()+ rnf (D.Code xs tm) = rnf xs `seq` rnf tm `seq` ()+ rnf (D.Link a b xs) = rnf a `seq` rnf b `seq` rnf xs `seq` ()+ rnf (D.Image a b c) = rnf a `seq` rnf b `seq` rnf c `seq` ()+ rnf (D.Entity a) = rnf a `seq` ()+ rnf (D.RawHtml x) = rnf x `seq` () instance NFData CT.ListType where- rnf (CT.Bullet c) = rnf c `seq` ()- rnf (CT.Numbered nw i) = rnf nw `seq` rnf i `seq` ()+ rnf (CT.Bullet c) = rnf c `seq` ()+ rnf (CT.Numbered nw i) = rnf nw `seq` rnf i `seq` () instance NFData CT.CodeAttr where- rnf (CT.CodeAttr a b) = rnf a `seq` rnf b `seq` ()+ rnf (CT.CodeAttr a b) = rnf a `seq` rnf b `seq` () instance NFData CT.NumWrapper where- rnf CT.PeriodFollowing = ()- rnf CT.ParenFollowing = ()+ rnf CT.PeriodFollowing = ()+ rnf CT.ParenFollowing = () -- All generated by 'derive' @@ -202,7 +202,6 @@ rnf (PMatchApp x1 x2) = rnf x1 `seq` rnf x2 `seq` () rnf (PCase x1 x2 x3) = rnf x1 `seq` rnf x2 `seq` rnf x3 `seq` () rnf (PTrue x1 x2) = rnf x1 `seq` rnf x2 `seq` ()- rnf (PFalse x1) = rnf x1 `seq` () rnf (PRefl x1 x2) = rnf x1 `seq` rnf x2 `seq` () rnf (PResolveTC x1) = rnf x1 `seq` () rnf (PEq x1 x2 x3 x4 x5) = rnf x1 `seq` rnf x2 `seq` rnf x3 `seq` rnf x4 `seq` rnf x5 `seq` ()
src/Idris/Delaborate.hs view
@@ -9,7 +9,7 @@ import Idris.AbsSyntax import Idris.Core.TT import Idris.Core.Evaluate-import Idris.Docstrings (overview, renderDocstring)+import Idris.Docstrings (overview, renderDocstring, renderDocTerm) import Idris.ErrReverse import Data.List (intersperse, nub)@@ -50,7 +50,6 @@ | otherwise = PRef un (sUN ("v" ++ show i ++ "")) de env _ (P _ n _) | n == unitTy = PTrue un IsType | n == unitCon = PTrue un IsTerm- | n == falseTy = PFalse un | Just n' <- lookup n env = PRef un n' | otherwise = case lookup n (idris_metavars ist) of@@ -104,10 +103,10 @@ (de env [] l) (de env [] r) | n == sUN "Sg_intro" = PDPair un IsTerm (de env [] l) Placeholder (de env [] r)- deFn env f@(P _ n _) args - | n `elem` map snd env + 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 + deFn env (P _ n _) args | not mvs = case lookup n (idris_metavars ist) of Just (Just _, mi, _) -> mkMVApp n (drop mi (map (de env []) args))@@ -170,10 +169,10 @@ pprintErr' i (CantUnify _ x_in y_in 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 + text "Can't unify" <> indented (annTm x_ns (pprintTerm' i (map (\ (n, b) -> (n, False)) sc ++ zip nms (repeat False)) x)) <$>- text "with" <> indented (annTm y_ns + text "with" <> indented (annTm y_ns (pprintTerm' i (map (\ (n, b) -> (n, False)) sc ++ zip nms (repeat False)) y)) <> case e of@@ -183,10 +182,10 @@ if (opt_errContext (idris_options i)) then showSc i sc else empty pprintErr' i (CantConvert x y env) = text "Can't convert" <>- indented (annTm x (pprintTerm' i (map (\ (n, b) -> (n, False)) env) + indented (annTm x (pprintTerm' i (map (\ (n, b) -> (n, False)) env) (delab i (flagUnique x)))) <$> text "with" <>- indented (annTm y (pprintTerm' i (map (\ (n, b) -> (n, False)) env) + indented (annTm y (pprintTerm' i (map (\ (n, b) -> (n, False)) env) (delab i (flagUnique y)))) <> if (opt_errContext (idris_options i)) then line <> showSc i env else empty where flagUnique (Bind n (Pi t k@(UType u)) sc)@@ -232,7 +231,7 @@ pprintErr' i (NoSuchVariable n) = text "No such variable" <+> annName n pprintErr' i (IncompleteTerm t) = text "Incomplete term" <+> annTm t (pprintTerm i (delab i t)) pprintErr' i UniverseError = text "Universe inconsistency"-pprintErr' i (UniqueError NullType n) +pprintErr' i (UniqueError NullType n) = text "Borrowed name" <+> annName' n (showbasic n) <+> text "must not be used on RHS" pprintErr' i (UniqueError _ n) = text "Unique name" <+> annName' n (showbasic n)@@ -253,9 +252,11 @@ 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" <+>- annotate (AnnBoundName x False) (text (showbasic x)) <+> --TODO check plicity+ 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 =@@ -269,6 +270,11 @@ else if isFnName f ctxt then text "function" <> space else empty+ isInternal (MN _ _) = True+ isInternal (UN n) = T.isPrefixOf (T.pack "__") n+ isInternal (NS n _) = isInternal n+ isInternal _ = True+ 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) =@@ -289,7 +295,11 @@ -- Make sure the machine invented names are shown helpfully to the user, so -- that any names which differ internally also differ visibly+ -- FIXME: I can't actually contrive an error to test this! Will revisit later...+--+-- Issue #1590 in the Issue tracker.+-- https://github.com/idris-lang/Idris-dev/issues/1590 renameMNs :: Term -> Term -> (Term, Term, [Name]) renameMNs x y = let ns = nub $ allTTNames x ++ allTTNames y newnames = evalState (getRenames [] ns) 1 in@@ -307,7 +317,7 @@ rename :: [(Name, Name)] -> Term -> Term rename ns (P nt x t) | Just x' <- lookup x ns = P nt x' t rename ns (App f a) = App (rename ns f) (rename ns a)- rename ns (Bind x b sc) + rename ns (Bind x b sc) = let b' = fmap (rename ns) b sc' = rename ns sc in case lookup x ns of@@ -318,15 +328,15 @@ -- If the two terms only differ in their implicits, mark the implicits which -- differ as AlwaysShow so that they appear in errors addImplicitDiffs :: PTerm -> PTerm -> (PTerm, PTerm)-addImplicitDiffs x y +addImplicitDiffs x y = if (x `expLike` y) then addI x y else (x, y) where addI :: PTerm -> PTerm -> (PTerm, PTerm)- addI (PApp fc f as) (PApp gc g bs) + addI (PApp fc f as) (PApp gc g bs) = let (as', bs') = addShows as bs in (PApp fc f as', PApp gc g bs') where addShows [] [] = ([], [])- addShows (a:as) (b:bs) + addShows (a:as) (b:bs) = let (as', bs') = addShows as bs (a', b') = addI (getTm a) (getTm b) in if (not (a' `expLike` b'))@@ -334,20 +344,20 @@ getTm = a' } : as', b { argopts = AlwaysShow : argopts b, getTm = b' } : bs')- else (a { getTm = a' } : as', + else (a { getTm = a' } : as', b { getTm = b' } : bs')- addI (PLam n a b) (PLam n' c d) + addI (PLam n a b) (PLam n' c d) = let (a', c') = addI a c (b', d') = addI b d in (PLam n a' b', PLam n' c' d')- addI (PPi p n a b) (PPi p' n' c d) + addI (PPi p n a b) (PPi p' n' c d) = let (a', c') = addI a c (b', d') = addI b d in (PPi p n a' b', PPi p' n' c' d')- addI (PRefl fc a) (PRefl fc' b) + addI (PRefl fc a) (PRefl fc' b) = let (a', b') = addI a b in (PRefl fc a', PRefl fc' b')- addI (PEq fc at bt a b) (PEq fc' ct dt c d) + addI (PEq fc at bt a b) (PEq fc' ct dt c d) | trace (show (at,bt)) False = undefined | at `expLike` ct && bt `expLike` dt = let (a', c') = addI a c@@ -357,8 +367,8 @@ = let (at', ct') = addI at ct (bt', dt') = addI bt dt (a', c') = addI a c- (b', d') = addI b d - showa = if at `expLike` ct then [] else [AlwaysShow] + (b', d') = addI b d+ showa = if at `expLike` ct then [] else [AlwaysShow] showb = if bt `expLike` dt then [] else [AlwaysShow] in (PApp fc (PRef fc eqTy) [(pimp (sUN "A") at' True) { argopts = showa },@@ -370,12 +380,12 @@ (pimp (sUN "B") dt' True) { argopts = showb }, pexp c', pexp d'])- - addI (PPair fc pi a b) (PPair fc' pi' c d) ++ addI (PPair fc pi a b) (PPair fc' 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) + addI (PDPair fc pi a t b) (PDPair fc' pi' c u d) = let (a', c') = addI a c (t', u') = addI t u (b', d') = addI b d in@@ -387,19 +397,24 @@ expLike (PApp _ f as) (PApp _ f' as') = expLike f f' && length as == length as' && and (zipWith expLike (getExps as) (getExps as'))- expLike (PPi _ n s t) (PPi _ n' s' t') + expLike (PPi _ n s t) (PPi _ n' s' t') = n == n' && expLike s s' && expLike t t'- expLike (PLam n s t) (PLam n' s' 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 (PEq _ xt yt x y) (PEq _ xt' yt' x' y') + expLike (PEq _ xt yt x y) (PEq _ xt' yt' x' y') = expLike x x' && expLike y y' expLike (PRefl _ x) (PRefl _ x') = expLike x x' expLike x y = x == y +-- Issue #1589 on the issue tracker+-- https://github.com/idris-lang/Idris-dev/issues/1589+--+-- Figure out why MNs are getting rewritte to UNs for top-level+-- pattern-matching functions isUN :: Name -> Bool-isUN (UN n) = not $ T.isPrefixOf (T.pack "__") n -- TODO figure out why MNs are getting rewritte to UNs for top-level pattern-matching functions+isUN (UN n) = not $ T.isPrefixOf (T.pack "__") n -- TODO isUN (NS n _) = isUN n isUN _ = False @@ -426,9 +441,14 @@ _ | otherwise -> annot where docOverview :: IState -> Name -> Maybe String -- pretty-print first paragraph of docs docOverview ist n = do docs <- lookupCtxtExact n (idris_docstrings ist)- let o = overview (fst docs)+ let o = overview (fst docs)+ norm = normaliseAll (tt_ctxt ist) [] -- TODO make width configurable- out = displayS . renderPretty 1.0 50 $ renderDocstring o+ -- Issue #1588 on the Issue Tracker+ -- https://github.com/idris-lang/Idris-dev/issues/1588+ out = displayS . renderPretty 1.0 50 $+ renderDocstring (renderDocTerm (pprintDelab ist)+ norm) o return (out "") getTy :: IState -> Name -> String -- fails if name not already extant! getTy ist n = let theTy = pprintPTerm (ppOptionIst ist) [] [] (idris_infixes ist) $@@ -459,5 +479,3 @@ showbasic (MN _ s) = str s showbasic (NS n s) = showSep "." (map str (reverse s)) ++ "." ++ showbasic n showbasic (SN s) = show s--
src/Idris/Docs.hs view
@@ -6,7 +6,7 @@ import Idris.Delaborate import Idris.Core.TT import Idris.Core.Evaluate-import Idris.Docstrings+import Idris.Docstrings (Docstring, emptyDocstring, noDocs, nullDocstring, renderDocstring, DocTerm, renderDocTerm) import Util.Pretty @@ -15,32 +15,34 @@ import qualified Data.Text as T -- TODO: Only include names with public/abstract accessibility--data FunDoc = FD Name Docstring- [(Name, PTerm, Plicity, Maybe Docstring)] -- args: name, ty, implicit, docs+--+-- Issue #1573 on the Issue tracker.+-- https://github.com/idris-lang/Idris-dev/issues/1573+data FunDoc = FD Name (Docstring DocTerm)+ [(Name, PTerm, Plicity, Maybe (Docstring DocTerm))] -- args: name, ty, implicit, docs PTerm -- function type (Maybe Fixity)- deriving Show data Docs = FunDoc FunDoc | DataDoc FunDoc -- type constructor docs [FunDoc] -- data constructor docs- | ClassDoc Name Docstring -- class docs+ | ClassDoc Name (Docstring DocTerm)-- class docs [FunDoc] -- method docs- [(Name, Maybe Docstring)] -- parameters and their docstrings+ [(Name, Maybe (Docstring DocTerm))] -- parameters and their docstrings [PTerm] -- instances [PTerm] -- superclasses- deriving Show -showDoc d | nullDocstring d = empty- | otherwise = text " -- " <> renderDocstring d+showDoc ist d+ | nullDocstring d = empty+ | 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 <+> pprintPTerm ppo [] [ n | (n@(UN n'),_,_,_) <- args , not (T.isPrefixOf (T.pack "__") n') ] infixes ty <$>- renderDocstring doc <$>+ renderDocstring (renderDocTerm (pprintDelab ist) (normaliseAll (tt_ctxt ist) [])) doc <$> maybe empty (\f -> text (show f) <> line) f <> let argshow = showArgs args [] in if not (null argshow)@@ -52,19 +54,19 @@ showArgs ((n, ty, Exp {}, Just d):args) bnd = bindingOf n False <+> colon <+> pprintPTerm ppo bnd [] infixes ty <>- showDoc d <> line+ showDoc ist d <> line : showArgs args ((n, False):bnd) showArgs ((n, ty, Constraint {}, Just d):args) bnd = text "Class constraint" <+>- pprintPTerm ppo bnd [] infixes ty <> showDoc d <> line+ pprintPTerm ppo bnd [] infixes ty <> showDoc ist d <> line : showArgs args ((n, True):bnd) showArgs ((n, ty, Imp {}, Just d):args) bnd = text "(implicit)" <+> bindingOf n True <+> colon <+> pprintPTerm ppo bnd [] infixes ty <>- showDoc d <> line+ showDoc ist d <> line : showArgs args ((n, True):bnd) showArgs ((n, _, _, _):args) bnd = showArgs args ((n, True):bnd)@@ -80,7 +82,9 @@ vsep (map (pprintFD ist) args)) pprintDocs ist (ClassDoc n doc meths params instances superclasses) = nest 4 (text "Type class" <+> prettyName True (ppopt_impl ppo) [] n <>- if nullDocstring doc then empty else line <> renderDocstring doc)+ if nullDocstring doc+ then empty+ else line <> renderDocstring (renderDocTerm (pprintDelab ist) (normaliseAll (tt_ctxt ist) [])) doc) <> line <$> nest 4 (text "Parameters:" <$> prettyParameters) <> line <$>@@ -131,7 +135,7 @@ (subclasses, instances') = partition isSubclass instances prettyParameters = if any (isJust . snd) params- then vsep (map (\(nm,md) -> prettyName True False params' nm <+> maybe empty showDoc md) params)+ then vsep (map (\(nm,md) -> prettyName True False params' nm <+> maybe empty (showDoc ist) md) params) else hsep (punctuate comma (map (prettyName True False params' . fst) params)) getDocs :: Name -> Idris Docs@@ -182,10 +186,8 @@ where funName :: Name -> String funName (UN n) = str n funName (NS n _) = funName n- funName n- | n == falseTy = "_|_" -getPArgNames :: PTerm -> [(Name, Docstring)] -> [(Name, PTerm, Plicity, Maybe Docstring)]+getPArgNames :: PTerm -> [(Name, Docstring DocTerm)] -> [(Name, PTerm, Plicity, Maybe (Docstring DocTerm))] getPArgNames (PPi plicity name ty body) ds = (name, ty, plicity, lookup name ds) : getPArgNames body ds getPArgNames _ _ = []
src/Idris/Docstrings.hs view
@@ -1,28 +1,139 @@+{-# LANGUAGE DeriveFunctor, ScopedTypeVariables #-}+{-# OPTIONS_GHC -fwarn-incomplete-patterns -Werror #-}+ -- | Wrapper around Markdown library module Idris.Docstrings (- Docstring, parseDocstring, renderDocstring, emptyDocstring, nullDocstring, noDocs,- overview, containsText+ Docstring(..), Block(..), Inline(..), parseDocstring, renderDocstring, emptyDocstring, nullDocstring, noDocs,+ overview, containsText, renderHtml, annotCode, DocTerm(..), renderDocTerm, checkDocstring ) where import qualified Cheapskate as C import qualified Cheapskate.Types as CT+import Cheapskate.Html (renderDoc) import Util.Pretty -import Idris.Core.TT (OutputAnnotation(..), TextFormatting(..), Name)+import Idris.Core.TT (OutputAnnotation(..), TextFormatting(..), Name, Term, Err) import qualified Data.Text as T import qualified Data.Foldable as F+import Data.Foldable (Foldable)+import Data.Traversable (Traversable) import qualified Data.Sequence as S --- | Representation of Idris's inline documentation-type Docstring = CT.Doc+import Control.DeepSeq (NFData(..)) +import Text.Blaze.Html (Html)++-- | The various kinds of code samples that can be embedded in docs+data DocTerm = Unchecked+ | Checked Term+ | Example Term+ | Failing Err+ deriving Show++-- | Render a term in the documentation+renderDocTerm :: (Term -> Doc OutputAnnotation) -> (Term -> Term) -> DocTerm -> String -> Doc OutputAnnotation+renderDocTerm pp norm Unchecked src = text src+renderDocTerm pp norm (Checked tm) src = pp tm+renderDocTerm pp norm (Example tm) src = align $+ text ">" <+> align (pp tm) <$>+ pp (norm tm)+renderDocTerm pp norm (Failing err) src = annotate (AnnErr err) $ text src++-- | Representation of Idris's inline documentation. The type paramter+-- represents the type of terms that are associated with code blocks.+data Docstring a = DocString CT.Options (Blocks a)+ deriving (Show, Functor, Foldable, Traversable)++type Blocks a = S.Seq (Block a)++-- | Block-level elements.+data Block a = Para (Inlines a)+ | Header Int (Inlines a)+ | Blockquote (Blocks a)+ | List Bool CT.ListType [Blocks a]+ | CodeBlock CT.CodeAttr T.Text a+ | HtmlBlock T.Text+ | HRule+ deriving (Show, Functor, Foldable, Traversable)++data Inline a = Str T.Text+ | Space+ | SoftBreak+ | LineBreak+ | Emph (Inlines a)+ | Strong (Inlines a)+ | Code T.Text a+ | Link (Inlines a) T.Text T.Text+ | Image (Inlines a) T.Text T.Text+ | Entity T.Text+ | RawHtml T.Text+ deriving (Show, Functor, Foldable, Traversable)++type Inlines a = S.Seq (Inline a)+++-- | Run some kind of processing step over code in a Docstring. The code+-- processor gets the language and annotations as parameters, along with the+-- source and the original annotation.+checkDocstring :: forall a b. (String -> [String] -> String -> a -> b) -> Docstring a -> Docstring b+checkDocstring f (DocString opts blocks) = DocString opts (fmap (checkBlock f) blocks)+ where checkBlock :: (String -> [String] -> String -> a -> b) -> Block a -> Block b+ checkBlock f (Para inlines) = Para (fmap (checkInline f) inlines)+ checkBlock f (Header i inlines) = Header i (fmap (checkInline f) inlines)+ checkBlock f (Blockquote bs) = Blockquote (fmap (checkBlock f) bs)+ checkBlock f (List b t blocks) = List b t (fmap (fmap (checkBlock f)) blocks)+ checkBlock f (CodeBlock attrs src tm) = CodeBlock attrs src+ (f (T.unpack $ CT.codeLang attrs)+ (words . T.unpack $ CT.codeInfo attrs)+ (T.unpack src)+ tm)+ checkBlock f (HtmlBlock src) = HtmlBlock src+ checkBlock f HRule = HRule++ checkInline :: (String -> [String] -> String -> a -> b) -> Inline a -> Inline b+ checkInline f (Str txt) = Str txt+ checkInline f Space = Space+ checkInline f SoftBreak = SoftBreak+ checkInline f LineBreak = LineBreak+ checkInline f (Emph is) = Emph (fmap (checkInline f) is)+ checkInline f (Strong is) = Strong (fmap (checkInline f) is)+ checkInline f (Code src x) = Code src (f "" [] (T.unpack src) x)+ checkInline f (Link is url title) = Link (fmap (checkInline f) is) url title+ checkInline f (Image is url title) = Image (fmap (checkInline f) is) url title+ checkInline f (Entity txt) = Entity txt+ checkInline f (RawHtml src) = RawHtml src+ -- | Construct a docstring from a Text that contains Markdown-formatted docs-parseDocstring :: T.Text -> CT.Doc-parseDocstring = C.markdown options+parseDocstring :: T.Text -> Docstring ()+parseDocstring = toDocstring . C.markdown options+ where toDocstring :: CT.Doc -> Docstring ()+ toDocstring (CT.Doc opts blocks) = DocString opts (fmap toBlock blocks) + toBlock :: CT.Block -> Block ()+ toBlock (CT.Para inlines) = Para (fmap toInline inlines)+ toBlock (CT.Header i inlines) = Header i (fmap toInline inlines)+ toBlock (CT.Blockquote blocks) = Blockquote (fmap toBlock blocks)+ toBlock (CT.List b t blocks) = List b t (fmap (fmap toBlock) blocks)+ toBlock (CT.CodeBlock attrs text) = CodeBlock attrs text ()+ toBlock (CT.HtmlBlock src) = HtmlBlock src+ toBlock CT.HRule = HRule + toInline :: CT.Inline -> Inline ()+ toInline (CT.Str t) = Str t+ toInline CT.Space = Space+ toInline CT.SoftBreak = SoftBreak+ toInline CT.LineBreak = LineBreak+ toInline (CT.Emph is) = Emph (fmap toInline is)+ toInline (CT.Strong is) = Strong (fmap toInline is)+ toInline (CT.Code src) = Code src ()+ toInline (CT.Link is url title) = Link (fmap toInline is) url title+ toInline (CT.Image is url title) = Image (fmap toInline is) url title+ toInline (CT.Entity txt) = Entity txt+ toInline (CT.RawHtml src) = RawHtml src++ options = CT.Options { CT.sanitize = True , CT.allowRawHtml = False , CT.preserveHardBreaks = True@@ -30,90 +141,152 @@ } -- | Convert a docstring to be shown by the pretty-printer-renderDocstring :: Docstring -> Doc OutputAnnotation-renderDocstring (CT.Doc _ blocks) = renderBlocks blocks+renderDocstring :: (a -> String -> Doc OutputAnnotation) -> Docstring a -> Doc OutputAnnotation+renderDocstring pp (DocString _ blocks) = renderBlocks pp blocks -- | Construct a docstring consisting of the first block-level element of the -- argument docstring, for use in summaries.-overview :: Docstring -> Docstring-overview (CT.Doc opts blocks) = CT.Doc opts (S.take 1 blocks)+overview :: Docstring a -> Docstring a+overview (DocString opts blocks) = DocString opts (S.take 1 blocks) -renderBlocks :: CT.Blocks -> Doc OutputAnnotation-renderBlocks blocks | S.length blocks > 1 = F.foldr1 (\b1 b2 -> b1 <> line <> line <> b2) $- fmap renderBlock blocks- | S.length blocks == 1 = renderBlock (S.index blocks 0)- | otherwise = empty+renderBlocks :: (a -> String -> Doc OutputAnnotation)+ -> Blocks a -> Doc OutputAnnotation+renderBlocks pp blocks | S.length blocks > 1 = F.foldr1 (\b1 b2 -> b1 <> line <> line <> b2) $+ fmap (renderBlock pp) blocks+ | S.length blocks == 1 = renderBlock pp (S.index blocks 0)+ | otherwise = empty -renderBlock :: CT.Block -> Doc OutputAnnotation-renderBlock (CT.Para inlines) = renderInlines inlines-renderBlock (CT.Header lvl inlines) = renderInlines inlines <+> parens (text (show lvl))-renderBlock (CT.Blockquote blocks) = indent 8 $ renderBlocks blocks-renderBlock (CT.List b ty blockss) = renderList b ty blockss-renderBlock (CT.CodeBlock attr src) = indent 8 $ text (T.unpack src)-renderBlock (CT.HtmlBlock txt) = text "<html block>" -- TODO-renderBlock CT.HRule = text "----------------------"+renderBlock :: (a -> String -> Doc OutputAnnotation)+ -> Block a -> Doc OutputAnnotation+renderBlock pp (Para inlines) = renderInlines pp inlines+renderBlock pp (Header lvl inlines) = renderInlines pp inlines <+> parens (text (show lvl))+renderBlock pp (Blockquote blocks) = indent 8 $ renderBlocks pp blocks+renderBlock pp (List b ty blockss) = renderList pp b ty blockss+renderBlock pp (CodeBlock attr src tm) = indent 4 $ pp tm (T.unpack src)+renderBlock pp (HtmlBlock txt) = text "<html block>" -- TODO+renderBlock pp HRule = text "----------------------" -renderList :: Bool -> CT.ListType -> [CT.Blocks] -> Doc OutputAnnotation-renderList b (CT.Bullet c) blockss = vsep $ map (hang 4 . (char c <+>) . renderBlocks) blockss-renderList b (CT.Numbered nw i) blockss =+renderList :: (a -> String -> Doc OutputAnnotation)+ -> Bool -> CT.ListType -> [Blocks a] -> Doc OutputAnnotation+renderList pp b (CT.Bullet c) blockss = vsep $ map (hang 4 . (char c <+>) . renderBlocks pp) blockss+renderList pp b (CT.Numbered nw i) blockss = vsep $ zipWith3 (\n p txt -> hang 4 $ text (show n) <> p <+> txt)- [i..] (repeat punc) (map renderBlocks blockss)+ [i..] (repeat punc) (map (renderBlocks pp) blockss) where punc = case nw of CT.PeriodFollowing -> char '.' CT.ParenFollowing -> char '(' -renderInlines :: CT.Inlines -> Doc OutputAnnotation-renderInlines = F.foldr (<>) empty . fmap renderInline+renderInlines :: (a -> String -> Doc OutputAnnotation) -> Inlines a -> Doc OutputAnnotation+renderInlines pp = F.foldr (<>) empty . fmap (renderInline pp) -renderInline :: CT.Inline -> Doc OutputAnnotation-renderInline (CT.Str s) = text $ T.unpack s-renderInline CT.Space = softline-renderInline CT.SoftBreak = softline-renderInline CT.LineBreak = line-renderInline (CT.Emph txt) = annotate (AnnTextFmt ItalicText) $ renderInlines txt -- TODO-renderInline (CT.Strong txt) = annotate (AnnTextFmt BoldText) $ renderInlines txt -- TODO-renderInline (CT.Code txt) = text $ T.unpack txt-renderInline (CT.Link body url title) = annotate (AnnTextFmt UnderlineText) (renderInlines body) <+>+renderInline :: (a -> String -> Doc OutputAnnotation) -> Inline a -> Doc OutputAnnotation+renderInline pp (Str s) = text $ T.unpack s+renderInline pp Space = softline+renderInline pp SoftBreak = softline+renderInline pp LineBreak = line+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 (CT.Image body url title) = text "<image>" -- TODO-renderInline (CT.Entity a) = text $ "<entity " ++ T.unpack a ++ ">" -- TODO-renderInline (CT.RawHtml txt) = text "<html content>" --TODO+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 -- | The empty docstring-emptyDocstring :: Docstring-emptyDocstring = CT.Doc options S.empty+emptyDocstring :: Docstring a+emptyDocstring = DocString options S.empty -- | Check whether a docstring is emtpy-nullDocstring :: Docstring -> Bool-nullDocstring (CT.Doc _ blocks) = S.null blocks+nullDocstring :: Docstring a -> Bool+nullDocstring (DocString _ blocks) = S.null blocks -- | Empty documentation for a definition-noDocs :: (Docstring, [(Name, Docstring)])+noDocs :: (Docstring a, [(Name, Docstring a)]) noDocs = (emptyDocstring, []) -- | Does a string occur in the docstring?-containsText :: T.Text -> Docstring -> Bool-containsText str (CT.Doc _ blocks) = F.any (blockContains (T.toLower str)) blocks+containsText :: T.Text -> Docstring a -> Bool+containsText str (DocString _ blocks) = F.any (blockContains (T.toLower str)) blocks -- blockContains and inlineContains should always be called with a lower-case search string- where blockContains :: T.Text -> CT.Block -> Bool- blockContains str (CT.Para inlines) = F.any (inlineContains str) inlines- blockContains str (CT.Header lvl inlines) = F.any (inlineContains str) inlines- blockContains str (CT.Blockquote blocks) = F.any (blockContains str) blocks- blockContains str (CT.List b ty blockss) = F.any (F.any (blockContains str)) blockss- blockContains str (CT.CodeBlock attr src) = T.isInfixOf str (T.toLower src)- blockContains str (CT.HtmlBlock txt) = False -- TODO- blockContains str CT.HRule = False+ where blockContains :: T.Text -> Block a -> Bool+ blockContains str (Para inlines) = F.any (inlineContains str) inlines+ blockContains str (Header lvl inlines) = F.any (inlineContains str) inlines+ blockContains str (Blockquote blocks) = F.any (blockContains str) blocks+ blockContains str (List b ty blockss) = F.any (F.any (blockContains str)) blockss+ blockContains str (CodeBlock attr src _) = T.isInfixOf str (T.toLower src)+ blockContains str (HtmlBlock txt) = False -- TODO+ blockContains str HRule = False - inlineContains :: T.Text -> CT.Inline -> Bool- inlineContains str (CT.Str s) = T.isInfixOf str (T.toLower s)- inlineContains str CT.Space = False- inlineContains str CT.SoftBreak = False- inlineContains str CT.LineBreak = False- inlineContains str (CT.Emph txt) = F.any (inlineContains str) txt- inlineContains str (CT.Strong txt) = F.any (inlineContains str) txt- inlineContains str (CT.Code txt) = T.isInfixOf str (T.toLower txt)- inlineContains str (CT.Link body url title) = F.any (inlineContains str) body- inlineContains str (CT.Image body url title) = False- inlineContains str (CT.Entity a) = False- inlineContains str (CT.RawHtml txt) = T.isInfixOf str (T.toLower txt)+ inlineContains :: T.Text -> Inline a -> Bool+ inlineContains str (Str s) = T.isInfixOf str (T.toLower s)+ inlineContains str Space = False+ inlineContains str SoftBreak = False+ inlineContains str LineBreak = False+ inlineContains str (Emph txt) = F.any (inlineContains str) txt+ inlineContains str (Strong txt) = F.any (inlineContains str) txt+ inlineContains str (Code txt _) = T.isInfixOf str (T.toLower txt)+ inlineContains str (Link body url title) = F.any (inlineContains str) body+ inlineContains str (Image body url title) = False+ inlineContains str (Entity a) = False+ inlineContains str (RawHtml txt) = T.isInfixOf str (T.toLower txt)+++renderHtml :: Docstring DocTerm -> Html+renderHtml = renderDoc . fromDocstring+ where+ fromDocstring :: Docstring DocTerm -> CT.Doc+ fromDocstring (DocString opts blocks) = CT.Doc opts (fmap fromBlock blocks)++ fromBlock :: Block DocTerm -> CT.Block+ fromBlock (Para inlines) = CT.Para (fmap fromInline inlines)+ fromBlock (Header i inlines) = CT.Header i (fmap fromInline inlines)+ fromBlock (Blockquote blocks) = CT.Blockquote (fmap fromBlock blocks)+ fromBlock (List b t blocks) = CT.List b t (fmap (fmap fromBlock) blocks)+ fromBlock (CodeBlock attrs text _) = CT.CodeBlock attrs text+ fromBlock (HtmlBlock src) = CT.HtmlBlock src+ fromBlock HRule = CT.HRule++ fromInline :: Inline DocTerm -> CT.Inline+ fromInline (Str t) = CT.Str t+ fromInline Space = CT.Space+ fromInline SoftBreak = CT.SoftBreak+ fromInline LineBreak = CT.LineBreak+ fromInline (Emph is) = CT.Emph (fmap fromInline is)+ fromInline (Strong is) = CT.Strong (fmap fromInline is)+ fromInline (Code src _) = CT.Code src+ fromInline (Link is url title) = CT.Link (fmap fromInline is) url title+ fromInline (Image is url title) = CT.Image (fmap fromInline is) url title+ fromInline (Entity txt) = CT.Entity txt+ fromInline (RawHtml src) = CT.RawHtml src+++-- | Annotate the code samples in a docstring+annotCode :: forall a b. (String -> b) -- ^ How to annotate code samples+ -> Docstring a+ -> Docstring b+annotCode annot (DocString opts blocks)+ = DocString opts $ fmap annotCodeBlock blocks+ where+ annotCodeBlock :: Block a -> Block b+ annotCodeBlock (Para inlines) = Para (fmap annotCodeInline inlines)+ annotCodeBlock (Header i inlines) = Header i (fmap annotCodeInline inlines)+ annotCodeBlock (Blockquote blocks) = Blockquote (fmap annotCodeBlock blocks)+ annotCodeBlock (List b t blocks) = List b t (fmap (fmap annotCodeBlock) blocks)+ annotCodeBlock (CodeBlock attrs src _) = CodeBlock attrs src (annot (T.unpack src))+ annotCodeBlock (HtmlBlock src) = HtmlBlock src+ annotCodeBlock HRule = HRule++ annotCodeInline :: Inline a -> Inline b+ annotCodeInline (Str t) = Str t+ annotCodeInline Space = Space+ annotCodeInline SoftBreak = SoftBreak+ annotCodeInline LineBreak = LineBreak+ annotCodeInline (Emph is) = Emph (fmap annotCodeInline is)+ annotCodeInline (Strong is) = Strong (fmap annotCodeInline is)+ annotCodeInline (Code src _) = Code src (annot (T.unpack src))+ annotCodeInline (Link is url title) = Link (fmap annotCodeInline is) url title+ annotCodeInline (Image is url title) = Image (fmap annotCodeInline is) url title+ annotCodeInline (Entity txt) = Entity txt+ annotCodeInline (RawHtml src) = RawHtml src
src/Idris/Elab/Class.hs view
@@ -52,9 +52,9 @@ data MArgTy = IA | EA | CA deriving Show -elabClass :: ElabInfo -> SyntaxInfo -> Docstring ->+elabClass :: ElabInfo -> SyntaxInfo -> Docstring (Either Err PTerm) -> FC -> [PTerm] ->- Name -> [(Name, PTerm)] -> [(Name, Docstring)] -> [PDecl] -> Idris ()+ Name -> [(Name, PTerm)] -> [(Name, Docstring (Either Err PTerm))] -> [PDecl] -> Idris () elabClass info syn_in doc fc constraints tn ps pDocs ds = do let cn = SN (InstanceCtorN tn) -- sUN ("instance" ++ show tn) -- MN 0 ("instance" ++ show tn) let tty = pibind ps PType@@ -220,7 +220,8 @@ insertConstraint c (PPi p@(Imp _ _ _) n ty sc) = PPi p n ty (insertConstraint c sc)- insertConstraint c sc = PPi constraint (sMN 0 "class") c sc+ insertConstraint c sc = PPi (constraint { pstatic = Static }) + (sMN 0 "class") c sc -- make arguments explicit and don't bind class parameters toExp ns e (PPi (Imp l s p) n ty sc)
src/Idris/Elab/Clause.hs view
@@ -14,11 +14,13 @@ import Idris.Primitives import Idris.Inliner import Idris.PartialEval+import Idris.Transforms import Idris.DeepSeq-import Idris.Output (iputStrLn, pshow, iWarn)+import Idris.Output (iputStrLn, pshow, iWarn, iRenderResult) import IRTS.Lang import Idris.Elab.Type+import Idris.Elab.Transform import Idris.Elab.Utils import Idris.Core.TT@@ -28,7 +30,8 @@ import Idris.Core.Typecheck import Idris.Core.CaseTree -import Idris.Docstrings+import Idris.Docstrings hiding (Unchecked)+import Util.Pretty hiding ((<$>)) import Prelude hiding (id, (.)) import Control.Category@@ -48,6 +51,7 @@ import Data.List.Split (splitOn) import Util.Pretty(pretty, text)+import Numeric -- | Elaborate a collection of left-hand and right-hand pairs - that is, a -- top-level definition.@@ -55,6 +59,8 @@ elabClauses info fc opts n_in cs = let n = liftname info n_in in do ctxt <- getContext ist <- getIState+ optimise <- getOptimise+ let petrans = PETransform `elem` optimise inacc <- map fst <$> fgetState (opt_inaccessible . ist_optimisation n) -- Check n actually exists, with no definition yet@@ -70,9 +76,11 @@ let atys = map snd (getArgTys fty) cs_elab <- mapM (elabClause info opts) (zip [0..] cs)+ -- pats_raw is the version we'll work with at compile time:+ -- no simplification or PE let (pats_in, cs_full) = unzip cs_elab-- logLvl 3 $ "Elaborated patterns:\n" ++ show pats_in+ let pats_raw = map (simple_lhs (tt_ctxt ist)) pats_in+ logLvl 3 $ "Elaborated patterns:\n" ++ show pats_raw solveDeferred n @@ -81,13 +89,38 @@ addIBC (IBCOpt n) ist <- getIState- let pats = map (simple_lhs (tt_ctxt ist)) $ doTransforms ist pats_in+ -- Don't apply rules if this is a partial evaluation definition,+ -- or we'll make something that just runs itself!+ let tpats = case specNames opts of+ Nothing -> transformPats ist pats_in+ _ -> pats_in - -- logLvl 3 (showSep "\n" (map (\ (l,r) ->- -- show l ++ " = " ++- -- show r) pats))+ -- If the definition is specialisable, this reduces the+ -- RHS+ pe_tm <- doPartialEval ist tpats+ let pats_pe = if petrans + then map (simple_lhs (tt_ctxt ist)) pe_tm+ else pats_raw+ let tcase = opt_typecase (idris_options ist) + -- Look for 'static' names and generate new specialised+ -- definitions for them, as well as generating rewrite rules+ -- for partially evaluated definitions+ newrules <- if petrans + then mapM (\ e -> case e of+ Left _ -> return []+ Right (l, r) -> elabPE info fc n r) pats_pe+ else return []++ -- Redo transforms with the newly generated transformations, so+ -- that the specialised application we've just made gets+ -- used in place of the general one+ ist <- getIState+ let pats_transformed = if petrans+ then transformPats ist pats_pe+ else pats_pe+ -- Summary of what's about to happen: Definitions go: -- -- pats_in -> pats -> pdef -> pdef'@@ -95,20 +128,15 @@ -- addCaseDef builds case trees from <pdef> and <pdef'> -- pdef is the compile-time pattern definition.- -- This will get further optimised for run-time, and, separately,- -- further inlined to help with totality checking.- let pdef = map debind pats+ -- This will get further inlined to help with totality checking.+ let pdef = map debind pats_raw+ -- pdef_pe is the one which will get further optimised + -- for run-time, and, partially evaluated+ let pdef_pe = map debind pats_transformed - logLvl 5 $ "Initial typechecked patterns:\n" ++ show pats+ logLvl 5 $ "Initial typechecked patterns:\n" ++ show pats_raw logLvl 5 $ "Initial typechecked pattern def:\n" ++ show pdef - -- Look for 'static' names and generate new specialised- -- definitions for them-- mapM_ (\ e -> case e of- Left _ -> return ()- Right (l, r) -> elabPE info fc n r) pats- -- NOTE: Need to store original definition so that proofs which -- rely on its structure aren't affected by any changes to the -- inliner. Just use the inlined version to generate pdef' and to@@ -120,12 +148,14 @@ numArgs <- tclift $ sameLength pdef case specNames opts of- Just _ -> logLvl 5 $ "Partially evaluated:\n" ++ show pats+ Just _ -> + do logLvl 3 $ "Partially evaluated:\n" ++ show pats_pe _ -> return ()+ logLvl 3 $ "Transformed:\n" ++ show pats_transformed erInfo <- getErasureInfo <$> getIState tree@(CaseDef scargs sc _) <- tclift $- simpleCase tcase False reflect CompileTime fc inacc atys pdef erInfo+ simpleCase tcase False reflect CompileTime fc inacc atys pdef erInfo cov <- coverage pmissing <- if cov && not (hasDefault cs)@@ -146,8 +176,9 @@ else return [] let pcover = null pmissing - -- pdef' is the version that gets compiled for run-time- pdef_in' <- applyOpts pdef+ -- pdef' is the version that gets compiled for run-time,+ -- so we start from the partially evaluated version+ pdef_in' <- applyOpts pdef_pe let pdef' = map (simple_rt (tt_ctxt ist)) pdef_in' logLvl 5 $ "After data structure transformations:\n" ++ show pdef'@@ -163,7 +194,6 @@ -- then case tot of -- Total _ -> return () -- t -> tclift $ tfail (At fc (Msg (show n ++ " is " ++ show t)))- -- else return () -- _ -> return () case tree of CaseDef _ _ [] -> return ()@@ -180,7 +210,7 @@ ctxt <- getContext ist <- getIState let opt = idris_optimisation ist- putIState (ist { idris_patdefs = addDef n (force pdef', force pmissing)+ putIState (ist { idris_patdefs = addDef n (force pdef_pe, force pmissing) (idris_patdefs ist) }) let caseInfo = CaseInfo (inlinable opts) (dictionary opts) case lookupTy n ctxt of@@ -190,8 +220,11 @@ (AssertTotal `elem` opts) atys inacc- pats- pdef pdef pdef_inl pdef' ty)+ pats_pe+ pdef + pdef -- compile time + pdef_inl -- inlined+ pdef' ty) addIBC (IBCDef n) setTotality n tot when (not reflect) $ do totcheck (fc, n)@@ -244,22 +277,12 @@ getLHS (_, l, _) = l - simple_lhs ctxt (Right (x, y)) = Right (normalise ctxt [] x, - force (normalisePats ctxt [] y))+ simple_lhs ctxt (Right (x, y)) = Right (normalise ctxt [] x, y) simple_lhs ctxt t = t simple_rt ctxt (p, x, y) = (p, x, force (uniqueBinders p (rt_simplify ctxt [] y))) - -- this is so pattern types are in the right form for erasure- normalisePats ctxt env (Bind n (PVar t) sc) - = let t' = normalise ctxt env t in- Bind n (PVar t') (normalisePats ctxt ((n, PVar t') : env) sc)- normalisePats ctxt env (Bind n (PVTy t) sc) - = let t' = normalise ctxt env t in- Bind n (PVTy t') (normalisePats ctxt ((n, PVar t') : env) sc)- normalisePats ctxt env t = t- specNames [] = Nothing specNames (Specialise ns : _) = Just ns specNames (_ : xs) = specNames xs@@ -271,63 +294,95 @@ else tfail (At fc (Msg "Clauses have differing numbers of arguments ")) sameLength [] = return 0 - -- apply all transformations (just specialisation for now, add- -- user defined transformation rules later)- doTransforms ist pats =+ -- Partially evaluate, if the definition is marked as specialisable+ doPartialEval ist pats = case specNames opts of- Nothing -> pats- Just ns -> partial_eval (tt_ctxt ist) ns pats+ Nothing -> return pats+ Just ns -> case partial_eval (tt_ctxt ist) ns pats of+ Just t -> return t+ Nothing -> ierror (At fc (Msg "No specialisation achieved")) --- | Find 'static' applications in a term and partially evaluate them-elabPE :: ElabInfo -> FC -> Name -> Term -> Idris ()+-- | Find 'static' applications in a term and partially evaluate them.+-- Return any new transformation rules+elabPE :: ElabInfo -> FC -> Name -> Term -> Idris [(Term, Term)] elabPE info fc caller r = do ist <- getIState- let sa = getSpecApps ist [] r- mapM_ (mkSpecialised ist) sa- where - -- TODO: Add a PTerm level transformation rule, which is basically the - -- new definition in reverse (before specialising it). - -- RHS => LHS where implicit arguments are left blank in the + let sa = filter (\ap -> fst ap /= caller) $ getSpecApps ist [] r+ rules <- mapM mkSpecialised sa+ return $ concat rules+ where+ -- Make a specialised version of the application, and+ -- add a PTerm level transformation rule, which is basically the+ -- new definition in reverse (before specialising it).+ -- RHS => LHS where implicit arguments are left blank in the -- transformation. - -- Apply that transformation after every PClauses elaboration+ -- Transformation rules are applied after every PClause elaboration - mkSpecialised ist specapp_in = do+ mkSpecialised :: (Name, [(PEArgType, Term)]) -> Idris [(Term, Term)]+ mkSpecialised specapp_in = do+ ist <- getIState let (specTy, specapp) = getSpecTy ist specapp_in- let (n, newnm, pats) = getSpecClause ist specapp- let undef = case lookupDef newnm (tt_ctxt ist) of- [] -> True+ let (n, newnm, specdecl) = getSpecClause ist specapp+ let lhs = pe_app specdecl+ let rhs = pe_def specdecl+ let undef = case lookupDefExact newnm (tt_ctxt ist) of+ Nothing -> True _ -> False- logLvl 5 $ show (newnm, map (concreteArg ist) (snd specapp))+ logLvl 5 $ show (newnm, undef, map (concreteArg ist) (snd specapp)) idrisCatch- (when (undef && all (concreteArg ist) (snd specapp)) $ do- cgns <- getAllNames n- let opts = [Specialise (map (\x -> (x, Nothing)) cgns ++ - mapMaybe specName (snd specapp))]- logLvl 3 $ "Specialising application: " ++ show specapp- logLvl 2 $ "New name: " ++ show newnm- iLOG $ "PE definition type : " ++ (show specTy)- ++ "\n" ++ show opts- logLvl 2 $ "PE definition " ++ show newnm ++ ":\n" ++- showSep "\n" - (map (\ (lhs, rhs) ->- (showTmImpls lhs ++ " = " ++ - showTmImpls rhs)) pats)- elabType info defaultSyntax emptyDocstring [] fc opts newnm specTy- let def = map (\ (lhs, rhs) -> PClause fc newnm lhs [] rhs []) pats- elabClauses info fc opts newnm def- logLvl 2 $ "Specialised " ++ show newnm)+ (if (undef && all (concreteArg ist) (snd specapp)) then do+ cgns <- getAllNames n+ -- on the RHS of the new definition, we should reduce+ -- everything that's not itself static (because we'll+ -- want to be a PE version of those next)+ let cgns' = filter (\x -> x /= n &&+ notStatic ist x) cgns+ let opts = [Specialise ((if pe_simple specdecl + then map (\x -> (x, Nothing)) cgns' + else []) +++ (n, Just 65536) : + mapMaybe (specName (pe_simple specdecl))+ (snd specapp))]+ logLvl 3 $ "Specialising application: " ++ show specapp+ ++ " in " ++ show caller +++ " with " ++ show opts+ logLvl 3 $ "New name: " ++ show newnm+ logLvl 3 $ "PE definition type : " ++ (show specTy)+ ++ "\n" ++ show opts+ logLvl 3 $ "PE definition " ++ show newnm ++ ":\n" +++ showSep "\n"+ (map (\ (lhs, rhs) ->+ (show lhs ++ " = " +++ showTmImpls rhs)) (pe_clauses specdecl))++ logLvl 2 $ show n ++ " transformation rule: " +++ show rhs ++ " ==> " ++ show lhs++ elabType info defaultSyntax emptyDocstring [] fc opts newnm specTy+ let def = map (\(lhs, rhs) ->+ PClause fc newnm lhs [] rhs []) + (pe_clauses specdecl) + trans <- elabTransform info fc False rhs lhs+ elabClauses info fc opts newnm def+ return [trans]+ else return []) -- if it doesn't work, just don't specialise. Could happen for lots -- of valid reasons (e.g. local variables in scope which can't be -- lifted out).- (\e -> logLvl 4 $ "Couldn't specialise: " ++ (pshow ist e)) + (\e -> do logLvl 3 $ "Couldn't specialise: " ++ (pshow ist e)+ return []) - specName (ImplicitS, tm) - | (P Ref n _, _) <- unApply tm = Just (n, Just 1)- specName (ExplicitS, tm)- | (P Ref n _, _) <- unApply tm = Just (n, Just 1)- specName _ = Nothing+ specName simpl (ImplicitS, tm)+ | (P Ref n _, _) <- unApply tm = Just (n, Just (if simpl then 1 else 0))+ specName simpl (ExplicitS, tm)+ | (P Ref n _, _) <- unApply tm = Just (n, Just (if simpl then 1 else 0))+ specName simpl _ = Nothing + notStatic ist n = case lookupCtxtExact n (idris_statics ist) of+ Just s -> not (or s)+ _ -> True+ concreteArg ist (ImplicitS, tm) = concreteTm ist tm concreteArg ist (ExplicitS, tm) = concreteTm ist tm concreteArg ist _ = True@@ -337,6 +392,8 @@ [] -> False _ -> True concreteTm ist (Constant _) = True+ concreteTm ist (Bind n (Lam _) sc) = True+ concreteTm ist (Bind n (Let _ _) sc) = concreteTm ist sc concreteTm ist _ = False -- get the type of a specialised application@@ -351,14 +408,20 @@ -- get the clause of a specialised application getSpecClause ist (n, args)- = let newnm = sUN ("__"++show (nsroot n) ++ "_" ++ - showSep "_" (map showArg args)) in + = let newnm = sUN ("PE_" ++ show (nsroot n) ++ "_" +++ qhash 0 (showSep "_" (map showArg args))) in -- UN (show n ++ show (map snd args)) in (n, newnm, mkPE_TermDecl ist newnm n args) where showArg (ExplicitS, n) = show n showArg (ImplicitS, n) = show n showArg _ = "" + -- TMP for readability! This is obviously a really bad hashing+ -- function.+ qhash :: Int -> String -> String+ qhash acc [] = showHex acc ""+ qhash acc (x:xs) = qhash (fromEnum x + acc) xs+ -- checks if the clause is a possible left hand side. Returns the term if -- possible, otherwise Nothing. @@ -388,8 +451,8 @@ validCase ctxt (Elaborating _ _ e) = validCase ctxt e validCase ctxt (ElaboratingArg _ _ _ e) = validCase ctxt e validCase ctxt _ = True- - recoverable ctxt (CantUnify r topx topy e _ _) ++ recoverable ctxt (CantUnify r topx topy e _ _) = let topx' = normalise ctxt [] topx topy' = normalise ctxt [] topy in checkRec topx' topy'@@ -398,7 +461,7 @@ recoverable ctxt (ElaboratingArg _ _ _ e) = recoverable ctxt e recoverable _ _ = False - sameFam topx topy + sameFam topx topy = case (unApply topx, unApply topy) of ((P _ x _, _), (P _ y _, _)) -> x == y _ -> False@@ -409,11 +472,11 @@ checkRec (App f a) p@(P _ _ _) = checkRec f p checkRec p@(P _ _ _) (App f a) = checkRec p f- checkRec fa@(App _ _) fa'@(App _ _) + checkRec fa@(App _ _) fa'@(App _ _) | (f, as) <- unApply fa, (f', as') <- unApply fa'- = if (length as /= length as') - then checkRec f f' + = if (length as /= length as')+ then checkRec f f' else checkRec f f' && and (zipWith checkRec as as') checkRec (P xt x _) (P yt y _) = x == y || ntRec xt yt checkRec _ _ = False@@ -463,7 +526,7 @@ let lhs = addImpl i lhs_in b <- checkPossible info fc tcgen fname lhs_in case b of- True -> tclift $ tfail (At fc + True -> tclift $ tfail (At fc (Msg $ show lhs_in ++ " is a valid case")) False -> do ptm <- mkPatTm lhs_in return (Left ptm, lhs)@@ -501,6 +564,8 @@ let lhs_tm = orderPats (getInferTerm lhs') let lhs_ty = getInferType lhs'+ let static_names = getStaticNames i lhs_tm+ logLvl 3 ("Elaborated: " ++ show lhs_tm) logLvl 3 ("Elaborated type: " ++ show lhs_ty) logLvl 5 ("Injective: " ++ show fname ++ " " ++ show inj)@@ -516,9 +581,11 @@ -- These are the names we're not allowed to use on the RHS, because -- they're UniqueTypes and borrowed from another function. -- FIXME: There is surely a nicer way than this...+ -- Issue #1615 on the Issue Tracker.+ -- https://github.com/idris-lang/Idris-dev/issues/1615 when (not (null borrowed)) $ logLvl 5 ("Borrowed names on LHS: " ++ show borrowed)- + logLvl 3 ("Normalised LHS: " ++ showTmImpls (delabMV i clhs)) rep <- useREPL@@ -541,7 +608,8 @@ let newargs = filter (\(n,_) -> n `notElem` uniqargs) newargs_all let winfo = pinfo info newargs defs windex- let wb = map (expandParamsD False ist decorate newargs defs) whereblock+ let wb = map (mkStatic static_names) $+ map (expandParamsD False ist decorate newargs defs) whereblock -- Split the where block into declarations with a type, and those -- without@@ -562,7 +630,7 @@ tclift $ elaborate ctxt (sMN 0 "patRHS") clhsty [] (do pbinds ist lhs_tm mapM_ setinj (nub (params ++ inj))- setNextName + setNextName (_, _, is) <- errAt "right hand side of " fname (erun fc (build i winfo ERHS opts fname rhs)) errAt "right hand side of " fname@@ -579,7 +647,7 @@ logLvl 5 "DONE CHECK" logLvl 2 $ "---> " ++ show rhs'- when (not (null defer)) $ iLOG $ "DEFERRED " ++ + when (not (null defer)) $ iLOG $ "DEFERRED " ++ show (map (\ (n, (_,_,t)) -> (n, t)) defer) def' <- checkDef fc defer let def'' = map (\(n, (i, top, t)) -> (n, (i, top, t, False))) def'@@ -599,7 +667,7 @@ logLvl 5 $ "Rechecking" logLvl 6 $ " ==> " ++ show (forget rhs') - (crhs, crhsty) <- if not inf + (crhs, crhsty) <- if not inf then recheckC_borrowing True borrowed fc [] rhs' else return (rhs', clhsty) logLvl 6 $ " ==> " ++ show crhsty ++ " against " ++ show clhsty@@ -612,16 +680,16 @@ -- then we'll try running it in reverse to improve error messages let (ret_fam, _) = unApply (getRetTy crhsty) rev <- case ret_fam of- P _ rfamn _ -> + P _ rfamn _ -> case lookupCtxt rfamn (idris_datatypes i) of- [TI _ _ dopts _ _] -> + [TI _ _ dopts _ _] -> return (DataErrRev `elem` dopts) _ -> return False _ -> return False when (rev || ErrorReverse `elem` opts) $ do addIBC (IBCErrRev (crhs, clhs))- addErrRev (crhs, clhs) + addErrRev (crhs, clhs) return $ (Right (clhs, crhs), lhs) where pinfo :: ElabInfo -> [(Name, PTerm)] -> [Name] -> Int -> ElabInfo@@ -641,7 +709,7 @@ -- we know they can't be used on the RHS borrowedNames :: [Name] -> Term -> [Name] borrowedNames env (App (App (P _ (NS (UN lend) [owner]) _) _) arg)- | owner == txt "Ownership" && + | owner == txt "Ownership" && (lend == txt "lend" || lend == txt "Read") = getVs arg where getVs (V i) = [env!!i]@@ -653,7 +721,7 @@ borrowedB b = borrowedNames env (binderTy b) borrowedNames _ _ = [] - mkLHSapp t@(PRef _ _) = trace ("APP " ++ show t) $ PApp fc t []+ mkLHSapp t@(PRef _ _) = PApp fc t [] mkLHSapp t = t decorate (NS x ns)@@ -689,7 +757,7 @@ isArg :: Name -> PDecl -> Bool isArg n (PClauses _ _ _ cs) = any isArg' cs where- isArg' (PClause _ _ (PApp _ _ args) _ _ _) + isArg' (PClause _ _ (PApp _ _ args) _ _ _) = any (\x -> case x of PRef _ n' -> n == n' _ -> False) (map getTm args)@@ -719,7 +787,8 @@ let lhs_tm = orderPats (getInferTerm lhs') let lhs_ty = getInferType lhs' let ret_ty = getRetTy (explicitNames (normalise ctxt [] lhs_ty))- logLvl 3 (show lhs_tm)+ let static_names = getStaticNames i lhs_tm+ logLvl 5 (show lhs_tm ++ "\n" ++ show static_names) (clhs, clhsty) <- recheckC fc [] lhs_tm logLvl 5 ("Checked " ++ show clhs) let bargs = getPBtys (explicitNames (normalise ctxt [] lhs_tm))@@ -745,7 +814,7 @@ (cwval, cwvalty) <- recheckC fc [] (getInferTerm wval') let cwvaltyN = explicitNames (normalise ctxt [] cwvalty) let cwvalN = explicitNames (normalise ctxt [] cwval)- logLvl 5 ("With type " ++ show cwvalty ++ "\nRet type " ++ show ret_ty)+ logLvl 3 ("With type " ++ show cwvalty ++ "\nRet type " ++ show ret_ty) let pvars = map fst (getPBtys cwvalty) -- we need the unelaborated term to get the names it depends on -- rather than a de Bruijn index.@@ -769,7 +838,15 @@ let imps = getImps wtype -- add to implicits context putIState (i { idris_implicits = addDef wname imps (idris_implicits i) })+ let statics = getStatics static_names wtype+ logLvl 5 ("Static positions " ++ show statics)+ i <- getIState+ putIState (i { idris_statics = addDef wname statics (idris_statics i) })+ addIBC (IBCDef wname)+ addIBC (IBCImp wname)+ addIBC (IBCStatic wname)+ def' <- checkDef fc [(wname, (-1, Nothing, wtype))] let def'' = map (\(n, (i, top, t)) -> (n, (i, top, t, False))) def' addDeferred def''@@ -867,5 +944,3 @@ split deps [] pre = (reverse pre, []) abstract wn wv wty (n, argty) = (n, substTerm wv (P Bound wn wty) argty)--
src/Idris/Elab/Data.hs view
@@ -20,6 +20,7 @@ import Idris.Elab.Type import Idris.Elab.Utils+import Idris.Elab.Value import Idris.Core.TT import Idris.Core.Elaborate hiding (Tactic(..))@@ -49,7 +50,7 @@ import Util.Pretty(pretty, text) -elabData :: ElabInfo -> SyntaxInfo -> Docstring -> [(Name, Docstring)] -> FC -> DataOpts -> PData -> Idris ()+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 t_in) = do let codata = Codata `elem` opts iLOG (show (fc, doc))@@ -77,7 +78,7 @@ cons <- mapM (elabCon cnameinfo syn n codata (getRetTy cty)) dcons ttag <- getName i <- getIState- let as = map (const Nothing) (getArgTys cty)+ let as = map (const (Left (Msg ""))) (getArgTys cty) let params = findParams (map snd cons) logLvl 2 $ "Parameters : " ++ show params -- TI contains information about mutually declared types - this will@@ -88,7 +89,10 @@ addIBC (IBCDef n) addIBC (IBCData n) checkDocs fc argDocs t- addDocStr n doc argDocs+ doc' <- elabDocTerms info doc+ argDocs' <- mapM (\(n, d) -> do d' <- elabDocTerms info d+ return (n, d')) argDocs+ addDocStr n doc' argDocs' addIBC (IBCDoc n) let metainf = DataMI params addIBC (IBCMetaInformation n metainf)@@ -120,7 +124,7 @@ [oi] -> putIState ist{ idris_optimisation = addDef n oi{ detaggable = True } opt } _ -> putIState ist{ idris_optimisation = addDef n (Optimise [] True) opt } - checkDefinedAs fc n t ctxt + checkDefinedAs fc n t ctxt = case lookupDef n ctxt of [] -> return () [TyDecl _ ty] ->@@ -200,14 +204,9 @@ liftname = id -- Is this appropriate? } --- FIXME: 'forcenames' is an almighty hack! Need a better way of--- erasing non-forceable things--- ^^^--- TODO: the above is a comment from the past;--- forcenames is probably no longer needed elabCon :: ElabInfo -> SyntaxInfo -> Name -> Bool -> Type -> -- for kind checking- (Docstring, [(Name, Docstring)], Name, PTerm, FC, [Name]) -> + (Docstring (Either Err PTerm), [(Name, Docstring (Either Err PTerm))], Name, PTerm, FC, [Name]) -> Idris (Name, Type) elabCon info syn tn codata expkind (doc, argDocs, n, t_in, fc, forcenames) = do checkUndefined fc n@@ -225,7 +224,10 @@ addIBC (IBCDef n) checkDocs fc argDocs t- addDocStr n doc argDocs+ doc' <- elabDocTerms info doc+ argDocs' <- mapM (\(n, d) -> do d' <- elabDocTerms info d+ return (n, d')) argDocs+ addDocStr n doc' argDocs' addIBC (IBCDoc n) fputState (opt_inaccessible . ist_optimisation n) inacc addIBC (IBCOpt n)@@ -237,7 +239,7 @@ else return () tyIs con t = tclift $ tfail (At fc (Elaborating "constructor " con (Msg (show t ++ " is not " ++ show tn)))) - mkLazy (PPi pl n ty sc) + mkLazy (PPi pl n ty sc) = let ty' = if getTyName ty then PApp fc (PRef fc (sUN "Lazy'")) [pexp (PRef fc (sUN "LazyCodata")),@@ -270,11 +272,14 @@ type EliminatorState = StateT (Map.Map String Int) Idris +-- -- Issue #1616 in the issue tracker.+-- https://github.com/idris-lang/Idris-dev/issues/1616+-- -- TODO: Rewrite everything to use idris_implicits instead of manual splitting (or in TT) -- FIXME: Many things have name starting with elim internally since this was the only purpose in the first edition of the function -- rename to caseFun to match updated intend elabCaseFun :: Bool -> [Int] -> Name -> PTerm ->- [(Docstring, [(Name, Docstring)], Name, PTerm, FC, [Name])] ->+ [(Docstring (Either Err PTerm), [(Name, Docstring (Either Err PTerm))], Name, PTerm, FC, [Name])] -> ElabInfo -> EliminatorState () elabCaseFun ind paramPos n ty cons info = do elimLog $ "Elaborating case function"@@ -293,7 +298,7 @@ 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 eliminatorTyDecl = PTy (parseDocstring . T.pack $ show n) [] defaultSyntax elimFC [TotalFn] elimDeclName eliminatorTy+ let eliminatorTyDecl = PTy (fmap (const (Left $ Msg "")) . parseDocstring . T.pack $ show n) [] defaultSyntax elimFC [TotalFn] elimDeclName eliminatorTy let clauseConsElimArgs = map getPiName consTerms let clauseGeneralArgs' = map getPiName generalParams ++ [motiveName] ++ clauseConsElimArgs let clauseGeneralArgs = map (\arg -> pexp (PRef elimFC arg)) clauseGeneralArgs'@@ -410,7 +415,7 @@ case findIndex (== n) oldParams of Nothing -> (PPi pl n (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))@@ -443,7 +448,7 @@ splitArgPms _ = ([],[]) - implicitIndexes :: (Docstring, Name, PTerm, FC, [Name]) -> EliminatorState [(Name, Plicity, PTerm)]+ implicitIndexes :: (Docstring (Either Err PTerm), Name, PTerm, FC, [Name]) -> EliminatorState [(Name, Plicity, PTerm)] implicitIndexes (cns@(doc, cnm, ty, fc, fs)) = do i <- State.lift getIState implargs' <- case lookupCtxt cnm (idris_implicits i) of@@ -458,7 +463,7 @@ in return $ filter (\(n,_,_) -> not (n `elem` oldParams))implargs _ -> return implargs - extractConsTerm :: (Docstring, [(Name, Docstring)], Name, PTerm, FC, [Name]) -> [(Name, Plicity, PTerm)] -> EliminatorState PTerm+ extractConsTerm :: (Docstring (Either Err PTerm), [(Name, Docstring (Either Err PTerm))], Name, PTerm, FC, [Name]) -> [(Name, Plicity, PTerm)] -> EliminatorState PTerm extractConsTerm (doc, argDocs, cnm, ty, fc, fs) generalParameters = do let cons' = replaceParams paramPos generalParameters ty let (args, resTy) = splitPi cons'@@ -494,7 +499,7 @@ convertImplPi (PImp {getTm = t, pname = n}) = Just (n, expl, t) convertImplPi _ = Nothing - generateEliminatorClauses :: (Docstring, [(Name, Docstring)], Name, PTerm, FC, [Name]) -> Name -> [PArg] -> [(Name, Plicity, PTerm)] -> EliminatorState PClause+ generateEliminatorClauses :: (Docstring (Either Err PTerm), [(Name, Docstring (Either Err PTerm))], Name, PTerm, FC, [Name]) -> Name -> [PArg] -> [(Name, Plicity, PTerm)] -> EliminatorState PClause generateEliminatorClauses (doc, _, cnm, ty, fc, fs) cnsElim generalArgs generalParameters = do let cons' = replaceParams paramPos generalParameters ty let (args, resTy) = splitPi cons'@@ -511,4 +516,3 @@ where applyRecElim :: (Name, Plicity, PTerm) -> PArg 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
@@ -63,7 +63,7 @@ (n, ci) <- case lookupCtxtName n (idris_classes i) of [c] -> return c [] -> ifail $ show fc ++ ":" ++ show n ++ " is not a type class"- cs -> tclift $ tfail $ At fc + cs -> tclift $ tfail $ At fc (CantResolveAlts (map fst cs)) let constraint = PApp fc (PRef fc n) (map pexp ps) let iname = mkiname n ps expn@@ -77,7 +77,7 @@ (class_instances ci) addInstance intInst n iname Just _ -> addInstance intInst n iname- when (what /= ETypes && (not (null ds && not emptyclass))) $ do + when (what /= ETypes && (not (null ds && not emptyclass))) $ do let ips = zip (class_params ci) ps let ns = case n of NS n ns' -> ns'@@ -93,7 +93,7 @@ mapM_ (rec_elabDecl info EAll info) undefinedSuperclassInstances let all_meths = map (nsroot . fst) (class_methods ci) let mtys = map (\ (n, (op, t)) ->- let t_in = substMatchesShadow ips pnames t + let t_in = substMatchesShadow ips pnames t mnamemap = map (\n -> (n, PRef fc (decorate ns iname n))) all_meths t' = substMatchesShadow mnamemap pnames t_in in@@ -115,7 +115,7 @@ -- Bring variables in instance head into scope ist <- getIState let headVars = nub $ mapMaybe (\p -> case p of- PRef _ n -> + PRef _ n -> case lookupTy n (tt_ctxt ist) of [] -> Just n _ -> Nothing@@ -157,6 +157,8 @@ _ -> return False -- couldn't find class, just let elabInstance fail later -- TODO: largely based upon elabType' - should try to abstract+ -- Issue #1614 in the issue tracker:+ -- https://github.com/idris-lang/Idris-dev/issues/1614 elabFindOverlapping i ci iname syn t = do ty' <- addUsingConstraints syn fc t -- TODO think: something more in info?@@ -221,7 +223,8 @@ mkTyDecl (n, op, t, _) = PTy emptyDocstring [] syn fc op n t - conbind (ty : ns) x = PPi constraint (sMN 0 "class") ty (conbind ns x)+ conbind (ty : ns) x = PPi (constraint) -- { pstatic = Dynamic }) + (sMN 0 "class") ty (conbind ns x) conbind [] x = x coninsert cs (PPi p@(Imp _ _ _) n t sc) = PPi p n t (coninsert cs sc)@@ -256,5 +259,3 @@ clauseFor m iname ns (PClauses _ _ m' _) = decorate ns iname m == decorate ns iname m' clauseFor m iname ns _ = False--
src/Idris/Elab/Provider.hs view
@@ -98,7 +98,7 @@ logLvl 3 $ "Elaborated provider " ++ show n ++ " as: " ++ show tm | ProvPostulate _ <- what -> do -- Add the postulate- elabPostulate info syn (parseDocstring $ T.pack "Provided postulate") fc [] n (delab i tm)+ elabPostulate info syn (fmap (const (Left $ Msg "")) . parseDocstring $ T.pack "Provided postulate") fc [] 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
@@ -50,8 +50,8 @@ import Util.Pretty(pretty, text) -elabRecord :: ElabInfo -> SyntaxInfo -> Docstring -> FC -> Name ->- PTerm -> DataOpts -> Docstring -> Name -> PTerm -> Idris ()+elabRecord :: ElabInfo -> SyntaxInfo -> Docstring (Either Err PTerm) -> FC -> Name ->+ PTerm -> DataOpts -> Docstring (Either Err PTerm) -> Name -> PTerm -> Idris () elabRecord info syn doc fc tyn ty opts cdoc cn cty_in = do elabData info syn doc [] fc opts (PDatadecl tyn ty [(cdoc, [], cn, cty_in, fc, [])]) -- TODO think: something more in info?
+ src/Idris/Elab/Transform.hs view
@@ -0,0 +1,99 @@+{-# LANGUAGE PatternGuards #-}+module Idris.Elab.Transform where++import Idris.AbsSyntax+import Idris.ASTUtils+import Idris.DSL+import Idris.Error+import Idris.Delaborate+import Idris.Imports+import Idris.ElabTerm+import Idris.Coverage+import Idris.DataOpts+import Idris.Providers+import Idris.Primitives+import Idris.Inliner+import Idris.PartialEval+import Idris.DeepSeq+import Idris.Output (iputStrLn, pshow, iWarn)+import IRTS.Lang++import Idris.Elab.Utils++import Idris.Core.TT+import Idris.Core.Elaborate hiding (Tactic(..))+import Idris.Core.Evaluate+import Idris.Core.Execute+import Idris.Core.Typecheck+import Idris.Core.CaseTree++import Idris.Docstrings++import Prelude hiding (id, (.))+import Control.Category++import Control.Applicative hiding (Const)+import Control.DeepSeq+import Control.Monad+import Control.Monad.State.Strict as State+import Data.List+import Data.Maybe+import Debug.Trace++import qualified Data.Map as Map+import qualified Data.Set as S+import qualified Data.Text as T+import Data.Char(isLetter, toLower)+import Data.List.Split (splitOn)++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+ = do ctxt <- getContext+ i <- getIState+ let lhs = addImplPat i lhs_in+ ((lhs', dlhs, []), _) <-+ tclift $ elaborate ctxt (sMN 0 "transLHS") infP []+ (erun fc (buildTC i info ELHS [] (sUN "transform")+ (infTerm lhs)))+ let lhs_tm = orderPats (getInferTerm lhs')+ let lhs_ty = getInferType lhs'+ let newargs = pvars i lhs_tm++ (clhs_tm, clhs_ty) <- recheckC fc [] lhs_tm+ logLvl 3 ("Transform LHS " ++ show clhs_tm)+ let rhs = addImplBound i (map fst newargs) rhs_in+ ((rhs', defer), _) <-+ tclift $ elaborate ctxt (sMN 0 "transRHS") clhs_ty []+ (do pbinds i lhs_tm+ setNextName+ erun fc (build i info ERHS [] (sUN "transform") rhs)+ erun fc $ psolve lhs_tm+ tt <- get_term+ return (runState (collectDeferred Nothing tt) []))+ (crhs_tm, crhs_ty) <- recheckC fc [] rhs'+ logLvl 3 ("Transform RHS " ++ show crhs_tm)+ -- Types must always convert+ case converts ctxt [] clhs_ty crhs_ty of+ OK _ -> return ()+ Error e -> ierror (At fc (CantUnify False clhs_tm crhs_tm e [] 0))+ -- In safe mode, values must convert (Thinks: This is probably not+ -- useful as is, perhaps it should require a proof of equality instead)+ when safe $ case converts ctxt [] clhs_tm crhs_tm of+ OK _ -> return ()+ Error e -> ierror (At fc (CantUnify False clhs_tm crhs_tm e [] 0))++ case unApply (depat clhs_tm) of+ (P _ tfname _, _) -> do addTrans tfname (clhs_tm, crhs_tm)+ addIBC (IBCTrans tf (clhs_tm, crhs_tm))+ _ -> ierror (At fc (Msg "Invalid transformation rule (must be function application)"))+ return (clhs_tm, crhs_tm)++ where+ depat (Bind n (PVar t) sc) = depat (instantiate (P Bound n t) sc)+ depat x = x++elabTransform info fc safe lhs_in rhs_in + = ierror (At fc (Msg "Invalid transformation rule (must be function application)"))+
src/Idris/Elab/Type.hs view
@@ -1,5 +1,5 @@ {-# LANGUAGE PatternGuards #-}-module Idris.Elab.Type(buildType, elabType, elabType', elabPostulate) where+module Idris.Elab.Type (buildType, elabType, elabType', elabPostulate) where import Idris.AbsSyntax import Idris.ASTUtils@@ -19,6 +19,7 @@ import IRTS.Lang import Idris.Elab.Utils+import Idris.Elab.Value import Idris.Core.TT import Idris.Core.Elaborate hiding (Tactic(..))@@ -27,7 +28,7 @@ import Idris.Core.Typecheck import Idris.Core.CaseTree -import Idris.Docstrings+import Idris.Docstrings (Docstring) import Prelude hiding (id, (.)) import Control.Category@@ -40,6 +41,8 @@ import Data.Maybe import Debug.Trace +import qualified Data.Traversable as Traversable+ import qualified Data.Map as Map import qualified Data.Set as S import qualified Data.Text as T@@ -111,12 +114,12 @@ param_pos i ns t = [] -- | Elaborate a top-level type declaration - for example, "foo : Int -> Int".-elabType :: ElabInfo -> SyntaxInfo -> Docstring -> [(Name, Docstring)] ->+elabType :: ElabInfo -> SyntaxInfo -> Docstring (Either Err PTerm)-> [(Name, Docstring (Either Err PTerm))] -> FC -> FnOpts -> Name -> PTerm -> Idris Type elabType = elabType' False elabType' :: Bool -> -- normalise it- ElabInfo -> SyntaxInfo -> Docstring -> [(Name, Docstring)] ->+ ElabInfo -> SyntaxInfo -> Docstring (Either Err PTerm) -> [(Name, Docstring (Either Err PTerm))] -> FC -> FnOpts -> Name -> PTerm -> Idris Type elabType' norm info syn doc argDocs fc opts n ty' = {- let ty' = piBind (params info) ty_in n = liftname info n_in in -}@@ -127,6 +130,7 @@ let nty = cty -- normalise ctxt [] cty -- if the return type is something coinductive, freeze the definition ctxt <- getContext+ logLvl 2 $ "Rechecked to " ++ show nty let nty' = normalise ctxt [] nty logLvl 2 $ "Rechecked to " ++ show nty' @@ -152,7 +156,10 @@ addDeferred ds' setFlags n opts' checkDocs fc argDocs ty- addDocStr n doc argDocs+ doc' <- elabDocTerms info doc+ argDocs' <- mapM (\(n, d) -> do d' <- elabDocTerms info d+ return (n, d')) argDocs+ addDocStr n doc' argDocs' addIBC (IBCDoc n) addIBC (IBCFlags n opts') fputState (opt_inaccessible . ist_optimisation n) inacc@@ -166,7 +173,7 @@ when (ErrorHandler `elem` opts) $ do if errorReflection then- -- TODO: Check that the declared type is the correct type for an error handler:+ -- Check that the declared type is the correct type for an error handler: -- handler : List (TTName, TT) -> Err -> ErrorReport - for now no ctxt if tyIsHandler nty' then do i <- getIState@@ -200,7 +207,7 @@ , ns4 == map txt ["Reflection","Language"] = True tyIsHandler _ = False -elabPostulate :: ElabInfo -> SyntaxInfo -> Docstring ->+elabPostulate :: ElabInfo -> SyntaxInfo -> Docstring (Either Err PTerm) -> FC -> FnOpts -> Name -> PTerm -> Idris () elabPostulate info syn doc fc opts n ty = do elabType info syn doc [] fc opts n ty@@ -209,3 +216,6 @@ -- remove it from the deferred definitions list solveDeferred n+++
src/Idris/Elab/Utils.hs view
@@ -16,6 +16,7 @@ import Control.Monad.State import Control.Monad import Data.List+import qualified Data.Traversable as Traversable import Debug.Trace @@ -105,7 +106,7 @@ -- | Check a PTerm against documentation and ensure that every documented -- argument actually exists. This must be run _after_ implicits have been -- found, or it will give spurious errors.-checkDocs :: FC -> [(Name, Docstring)] -> PTerm -> Idris ()+checkDocs :: FC -> [(Name, Docstring a)] -> PTerm -> Idris () checkDocs fc args tm = cd (Map.fromList args) tm where cd as (PPi _ n _ sc) = cd (Map.delete n as) sc cd as _ | Map.null as = return ()@@ -233,6 +234,39 @@ getUniqB env us (Pi t v) = do getUniq env us t; getUniq env us v getUniqB env us (NLet t v) = do getUniq env us t; getUniq env us v getUniqB env us b = getUniq env us (binderTy b)++-- In a functional application, return the names which are used+-- directly in a static position+getStaticNames :: IState -> Term -> [Name]+getStaticNames ist (Bind n (PVar _) sc) + = getStaticNames ist (instantiate (P Bound n Erased) sc)+getStaticNames ist tm + | (P _ fn _, args) <- unApply tm+ = case lookupCtxtExact fn (idris_statics ist) of+ Just stpos -> getStatics args stpos+ _ -> []+ where+ getStatics (P _ n _ : as) (True : ss) = n : getStatics as ss+ getStatics (_ : as) (_ : ss) = getStatics as ss+ getStatics _ _ = []+getStaticNames _ _ = []++getStatics :: [Name] -> Term -> [Bool]+getStatics ns (Bind n (Pi _ _) t)+ | n `elem` ns = True : getStatics ns t+ | otherwise = False : getStatics ns t+getStatics _ _ = []++mkStatic :: [Name] -> PDecl -> PDecl+mkStatic ns (PTy doc argdocs syn fc o n ty) + = PTy doc argdocs syn fc o n (mkStaticTy ns ty)+mkStatic ns t = t++mkStaticTy :: [Name] -> PTerm -> PTerm+mkStaticTy ns (PPi p n ty sc) + | n `elem` ns = PPi (p { pstatic = Static }) n ty (mkStaticTy ns sc)+ | otherwise = PPi p n ty (mkStaticTy ns sc)+mkStaticTy ns t = t
src/Idris/Elab/Value.hs view
@@ -1,5 +1,6 @@ {-# LANGUAGE PatternGuards #-}-module Idris.Elab.Value(elabVal, elabValBind) where+{-# OPTIONS_GHC -fwarn-incomplete-patterns -Werror #-}+module Idris.Elab.Value(elabVal, elabValBind, elabDocTerms) where import Idris.AbsSyntax import Idris.ASTUtils@@ -22,7 +23,7 @@ import Idris.Core.TT import Idris.Core.Elaborate hiding (Tactic(..))-import Idris.Core.Evaluate+import Idris.Core.Evaluate hiding (Unchecked) import Idris.Core.Execute import Idris.Core.Typecheck import Idris.Core.CaseTree@@ -38,6 +39,7 @@ import Control.Monad.State.Strict as State import Data.List import Data.Maybe+import qualified Data.Traversable as Traversable import Debug.Trace import qualified Data.Map as Map@@ -86,3 +88,24 @@ return (tm, ty) ++elabDocTerms :: ElabInfo -> Docstring (Either Err PTerm) -> Idris (Docstring DocTerm)+elabDocTerms info str = do typechecked <- Traversable.mapM decorate str+ return $ checkDocstring mkDocTerm typechecked+ where decorate (Left err) = return (Left err)+ decorate (Right pt) = fmap (fmap fst) (tryElabVal info ERHS pt)++ tryElabVal :: ElabInfo -> ElabMode -> PTerm -> Idris (Either Err (Term, Type))+ tryElabVal info aspat tm_in+ = idrisCatch (fmap Right $ elabVal info aspat tm_in)+ (return . Left)++ mkDocTerm :: String -> [String] -> String -> Either Err Term -> DocTerm+ mkDocTerm lang attrs src (Left err)+ | map toLower lang == "idris" = Failing err+ | otherwise = Unchecked+ mkDocTerm lang attrs src (Right tm)+ | map toLower lang == "idris" = if "example" `elem` map (map toLower) attrs+ then Example tm+ else Checked tm+ | otherwise = Unchecked
src/Idris/ElabDecls.hs view
@@ -28,6 +28,7 @@ import Idris.Elab.Class import Idris.Elab.Instance import Idris.Elab.Provider+import Idris.Elab.Transform import Idris.Elab.Value import Idris.Core.TT@@ -37,7 +38,7 @@ import Idris.Core.Typecheck import Idris.Core.CaseTree -import Idris.Docstrings+import Idris.Docstrings hiding (Unchecked) import Prelude hiding (id, (.)) import Control.Category@@ -76,12 +77,11 @@ elabPrims = do mapM_ (elabDecl' EAll recinfo) (map (\(opt, decl, docs, argdocs) -> PData docs argdocs defaultSyntax (fileFC "builtin") opt decl) (zip4- [inferOpts, unitOpts, falseOpts, pairOpts, eqOpts]- [inferDecl, unitDecl, falseDecl, pairDecl, eqDecl]- [emptyDocstring, unitDoc, falseDoc, pairDoc, eqDoc]- [[], [], [], pairParamDoc, eqParamDoc]))+ [inferOpts, eqOpts]+ [inferDecl, eqDecl]+ [emptyDocstring, eqDoc]+ [[], eqParamDoc])) addNameHint eqTy (sUN "prf")- elabDecl' EAll recinfo elimDecl mapM_ elabPrim primitives -- Special case prim__believe_me because it doesn't work on just constants elabBelieveMe@@ -142,38 +142,7 @@ idris_scprims = (synEq, (4, LNoOp)) : idris_scprims i } -elabTransform :: ElabInfo -> FC -> Bool -> PTerm -> PTerm -> Idris ()-elabTransform info fc safe lhs_in rhs_in- = do ctxt <- getContext- i <- getIState- let lhs = addImplPat i lhs_in- ((lhs', dlhs, []), _) <-- tclift $ elaborate ctxt (sMN 0 "transLHS") infP []- (erun fc (buildTC i info ELHS [] (sUN "transform")- (infTerm lhs)))- let lhs_tm = orderPats (getInferTerm lhs')- let lhs_ty = getInferType lhs'- let newargs = pvars i lhs_tm - (clhs_tm, clhs_ty) <- recheckC fc [] lhs_tm- logLvl 3 ("Transform LHS " ++ show clhs_tm)- let rhs = addImplBound i (map fst newargs) rhs_in- ((rhs', defer), _) <-- tclift $ elaborate ctxt (sMN 0 "transRHS") clhs_ty []- (do pbinds i lhs_tm- setNextName- erun fc (build i info ERHS [] (sUN "transform") rhs)- erun fc $ psolve lhs_tm- tt <- get_term- return (runState (collectDeferred Nothing tt) []))- (crhs_tm, crhs_ty) <- recheckC fc [] rhs'- logLvl 3 ("Transform RHS " ++ show crhs_tm)- when safe $ case converts ctxt [] clhs_tm crhs_tm of- OK _ -> return ()- Error e -> ierror (At fc (CantUnify False clhs_tm crhs_tm e [] 0))- addTrans (clhs_tm, crhs_tm)- addIBC (IBCTrans (clhs_tm, crhs_tm))- elabDecls :: ElabInfo -> [PDecl] -> Idris () elabDecls info ds = do mapM_ (elabDecl EAll info) ds @@ -285,6 +254,7 @@ = do iLOG $ "Elaborating type provider " ++ show n elabProvider info syn fc provWhat n elabDecl' what info (PTransform fc safety old new)- = elabTransform info fc safety old new+ = do elabTransform info fc safety old new+ return () elabDecl' _ _ _ = return () -- skipped this time
src/Idris/ElabQuasiquote.hs view
@@ -5,167 +5,170 @@ import Idris.AbsSyntax -extract1 :: (PTerm -> a) -> PTerm -> Elab' aux (a, [(Name, PTerm)])-extract1 c tm = do (tm', ex) <- extractUnquotes tm- return (c tm', ex)+extract1 :: Int -> (PTerm -> a) -> PTerm -> Elab' aux (a, [(Name, PTerm)])+extract1 n c tm = do (tm', ex) <- extractUnquotes n tm+ return (c tm', ex) -extract2 :: (PTerm -> PTerm -> a) -> PTerm -> PTerm -> Elab' aux (a, [(Name, PTerm)])-extract2 c a b = do (a', ex1) <- extractUnquotes a- (b', ex2) <- extractUnquotes b- return (c a' b', ex1 ++ ex2)+extract2 :: Int -> (PTerm -> PTerm -> a) -> PTerm -> PTerm -> Elab' aux (a, [(Name, PTerm)])+extract2 n c a b = do (a', ex1) <- extractUnquotes n a+ (b', ex2) <- extractUnquotes n b+ return (c a' b', ex1 ++ ex2) -extractTUnquotes :: PTactic -> Elab' aux (PTactic, [(Name, PTerm)])-extractTUnquotes (Rewrite t) = extract1 Rewrite t-extractTUnquotes (Induction t) = extract1 Induction t-extractTUnquotes (LetTac n t) = extract1 (LetTac n) t-extractTUnquotes (LetTacTy n t1 t2) = extract2 (LetTacTy n) t1 t2-extractTUnquotes (Exact tm) = extract1 Exact tm-extractTUnquotes (Try tac1 tac2)- = do (tac1', ex1) <- extractTUnquotes tac1- (tac2', ex2) <- extractTUnquotes tac2+extractTUnquotes :: Int -> PTactic -> Elab' aux (PTactic, [(Name, PTerm)])+extractTUnquotes n (Rewrite t) = extract1 n Rewrite t+extractTUnquotes n (Induction t) = extract1 n Induction t+extractTUnquotes n (LetTac name t) = extract1 n (LetTac name) t+extractTUnquotes n (LetTacTy name t1 t2) = extract2 n (LetTacTy name) t1 t2+extractTUnquotes n (Exact tm) = extract1 n Exact tm+extractTUnquotes n (Try tac1 tac2)+ = do (tac1', ex1) <- extractTUnquotes n tac1+ (tac2', ex2) <- extractTUnquotes n tac2 return (Try tac1' tac2', ex1 ++ ex2)-extractTUnquotes (TSeq tac1 tac2)- = do (tac1', ex1) <- extractTUnquotes tac1- (tac2', ex2) <- extractTUnquotes tac2+extractTUnquotes n (TSeq tac1 tac2)+ = do (tac1', ex1) <- extractTUnquotes n tac1+ (tac2', ex2) <- extractTUnquotes n tac2 return (TSeq tac1' tac2', ex1 ++ ex2)-extractTUnquotes (ApplyTactic t) = extract1 ApplyTactic t-extractTUnquotes (ByReflection t) = extract1 ByReflection t-extractTUnquotes (Reflect t) = extract1 Reflect t-extractTUnquotes (GoalType s tac)- = do (tac', ex) <- extractTUnquotes tac+extractTUnquotes n (ApplyTactic t) = extract1 n ApplyTactic t+extractTUnquotes n (ByReflection t) = extract1 n ByReflection t+extractTUnquotes n (Reflect t) = extract1 n Reflect t+extractTUnquotes n (GoalType s tac)+ = do (tac', ex) <- extractTUnquotes n tac return (GoalType s tac', ex)-extractTUnquotes (TCheck t) = extract1 TCheck t-extractTUnquotes (TEval t) = extract1 TEval t-extractTUnquotes tac = return (tac, []) -- the rest don't contain PTerms+extractTUnquotes n (TCheck t) = extract1 n TCheck t+extractTUnquotes n (TEval t) = extract1 n TEval t+extractTUnquotes n tac = return (tac, []) -- the rest don't contain PTerms -extractPArgUnquotes :: PArg -> Elab' aux (PArg, [(Name, PTerm)])-extractPArgUnquotes (PImp p m opts n t) =- do (t', ex) <- extractUnquotes t+extractPArgUnquotes :: Int -> PArg -> Elab' aux (PArg, [(Name, PTerm)])+extractPArgUnquotes d (PImp p m opts n t) =+ do (t', ex) <- extractUnquotes d t return (PImp p m opts n t', ex)-extractPArgUnquotes (PExp p opts n t) =- do (t', ex) <- extractUnquotes t+extractPArgUnquotes d (PExp p opts n t) =+ do (t', ex) <- extractUnquotes d t return (PExp p opts n t', ex)-extractPArgUnquotes (PConstraint p opts n t) =- do (t', ex) <- extractUnquotes t+extractPArgUnquotes d (PConstraint p opts n t) =+ do (t', ex) <- extractUnquotes d t return (PConstraint p opts n t', ex)-extractPArgUnquotes (PTacImplicit p opts n scpt t) =- do (scpt', ex1) <- extractUnquotes scpt- (t', ex2) <- extractUnquotes t+extractPArgUnquotes d (PTacImplicit p opts n scpt t) =+ do (scpt', ex1) <- extractUnquotes d scpt+ (t', ex2) <- extractUnquotes d t return (PTacImplicit p opts n scpt' t', ex1 ++ ex2) -extractDoUnquotes :: PDo -> Elab' aux (PDo, [(Name, PTerm)])-extractDoUnquotes (DoExp fc tm)- = do (tm', ex) <- extractUnquotes tm+extractDoUnquotes :: Int -> PDo -> Elab' aux (PDo, [(Name, PTerm)])+extractDoUnquotes d (DoExp fc tm)+ = do (tm', ex) <- extractUnquotes d tm return (DoExp fc tm', ex)-extractDoUnquotes (DoBind fc n tm)- = do (tm', ex) <- extractUnquotes tm+extractDoUnquotes d (DoBind fc n tm)+ = do (tm', ex) <- extractUnquotes d tm return (DoBind fc n tm', ex)-extractDoUnquotes (DoBindP fc t t' alts)+extractDoUnquotes d (DoBindP fc t t' alts) = fail "Pattern-matching binds cannot be quasiquoted"-extractDoUnquotes (DoLet fc n v b)- = do (v', ex1) <- extractUnquotes v- (b', ex2) <- extractUnquotes b+extractDoUnquotes d (DoLet fc n v b)+ = do (v', ex1) <- extractUnquotes d v+ (b', ex2) <- extractUnquotes d b return (DoLet fc n v' b', ex1 ++ ex2)-extractDoUnquotes (DoLetP fc t t') = fail "Pattern-matching lets cannot be quasiquoted"+extractDoUnquotes d (DoLetP fc t t') = fail "Pattern-matching lets cannot be quasiquoted" -extractUnquotes :: PTerm -> Elab' aux (PTerm, [(Name, PTerm)])-extractUnquotes (PLam n ty body)- = do (ty', ex1) <- extractUnquotes ty- (body', ex2) <- extractUnquotes body- return (PLam n ty' body', ex1 ++ ex2)-extractUnquotes (PPi plicity n ty body)- = do (ty', ex1) <- extractUnquotes ty- (body', ex2) <- extractUnquotes body- return (PPi plicity n ty' body', ex1 ++ ex2)-extractUnquotes (PLet n ty val body)- = do (ty', ex1) <- extractUnquotes ty- (val', ex2) <- extractUnquotes val- (body', ex3) <- extractUnquotes body- return (PLet n ty' val' body', ex1 ++ ex2 ++ ex3)-extractUnquotes (PTyped tm ty)- = do (tm', ex1) <- extractUnquotes tm- (ty', ex2) <- extractUnquotes ty+extractUnquotes :: Int -> PTerm -> Elab' aux (PTerm, [(Name, PTerm)])+extractUnquotes n (PLam name ty body)+ = do (ty', ex1) <- extractUnquotes n ty+ (body', ex2) <- extractUnquotes n body+ return (PLam name ty' body', ex1 ++ ex2)+extractUnquotes n (PPi plicity name ty body)+ = do (ty', ex1) <- extractUnquotes n ty+ (body', ex2) <- extractUnquotes n body+ return (PPi plicity name ty' body', ex1 ++ ex2)+extractUnquotes n (PLet name ty val body)+ = do (ty', ex1) <- extractUnquotes n ty+ (val', ex2) <- extractUnquotes n val+ (body', ex3) <- extractUnquotes n body+ return (PLet name ty' val' body', ex1 ++ ex2 ++ ex3)+extractUnquotes n (PTyped tm ty)+ = do (tm', ex1) <- extractUnquotes n tm+ (ty', ex2) <- extractUnquotes n ty return (PTyped tm' ty', ex1 ++ ex2)-extractUnquotes (PApp fc f args)- = do (f', ex1) <- extractUnquotes f- args' <- mapM extractPArgUnquotes args+extractUnquotes n (PApp fc f args)+ = do (f', ex1) <- extractUnquotes n f+ args' <- mapM (extractPArgUnquotes n) args let (args'', exs) = unzip args' return (PApp fc f' args'', ex1 ++ concat exs)-extractUnquotes (PAppBind fc f args)- = do (f', ex1) <- extractUnquotes f- args' <- mapM extractPArgUnquotes args+extractUnquotes n (PAppBind fc f args)+ = do (f', ex1) <- extractUnquotes n f+ args' <- mapM (extractPArgUnquotes n) args let (args'', exs) = unzip args' return (PAppBind fc f' args'', ex1 ++ concat exs)-extractUnquotes (PCase fc expr cases)- = do (expr', ex1) <- extractUnquotes expr+extractUnquotes n (PCase fc expr cases)+ = do (expr', ex1) <- extractUnquotes n expr let (pats, rhss) = unzip cases- (pats', exs1) <- fmap unzip $ mapM extractUnquotes pats- (rhss', exs2) <- fmap unzip $ mapM extractUnquotes rhss+ (pats', exs1) <- fmap unzip $ mapM (extractUnquotes n) pats+ (rhss', exs2) <- fmap unzip $ mapM (extractUnquotes n) rhss return (PCase fc expr' (zip pats' rhss'), ex1 ++ concat exs1 ++ concat exs2)-extractUnquotes (PRefl fc x)- = do (x', ex) <- extractUnquotes x+extractUnquotes n (PRefl fc x)+ = do (x', ex) <- extractUnquotes n x return (PRefl fc x', ex)-extractUnquotes (PEq fc at bt a b)- = do (at', ex1) <- extractUnquotes at- (bt', ex2) <- extractUnquotes bt- (a', ex1) <- extractUnquotes a- (b', ex2) <- extractUnquotes b+extractUnquotes n (PEq fc at bt a b)+ = do (at', ex1) <- extractUnquotes n at+ (bt', ex2) <- extractUnquotes n bt+ (a', ex1) <- extractUnquotes n a+ (b', ex2) <- extractUnquotes n b return (PEq fc at' bt' a' b', ex1 ++ ex2)-extractUnquotes (PRewrite fc x y z)- = do (x', ex1) <- extractUnquotes x- (y', ex2) <- extractUnquotes y+extractUnquotes n (PRewrite fc x y z)+ = do (x', ex1) <- extractUnquotes n x+ (y', ex2) <- extractUnquotes n y case z of- Just zz -> do (z', ex3) <- extractUnquotes zz+ 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 (PPair fc info l r)- = do (l', ex1) <- extractUnquotes l- (r', ex2) <- extractUnquotes r+extractUnquotes n (PPair fc info l r)+ = do (l', ex1) <- extractUnquotes n l+ (r', ex2) <- extractUnquotes n r return (PPair fc info l' r', ex1 ++ ex2)-extractUnquotes (PDPair fc info a b c)- = do (a', ex1) <- extractUnquotes a- (b', ex2) <- extractUnquotes b- (c', ex3) <- extractUnquotes c+extractUnquotes n (PDPair fc 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 (PAlternative b alts)- = do alts' <- mapM extractUnquotes alts+extractUnquotes n (PAlternative b alts)+ = do alts' <- mapM (extractUnquotes n) alts let (alts'', exs) = unzip alts' return (PAlternative b alts'', concat exs)-extractUnquotes (PHidden tm)- = do (tm', ex) <- extractUnquotes tm+extractUnquotes n (PHidden tm)+ = do (tm', ex) <- extractUnquotes n tm return (PHidden tm', ex)-extractUnquotes (PGoal fc a n b)- = do (a', ex1) <- extractUnquotes a- (b', ex2) <- extractUnquotes b- return (PGoal fc a' n b', ex1 ++ ex2)-extractUnquotes (PDoBlock steps)- = do steps' <- mapM extractDoUnquotes steps+extractUnquotes n (PGoal fc a name b)+ = do (a', ex1) <- extractUnquotes n a+ (b', ex2) <- extractUnquotes n b+ return (PGoal fc a' name b', ex1 ++ ex2)+extractUnquotes n (PDoBlock steps)+ = do steps' <- mapM (extractDoUnquotes n) steps let (steps'', exs) = unzip steps' return (PDoBlock steps'', concat exs)-extractUnquotes (PIdiom fc tm)- = fmap (\(tm', ex) -> (PIdiom fc tm', ex)) $ extractUnquotes tm-extractUnquotes (PProof tacs)- = do (tacs', exs) <- fmap unzip $ mapM extractTUnquotes tacs+extractUnquotes n (PIdiom fc tm)+ = fmap (\(tm', ex) -> (PIdiom fc tm', ex)) $ extractUnquotes n tm+extractUnquotes n (PProof tacs)+ = do (tacs', exs) <- fmap unzip $ mapM (extractTUnquotes n) tacs return (PProof tacs', concat exs)-extractUnquotes (PTactics tacs)- = do (tacs', exs) <- fmap unzip $ mapM extractTUnquotes tacs+extractUnquotes n (PTactics tacs)+ = do (tacs', exs) <- fmap unzip $ mapM (extractTUnquotes n) tacs return (PTactics tacs', concat exs)-extractUnquotes (PElabError err) = fail "Can't quasiquote an error"-extractUnquotes (PCoerced tm)- = do (tm', ex) <- extractUnquotes tm+extractUnquotes n (PElabError err) = fail "Can't quasiquote an error"+extractUnquotes n (PCoerced tm)+ = do (tm', ex) <- extractUnquotes n tm return (PCoerced tm', ex)-extractUnquotes (PDisamb ns tm)- = do (tm', ex) <- extractUnquotes tm+extractUnquotes n (PDisamb ns tm)+ = do (tm', ex) <- extractUnquotes n tm return (PDisamb ns tm', ex)-extractUnquotes (PUnifyLog tm)- = fmap (\(tm', ex) -> (PUnifyLog tm', ex)) $ extractUnquotes tm-extractUnquotes (PNoImplicits tm)- = fmap (\(tm', ex) -> (PNoImplicits tm', ex)) $ extractUnquotes tm-extractUnquotes (PQuasiquote _ _) = fail "Nested quasiquotes not supported"-extractUnquotes (PUnquote tm) =- do n <- getNameFrom (sMN 0 "unquotation")- return (PRef (fileFC "(unquote)") n, [(n, tm)])-extractUnquotes x = return (x, []) -- no subterms!+extractUnquotes n (PUnifyLog tm)+ = fmap (\(tm', ex) -> (PUnifyLog tm', ex)) $ extractUnquotes n tm+extractUnquotes n (PNoImplicits tm)+ = fmap (\(tm', ex) -> (PNoImplicits tm', ex)) $ extractUnquotes n tm+extractUnquotes n (PQuasiquote tm goal)+ = 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)])+ | otherwise = fmap (\(tm', ex) -> (PUnquote tm', ex)) $+ extractUnquotes (n-1) tm+extractUnquotes n x = return (x, []) -- no subterms!
src/Idris/ElabTerm.hs view
@@ -18,7 +18,7 @@ import Idris.ErrReverse (errReverse) import Idris.ElabQuasiquote (extractUnquotes) import Idris.Elab.Utils-import qualified Util.Pretty as U +import qualified Util.Pretty as U import Control.Applicative ((<$>)) import Control.Monad@@ -76,9 +76,9 @@ u <- getUnifyLog hs <- get_holes - when (not pattern) $ + when (not pattern) $ traceWhen u ("Remaining holes:\n" ++ show hs ++ "\n" ++- "Remaining problems:\n" ++ qshow probs) $ + "Remaining problems:\n" ++ qshow probs) $ do unify_all; matchProblems True; unifyProblems probs <- get_probs@@ -99,7 +99,7 @@ else return (tm, ds, is) where pattern = emode == ELHS tydecl = emode == ETyDecl- + mkPat = do hs <- get_holes tm <- get_term case hs of@@ -197,14 +197,14 @@ -- ++ "\nholes " ++ show hs -- ++ "\nproblems " ++ show ps -- ++ "\n-----------\n") $- --trace ("ELAB " ++ show t') $ + --trace ("ELAB " ++ show t') $ let fc = fileFC "Force" env <- get_env handleError (forceErr env) (elab' ina t') (elab' ina (PApp fc (PRef fc (sUN "Force")) [pimp (sUN "t") Placeholder True,- pimp (sUN "a") Placeholder True, + pimp (sUN "a") Placeholder True, pexp ct])) True forceErr env (CantUnify _ t t' _ _ _)@@ -240,14 +240,17 @@ elab' ina (PNoImplicits t) = elab' ina t -- skip elabE step elab' ina PType = do apply RType []; solve elab' ina (PUniverse u) = do apply (RUType u) []; solve--- elab' (_,_,inty) (PConstant c) +-- elab' (_,_,inty) (PConstant c) -- | constType c && pattern && not reflection && not inty--- = lift $ tfail (Msg "Typecase is not allowed") +-- = lift $ tfail (Msg "Typecase is not allowed") elab' ina (PConstant c) = do apply (RConstant c) []; solve elab' ina (PQuote r) = do fill r; solve- elab' ina (PTrue fc _) = try (elab' ina (PRef fc unitCon))- (elab' ina (PRef fc unitTy))- elab' ina (PFalse fc) = elab' ina (PRef fc falseTy)+ elab' ina (PTrue fc _) =+ do hnf_compute+ g <- goal+ case g of+ TType _ -> elab' ina (PRef fc unitTy)+ _ -> elab' ina (PRef fc unitCon) elab' ina (PResolveTC (FC "HACK" _ _)) -- for chasing parent classes = do g <- goal; resolveTC False 5 g fn ist elab' ina (PResolveTC fc)@@ -283,11 +286,11 @@ = do hnf_compute g <- goal case g of- TType _ -> elabE (True, a,inty, qq) (PApp fc (PRef fc pairTy)+ TType _ -> elab' ina (PApp fc (PRef fc pairTy) [pexp l,pexp r])- _ -> elabE (True, a, inty, qq) (PApp fc (PRef fc pairCon)- [pimp (sMN 0 "A") Placeholder True,- pimp (sMN 0 "B") Placeholder True,+ _ -> elab' ina (PApp fc (PRef fc pairCon)+ [pimp (sUN "A") Placeholder False,+ pimp (sUN "B") Placeholder False, pexp l, pexp r]) elab' ina (PDPair fc p l@(PRef _ n) t r) = case t of@@ -316,7 +319,9 @@ let (tc, _) = unApply ty env <- get_env let as' = pruneByType (map fst env) tc ctxt as--- trace (show as ++ "\n ==> " ++ showSep ", " (map showTmImpls as')) $+-- trace (-- show tc ++ " " ++ show as ++ "\n ==> " ++ +-- show (length as') ++ "\n" +++-- showSep ", " (map showTmImpls as') ++ "\nEND") $ tryAll (zip (map (elab' ina) as') (map showHd as')) where showHd (PApp _ (PRef _ n) _) = n showHd (PRef _ n) = n@@ -334,7 +339,7 @@ -- elab' (_, _, inty) (PRef fc f) -- | isTConName f (tt_ctxt ist) && pattern && not reflection && not inty -- = lift $ tfail (Msg "Typecase is not allowed")- elab' (ina, guarded, inty, qq) (PRef fc n) + elab' (ina, guarded, inty, qq) (PRef fc n) | (pattern || (bindfree && bindable n)) && not (inparamBlock n) && not qq = do ctxt <- get_context let defined = case lookupTy n ctxt of@@ -359,7 +364,7 @@ = do -- if n is a type constructor name, this makes no sense... ctxt <- get_context when (isTConName n ctxt) $- lift $ tfail (Msg $ "Can't use type constructor " ++ show n ++ " here") + lift $ tfail (Msg $ "Can't use type constructor " ++ show n ++ " here") checkPiGoal n attack; intro (Just n); -- trace ("------ intro " ++ show n ++ " ---- \n" ++ show ptm)@@ -369,7 +374,7 @@ -- if n is a type constructor name, this makes no sense... ctxt <- get_context when (isTConName n ctxt) $- lift $ tfail (Msg $ "Can't use type constructor " ++ show n ++ " here") + lift $ tfail (Msg $ "Can't use type constructor " ++ show n ++ " here") checkPiGoal n claim tyn RType explicit tyn@@ -496,9 +501,11 @@ _ -> lift $ tfail (NoSuchVariable fn) ns <- match_apply (Var fn') (map (\x -> (x,0)) imps) solve- elab' (_, _, inty, qq) (PApp fc (PRef _ f) args')- | isTConName f (tt_ctxt ist) && pattern && not reflection && not inty && not qq- = lift $ tfail (Msg "Typecase is not allowed")+ -- This isn't a sound way of checking for Typecase - we need a + -- better way!+-- elab' (_, _, inty, qq) (PApp fc (PRef _ f) args')+-- | isTConName f (tt_ctxt ist) && pattern && not reflection && not inty && not qq+-- = lift $ tfail (Msg "Typecase is not allowed") -- if f is local, just do a simple_app elab' (ina, g, inty, qq) tm@(PApp fc (PRef _ f) args) = do env <- get_env@@ -535,7 +542,7 @@ sortBy cmpArg (zip ns args) ulog <- getUnifyLog elabArgs ist (ina || not isinf, guarded, inty, qq)- [] fc False f ns' + [] fc False f ns' (f == sUN "Force") (map (\x -> getTm x) eargs) -- TODO: remove this False arg solve@@ -554,7 +561,7 @@ else movelast n) (ivs' \\ ivs) where -- normal < alternatives < lambdas < rewrites < tactic < default tactic- -- reason for lambdas after alternatives is that having + -- reason for lambdas after alternatives is that having -- the alternative resolved can help with typechecking the lambda -- or the rewrite. Rewrites/tactics need as much information -- as possible about the type.@@ -564,7 +571,7 @@ | constraint x && not (constraint y) = LT | constraint y && not (constraint x) = GT | otherwise- = compare (conDepth 0 (getTm x) + priority x + alt x) + = compare (conDepth 0 (getTm x) + priority x + alt x) (conDepth 0 (getTm y) + priority y + alt y) where alt t = case getTm t of PAlternative False _ -> 5@@ -577,14 +584,14 @@ constraint (PConstraint _ _ _ _) = True constraint _ = False- + -- Score a point for every level where there is a non-constructor -- function (so higher score --> done later) -- Only relevant when on lhs conDepth d t | not pattern = 0 conDepth d (PRef _ f) | isConName f (tt_ctxt ist) = 0 | otherwise = max (100 - d) 1- conDepth d (PApp _ f as) + conDepth d (PApp _ f as) = conDepth d f + sum (map (conDepth (d+1)) (map getTm as)) conDepth d (PPatvar _ _) = 0 conDepth d (PAlternative _ as) = maximum (map (conDepth d) as)@@ -598,7 +605,7 @@ Nothing -> return () Just b -> case unApply (binderTy b) of- (P _ c _, args) -> + (P _ c _, args) -> case lookupCtxt c (idris_classes ist) of [] -> return () _ -> -- type class, set as injective@@ -611,7 +618,7 @@ probs <- get_probs traceWhen ulog (qshow probs) $ return () _ -> return ()- + setinjArg (P _ n _) = setinj n setinjArg _ = return () @@ -630,7 +637,7 @@ solve elab' ina Placeholder = do (h : hs) <- get_holes movelast h- elab' ina (PMetavar n) = + elab' ina (PMetavar n) = do ptm <- get_term -- When building the metavar application, leave out the unique -- names which have been used elsewhere in the term, since we@@ -692,24 +699,13 @@ letbind scvn (Var tyn) (Var valn) focus valn elabE (True, a, inty, qq) scr+ -- Solve any remaining implicits - we need to solve as many+ -- as possible before making the 'case' type+ unifyProblems+ matchProblems True args <- get_env envU <- mapM (getKind args) args let namesUsedInRHS = nub $ scvn : concatMap (\(_,rhs) -> allNamesIn rhs) opts--- ++ allNamesIn scr- - -- in the definition we build for the case, only pass through- -- names which are directly used, type class constraints, and- -- variables any of these depend on- -- FIXME: This probably doesn't help us, but leaving it in- -- temporarily (but commented out). If this comment is still- -- here in master, please delete the code!--- let directUse = filter (\n -> usedIn namesUsedInRHS n--- || tcName (binderTy (snd n))) args--- let args' = args -- chaseDeps args (map fst directUse) directUse--- let argsDropped = map fst $--- filter (\(n, _) -> case lookup n args' of--- Nothing -> True--- _ -> False) args -- Drop the unique arguments used in the scrutinee (since it's -- not valid to use them again anyway)@@ -720,7 +716,7 @@ let cname' = mkN cname -- elab' ina (PMetavar cname') attack; defer argsDropped cname'; solve- + -- 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'@@ -744,10 +740,10 @@ Just u -> u _ -> False - getKind env (n, _) + getKind env (n, _) = case lookup n env of Nothing -> return (n, False) -- can't happen, actually...- Just b -> + Just b -> do ty <- get_type (forget (binderTy b)) case ty of UType UniqueType -> return (n, True)@@ -760,8 +756,8 @@ _ -> False tcName _ = False - usedIn ns (n, b) - = n `elem` ns + usedIn ns (n, b)+ = n `elem` ns || any (\x -> x `elem` ns) (allTTNames (binderTy b)) -- FIXME: This probably doesn't help us here, but leaving@@ -787,7 +783,7 @@ = do -- First extract the unquoted subterms, replacing them with fresh -- names in the quasiquoted term. Claim their reflections to be -- of type TT.- (t, unq) <- extractUnquotes t+ (t, unq) <- extractUnquotes 0 t let unquoteNames = map fst unq mapM_ (flip claim (Var tt)) unquoteNames @@ -868,7 +864,7 @@ isScr (PRef _ n) (n', b) = (n', (n == n', b)) isScr _ (n', b) = (n', (False, b)) - caseBlock :: FC -> Name -> + caseBlock :: FC -> Name -> [(Name, (Bool, Binder Term))] -> [(PTerm, PTerm)] -> [PClause] caseBlock fc n env opts = let args' = findScr env@@ -878,12 +874,12 @@ where -- Find the variable we want as the scrutinee and mark it as -- 'True'. If the scrutinee is in the environment, match on that -- otherwise match on the new argument we're adding.- findScr ((n, (True, t)) : xs) + findScr ((n, (True, t)) : xs) = (n, (True, t)) : scrName n xs- findScr [(n, (_, t))] = [(n, (True, t))] + findScr [(n, (_, t))] = [(n, (True, t))] findScr (x : xs) = x : findScr xs -- [] can't happen since scrutinee is in the environment!- + -- To make sure top level pattern name remains in scope, put -- it at the end of the environment scrName n [] = []@@ -927,7 +923,7 @@ _ -> return t where mkDelay env (PAlternative b xs) = PAlternative b (map (mkDelay env) xs)- mkDelay env t + mkDelay env t = let fc = fileFC "Delay" in addImplBound ist (map fst env) (PApp fc (PRef fc (sUN "Delay")) [pexp t])@@ -994,10 +990,10 @@ failed' <- -- trace (show (n, t, hs, tm)) $ -- traceWhen (not (null cs)) (show ty ++ "\n" ++ showImp True t) $ case holeName `elem` hs of- True -> do focus holeName; + True -> do focus holeName; g <- goal ulog <- getUnifyLog- traceWhen ulog ("Elaborating argument " ++ show (argName, holeName, g)) $ + traceWhen ulog ("Elaborating argument " ++ show (argName, holeName, g)) $ elab ina t; return failed False -> return failed done_elaborating_arg f argName@@ -1040,7 +1036,8 @@ -- 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 -> Context -> [PTerm] -> [PTerm]+pruneByType :: [Name] -> Term -> -- head of the goal+ Context -> [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]@@ -1053,10 +1050,10 @@ getName (PRef _ n) = Just n getName (PApp _ f _) = getName f getName _ = Nothing- -pruneByType env (P _ n _) c as++pruneByType env (P _ n _) ctxt as -- if the goal type is polymorphic, keep e- | [] <- lookupTy n c = as+ | [] <- lookupTy n ctxt = as | otherwise = let asV = filter (headIs True n) as as' = filter (headIs False n) as in@@ -1072,13 +1069,16 @@ headIs _ _ _ = True -- keep if it's not an application typeHead var f f'- = case lookupTy f' c of- [ty] -> let ty' = normalise c [] ty in- case unApply (getRetTy ty') of- (P _ ftyn _, _) -> ftyn == f- (V _, _) -> var -- keep, variable- _ -> False- _ -> False+ = -- trace ("Trying " ++ show f' ++ " for " ++ show n) $+ case lookupTy f' ctxt of+ [ty] -> case unApply (getRetTy ty) of+ (P _ ctyn _, _) | isConName ctyn ctxt -> ctyn == f+ _ -> let ty' = normalise ctxt [] ty in+ case unApply (getRetTy ty') of+ (P _ ftyn _, _) -> ftyn == f+ (V _, _) -> var -- keep, variable+ _ -> False+ _ -> False pruneByType _ t _ as = as @@ -1094,11 +1094,11 @@ = trivial (elab ist toplevel ERHS [] (sMN 0 "tac")) ist proofSearch' ist rec depth prv top n hints = do unifyProblems- proofSearch rec prv depth + proofSearch rec prv depth (elab ist toplevel ERHS [] (sMN 0 "tac")) top n hints ist resolveTC :: Bool -> Int -> Term -> Name -> IState -> ElabD ()-resolveTC = resTC' [] +resolveTC = resTC' [] resTC' tcs def 0 topg fn ist = fail $ "Can't resolve type class" resTC' tcs def 1 topg fn ist = try' (trivial' ist) (resolveTC def 0 topg fn ist) True@@ -1108,7 +1108,7 @@ ptm <- get_term ulog <- getUnifyLog hs <- get_holes- traceWhen ulog ("Resolving class " ++ show g) $ + traceWhen ulog ("Resolving class " ++ show g) $ try' (trivial' ist) (do t <- goal let (tc, ttypes) = unApply t@@ -1125,7 +1125,7 @@ -- HACK! Rather than giving a special name, better to have some kind -- of flag in ClassInfo structure- chaser (UN nm) + chaser (UN nm) | ('@':'@':_) <- str nm = True -- old way chaser (SN (ParentN _ _)) = True chaser (NS n _) = chaser n@@ -1169,7 +1169,7 @@ args <- map snd <$> try' (apply (Var n) imps) (match_apply (Var n) imps) True ps' <- get_probs- when (length ps < length ps' || unrecoverable ps') $ + 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@@ -1177,7 +1177,7 @@ let (tc', ttype) = unApply t' let got = fst (unApply t) let depth' = if tc' `elem` tcs- then depth - 1 else depth + then depth - 1 else depth resTC' (got : tcs) defaultOn 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@@ -1228,11 +1228,11 @@ -- if a tactic adds unification problems, return an error runTac :: Bool -> IState -> Name -> PTactic -> ElabD ()-runTac autoSolve ist fn tac +runTac autoSolve ist fn tac = do env <- get_env g <- goal let tac' = fmap (addImplBound ist (map fst env)) tac- if autoSolve + if autoSolve then runT tac' else no_errors (runT tac') (Just (CantSolveGoal g (map (\(n, b) -> (n, binderTy b)) env)))@@ -1394,11 +1394,11 @@ letbind scriptvar scriptTy (Var script) focus script ptm <- get_term- elab ist toplevel ERHS [] (sMN 0 "tac") + elab ist toplevel ERHS [] (sMN 0 "tac") (PApp emptyFC tm [pexp (delabTy' ist [] tgoal True True)]) (script', _) <- get_type_val (Var scriptvar) -- now that we have the script apply- -- it to the reflected goal + -- it to the reflected goal restac <- getNameFrom (sMN 0 "restac") claim restac tacticTy focus restac@@ -1478,7 +1478,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)] +reifyApp _ t [Constant (I i)] | t == reflm "Search" = return (ProofSearch True True i Nothing []) reifyApp _ t [x] | t == reflm "Refine" = do n <- reifyTTName x@@ -2219,4 +2219,3 @@ ] solveAll = try (do solve; solveAll) (return ())-
src/Idris/Erasure.hs view
@@ -201,7 +201,7 @@ -- these have been discovered as builtins but are not listed -- among Idris.Primitives.primitives- , mn "__MkPair" [2,3]+ --, mn "__MkPair" [2,3] , it "prim_fork" [0] , it "unsafePerformPrimIO" [1] @@ -342,14 +342,11 @@ -- sanity check: machine-generated names shouldn't occur at top-level | MN _ _ <- n- , n `notElem` specialMNs = error $ "erasure analysis: variable " ++ show n ++ " unbound in " ++ show (S.toList cd) -- assumed to be a global reference | otherwise = M.singleton cd (M.singleton (n, Result) S.empty)- where- specialMNs = map (sMN 0 . ("__" ++)) $ words "Unit True False II"- + -- dependencies of de bruijn variables are described in `bs' getDepsTerm vs bs cd (V i) = snd (bs !! i) cd @@ -361,8 +358,8 @@ -- let-bound variables can get partially evaluated -- it is sufficient just to plug the Cond in when the bound names are used- | Let ty t <- bdr = var t cd `union` getDepsTerm vs ((n, var t) : bs) cd body- | NLet ty t <- bdr = var t cd `union` getDepsTerm vs ((n, var t) : bs) cd body+ | Let ty t <- bdr = var t cd `union` getDepsTerm vs ((n, const M.empty) : bs) cd body+ | NLet ty t <- bdr = var t cd `union` getDepsTerm vs ((n, const M.empty) : bs) cd body where var t cd = getDepsTerm vs bs cd t
src/Idris/Error.hs view
@@ -99,7 +99,6 @@ warnDisamb ist (PCase _ tm cases) = warnDisamb ist tm >> mapM_ (\(x,y)-> warnDisamb ist x >> warnDisamb ist y) cases warnDisamb ist (PTrue _ _) = return ()-warnDisamb ist (PFalse _) = return () warnDisamb ist (PRefl _ tm) = warnDisamb ist tm warnDisamb ist (PResolveTC _) = return () warnDisamb ist (PEq _ a b x y) = warnDisamb ist a >> warnDisamb ist b >>
src/Idris/Help.hs view
@@ -4,6 +4,7 @@ | NameArg -- ^ The command takes a name | FileArg -- ^ The command takes a file | ModuleArg -- ^ The command takes a module name+ | NumberArg -- ^ The command takes a number | NamespaceArg -- ^ The command takes a namespace name | OptionArg -- ^ The command takes an option | MetaVarArg -- ^ The command takes a metavariable@@ -21,6 +22,7 @@ show NameArg = "<name>" show FileArg = "<filename>" show ModuleArg = "<module>"+ show NumberArg = "<number>" show NamespaceArg = "<namespace>" show OptionArg = "<option>" show MetaVarArg = "<metavar>"@@ -69,7 +71,9 @@ ([":q",":quit"], NoArg, "Exit the Idris system"), ([":w", ":warranty"], NoArg, "Displays warranty information"), ([":let"], ManyArgs DeclArg, "Evaluate a declaration, such as a function definition, instance implementation, or fixity declaration"),- ([":undefine",":unlet"], ManyArgs NameArg, "Remove the listed repl definitions, or all repl definitions if no names given")+ ([":undefine",":unlet"], ManyArgs NameArg, "Remove the listed repl definitions, or all repl definitions if no names given"),+ ([":printdef"], NameArg, "Show the definition of a function"),+ ([":pp", ":pprint"], (SeqArgs OptionArg (SeqArgs NumberArg NameArg)), "Pretty prints an Idris function in either LaTeX or HTML and for a specified width.") ] -- | Use these for completion, but don't show them in :help
src/Idris/IBC.hs view
@@ -10,7 +10,8 @@ import Idris.Imports import Idris.Error import Idris.Delaborate-import Idris.Docstrings+import qualified Idris.Docstrings as D+import Idris.Docstrings (Docstring) import Idris.Output import qualified Cheapskate.Types as CT@@ -31,7 +32,7 @@ import Util.Zlib (decompressEither) ibcVersion :: Word8-ibcVersion = 80+ibcVersion = 84 data IBCFile = IBCFile { ver :: Word8, sourcefile :: FilePath,@@ -60,8 +61,8 @@ ibc_fninfo :: [(Name, FnInfo)], ibc_cg :: [(Name, CGInfo)], ibc_defs :: [(Name, Def)],- ibc_docstrings :: [(Name, (Docstring, [(Name, Docstring)]))],- ibc_transforms :: [(Term, Term)],+ ibc_docstrings :: [(Name, (Docstring D.DocTerm, [(Name, Docstring D.DocTerm)]))],+ ibc_transforms :: [(Name, (Term, Term))], ibc_errRev :: [(Term, Term)], ibc_coercions :: [Name], ibc_lineapps :: [(FilePath, Int, PTerm)],@@ -124,29 +125,29 @@ ibc :: IState -> IBCWrite -> IBCFile -> Idris IBCFile ibc i (IBCFix d) f = return f { ibc_fixes = d : ibc_fixes f }-ibc i (IBCImp n) f = case lookupCtxt n (idris_implicits i) of- [v] -> return f { ibc_implicits = (n,v): ibc_implicits f }+ibc i (IBCImp n) f = case lookupCtxtExact n (idris_implicits i) of+ Just v -> return f { ibc_implicits = (n,v): ibc_implicits f } _ -> ifail "IBC write failed" ibc i (IBCStatic n) f- = case lookupCtxt n (idris_statics i) of- [v] -> return f { ibc_statics = (n,v): ibc_statics f }+ = case lookupCtxtExact n (idris_statics i) of+ Just v -> return f { ibc_statics = (n,v): ibc_statics f } _ -> ifail "IBC write failed" ibc i (IBCClass n) f- = case lookupCtxt n (idris_classes i) of- [v] -> return f { ibc_classes = (n,v): ibc_classes f }+ = case lookupCtxtExact n (idris_classes i) of+ Just v -> return f { ibc_classes = (n,v): ibc_classes f } _ -> ifail "IBC write failed" ibc i (IBCInstance int n ins) f = return f { ibc_instances = (int,n,ins): ibc_instances f } ibc i (IBCDSL n) f- = case lookupCtxt n (idris_dsls i) of- [v] -> return f { ibc_dsls = (n,v): ibc_dsls f }+ = case lookupCtxtExact n (idris_dsls i) of+ Just v -> return f { ibc_dsls = (n,v): ibc_dsls f } _ -> ifail "IBC write failed" ibc i (IBCData n) f- = case lookupCtxt n (idris_datatypes i) of- [v] -> return f { ibc_datatypes = (n,v): ibc_datatypes f }+ = case lookupCtxtExact n (idris_datatypes i) of+ Just v -> return f { ibc_datatypes = (n,v): ibc_datatypes f } _ -> ifail "IBC write failed"-ibc i (IBCOpt n) f = case lookupCtxt n (idris_optimisation i) of- [v] -> return f { ibc_optimise = (n,v): ibc_optimise f }+ibc i (IBCOpt n) f = case lookupCtxtExact n (idris_optimisation i) of+ Just v -> return f { ibc_optimise = (n,v): ibc_optimise f } _ -> ifail "IBC write failed" ibc i (IBCSyntax n) f = return f { ibc_syntax = n : ibc_syntax f } ibc i (IBCKeyword n) f = return f { ibc_keywords = n : ibc_keywords f }@@ -158,12 +159,12 @@ ibc i (IBCDyLib n) f = return f {ibc_dynamic_libs = n : ibc_dynamic_libs f } ibc i (IBCHeader tgt n) f = return f { ibc_hdrs = (tgt, n) : ibc_hdrs f } ibc i (IBCDef n) f - = do f' <- case lookupDef n (tt_ctxt i) of- [v] -> do (v', (f', _)) <- runStateT (updateDef v) (f, length (symbols f))- return f' { ibc_defs = (n,v) : ibc_defs f' }+ = do f' <- case lookupDefExact n (tt_ctxt i) of+ Just v -> do (v', (f', _)) <- runStateT (updateDef v) (f, length (symbols f))+ return f' { ibc_defs = (n,v) : ibc_defs f' } _ -> ifail "IBC write failed"- case lookupCtxt n (idris_patdefs i) of- [v] -> return f' { ibc_patdefs = (n,v) : ibc_patdefs f' }+ case lookupCtxtExact n (idris_patdefs i) of+ Just v -> return f' { ibc_patdefs = (n,v) : ibc_patdefs f' } _ -> return f' -- Not a pattern definition where updateDef :: Def -> StateT (IBCFile, Int) Idris Def@@ -220,18 +221,18 @@ update t = return t -ibc i (IBCDoc n) f = case lookupCtxt n (idris_docstrings i) of- [v] -> return f { ibc_docstrings = (n,v) : ibc_docstrings f }+ibc i (IBCDoc n) f = case lookupCtxtExact n (idris_docstrings i) of+ Just v -> return f { ibc_docstrings = (n,v) : ibc_docstrings f } _ -> ifail "IBC write failed"-ibc i (IBCCG n) f = case lookupCtxt n (idris_callgraph i) of- [v] -> return f { ibc_cg = (n,v) : ibc_cg f }+ibc i (IBCCG n) f = case lookupCtxtExact n (idris_callgraph i) of+ Just v -> return f { ibc_cg = (n,v) : ibc_cg f } _ -> ifail "IBC write failed" ibc i (IBCCoercion n) f = return f { ibc_coercions = n : ibc_coercions f } ibc i (IBCAccess n a) f = return f { ibc_access = (n,a) : ibc_access f } ibc i (IBCFlags n a) f = return f { ibc_flags = (n,a) : ibc_flags f } ibc i (IBCFnInfo n a) f = return f { ibc_fninfo = (n,a) : ibc_fninfo f } ibc i (IBCTotal n a) f = return f { ibc_total = (n,a) : ibc_total f }-ibc i (IBCTrans t) f = return f { ibc_transforms = t : ibc_transforms f }+ibc i (IBCTrans n t) f = return f { ibc_transforms = (n, t) : ibc_transforms f } ibc i (IBCErrRev t) f = return f { ibc_errRev = t : ibc_errRev f } ibc i (IBCLineApp fp l t) f = return f { ibc_lineapps = (fp,l,t) : ibc_lineapps f }@@ -336,8 +337,8 @@ pImps :: [(Name, [PArg])] -> Idris () pImps imps = mapM_ (\ (n, imp) -> do i <- getIState- case lookupDefAcc n False (tt_ctxt i) of- [(n, Hidden)] -> return ()+ case lookupDefAccExact n False (tt_ctxt i) of+ Just (n, Hidden) -> return () _ -> putIState (i { idris_implicits = addDef n imp (idris_implicits i) })) imps@@ -358,8 +359,8 @@ do i <- getIState -- Don't lose instances from previous IBCs, which -- could have loaded in any order- let is = case lookupCtxt n (idris_classes i) of- [CI _ _ _ _ _ ins] -> ins+ let is = case lookupCtxtExact n (idris_classes i) of+ Just (CI _ _ _ _ _ ins) -> ins _ -> [] let c' = c { class_instances = class_instances c ++ is }@@ -433,9 +434,10 @@ do let d' = updateDef d case d' of TyDecl _ _ -> return () - _ -> solveDeferred n + _ -> do iLOG $ "SOLVING " ++ show n+ solveDeferred n i <- getIState- logLvl 5 $ "Added " ++ show (n, d')+-- logLvl 1 $ "Added " ++ show (n, d') putIState (i { tt_ctxt = addCtxtDef n d' (tt_ctxt i) })) ds where updateDef (CaseOp c t args o s cd)@@ -457,7 +459,7 @@ update (Proj t i) = Proj (update t) i update t = t -pDocs :: [(Name, (Docstring, [(Name, Docstring)]))] -> Idris ()+pDocs :: [(Name, (Docstring D.DocTerm, [(Name, Docstring D.DocTerm)]))] -> Idris () pDocs ds = mapM_ (\ (n, a) -> addDocStr n (fst a) (snd a)) ds pAccess :: [(Name, Accessibility)] -> Idris ()@@ -488,8 +490,8 @@ pCoercions :: [Name] -> Idris () pCoercions ns = mapM_ (\ n -> addCoercion n) ns -pTrans :: [(Term, Term)] -> Idris ()-pTrans ts = mapM_ addTrans ts+pTrans :: [(Name, (Term, Term))] -> Idris ()+pTrans ts = mapM_ (\ (n, t) -> addTrans n t) ts pErrRev :: [(Term, Term)] -> Idris () pErrRev ts = mapM_ addErrRev ts@@ -520,13 +522,13 @@ putIState $ i { idris_metavars = Data.List.reverse ns ++ idris_metavars i } ------ For Cheapskate+----- For Cheapskate and docstrings -instance Binary CT.Doc where- put (CT.Doc opts lines) = do put opts ; put lines+instance Binary a => Binary (D.Docstring a) where+ put (D.DocString opts lines) = do put opts ; put lines get = do opts <- get lines <- get- return (CT.Doc opts lines)+ return (D.DocString opts lines) instance Binary CT.Options where put (CT.Options x1 x2 x3 x4) = do put x1 ; put x2 ; put x3 ; put x4@@ -536,50 +538,64 @@ x4 <- get return (CT.Options x1 x2 x3 x4) -instance Binary CT.Block where- put (CT.Para lines) = do putWord8 0 ; put lines- put (CT.Header i lines) = do putWord8 1 ; put i ; put lines- put (CT.Blockquote bs) = do putWord8 2 ; put bs- put (CT.List b t xs) = do putWord8 3 ; put b ; put t ; put xs- put (CT.CodeBlock attr txt) = do putWord8 4 ; put attr ; put txt- put (CT.HtmlBlock txt) = do putWord8 5 ; put txt- put CT.HRule = putWord8 6+instance Binary D.DocTerm where+ put D.Unchecked = putWord8 0+ put (D.Checked t) = putWord8 1 >> put t+ put (D.Example t) = putWord8 2 >> put t+ put (D.Failing e) = putWord8 3 >> put e+ get = do i <- getWord8 case i of- 0 -> fmap CT.Para get- 1 -> liftM2 CT.Header get get- 2 -> fmap CT.Blockquote get- 3 -> liftM3 CT.List get get get- 4 -> liftM2 CT.CodeBlock get get- 5 -> liftM CT.HtmlBlock get- 6 -> return CT.HRule+ 0 -> return D.Unchecked+ 1 -> fmap D.Checked get+ 2 -> fmap D.Example get+ 3 -> fmap D.Failing get+ _ -> error "Corrupted binary data for DocTerm" -instance Binary CT.Inline where- put (CT.Str txt) = do putWord8 0 ; put txt- put CT.Space = putWord8 1- put CT.SoftBreak = putWord8 2- put CT.LineBreak = putWord8 3- put (CT.Emph xs) = putWord8 4 >> put xs- put (CT.Strong xs) = putWord8 5 >> put xs- put (CT.Code xs) = putWord8 6 >> put xs- put (CT.Link a b c) = putWord8 7 >> put a >> put b >> put c- put (CT.Image a b c) = putWord8 8 >> put a >> put b >> put c- put (CT.Entity a) = putWord8 9 >> put a- put (CT.RawHtml x) = putWord8 10 >> put x+instance Binary a => Binary (D.Block a) where+ put (D.Para lines) = do putWord8 0 ; put lines+ put (D.Header i lines) = do putWord8 1 ; put i ; put lines+ put (D.Blockquote bs) = do putWord8 2 ; put bs+ put (D.List b t xs) = do putWord8 3 ; put b ; put t ; put xs+ put (D.CodeBlock attr txt src) = do putWord8 4 ; put attr ; put txt ; put src+ put (D.HtmlBlock txt) = do putWord8 5 ; put txt+ put D.HRule = putWord8 6 get = do i <- getWord8 case i of- 0 -> liftM CT.Str get- 1 -> return CT.Space- 2 -> return CT.SoftBreak- 3 -> return CT.LineBreak- 4 -> liftM CT.Emph get- 5 -> liftM CT.Strong get- 6 -> liftM CT.Code get- 7 -> liftM3 CT.Link get get get- 8 -> liftM3 CT.Image get get get- 9 -> liftM CT.Entity get- 10 -> liftM CT.RawHtml get+ 0 -> fmap D.Para get+ 1 -> liftM2 D.Header get get+ 2 -> fmap D.Blockquote get+ 3 -> liftM3 D.List get get get+ 4 -> liftM3 D.CodeBlock get get get+ 5 -> liftM D.HtmlBlock get+ 6 -> return D.HRule +instance Binary a => Binary (D.Inline a) where+ put (D.Str txt) = do putWord8 0 ; put txt+ put D.Space = putWord8 1+ put D.SoftBreak = putWord8 2+ put D.LineBreak = putWord8 3+ put (D.Emph xs) = putWord8 4 >> put xs+ put (D.Strong xs) = putWord8 5 >> put xs+ put (D.Code xs tm) = putWord8 6 >> put xs >> put tm+ put (D.Link a b c) = putWord8 7 >> put a >> put b >> put c+ put (D.Image a b c) = putWord8 8 >> put a >> put b >> put c+ put (D.Entity a) = putWord8 9 >> put a+ put (D.RawHtml x) = putWord8 10 >> put x+ get = do i <- getWord8+ case i of+ 0 -> liftM D.Str get+ 1 -> return D.Space+ 2 -> return D.SoftBreak+ 3 -> return D.LineBreak+ 4 -> liftM D.Emph get+ 5 -> liftM D.Strong get+ 6 -> liftM2 D.Code get get+ 7 -> liftM3 D.Link get get get+ 8 -> liftM3 D.Image get get get+ 9 -> liftM D.Entity get+ 10 -> liftM D.RawHtml get+ instance Binary CT.ListType where put (CT.Bullet c) = putWord8 0 >> put c put (CT.Numbered nw i) = putWord8 1 >> put nw >> put i@@ -1291,7 +1307,7 @@ x5 <- get x6 <- get x7 <- get- return (Syn x1 x2 x3 x4 id x5 x6 Nothing 0 x7 False)+ return (Syn x1 x2 x3 x4 id x5 x6 Nothing 0 x7 0) instance (Binary t) => Binary (PClause' t) where put x@@ -1433,8 +1449,6 @@ PTrue x1 x2 -> do putWord8 12 put x1 put x2- PFalse x1 -> do putWord8 13- put x1 PRefl x1 x2 -> do putWord8 14 put x1 put x2@@ -1551,8 +1565,6 @@ 12 -> do x1 <- get x2 <- get return (PTrue x1 x2)- 13 -> do x1 <- get- return (PFalse x1) 14 -> do x1 <- get x2 <- get return (PRefl x1 x2)
src/Idris/IdeSlave.hs view
@@ -1,3 +1,5 @@+{-# OPTIONS_GHC -fwarn-incomplete-patterns -Werror #-}+ {-# LANGUAGE FlexibleInstances, IncoherentInstances, PatternGuards #-} module Idris.IdeSlave(parseMessage, convSExp, IdeSlaveCommand(..), sexpToCommand, toSExp, SExp(..), SExpable, Opt(..), ideSlaveEpoch, getLen, getNChar) where@@ -145,6 +147,13 @@ ItalicText -> "italic" UnderlineText -> "underline" toSExp (AnnTerm bnd tm) = toSExp [(SymbolAtom "tt-term", StringAtom (encodeTerm bnd tm))]+ toSExp (AnnSearchResult ordr) = toSExp [(SymbolAtom "doc-overview",+ StringAtom ("Result type is " ++ descr))]+ where descr = case ordr of+ EQ -> "isomorphic"+ LT -> "more general than searched type"+ GT -> "more specific than searched type"+ toSExp (AnnErr e) = toSExp [(SymbolAtom "error", StringAtom (encodeErr e))] encodeTerm :: [(Name, Bool)] -> Term -> String encodeTerm bnd tm = UTF8.toString . Base64.encode . Lazy.toStrict . Binary.encode $@@ -153,6 +162,12 @@ decodeTerm :: String -> ([(Name, Bool)], Term) decodeTerm = Binary.decode . Lazy.fromStrict . Base64.decodeLenient . UTF8.fromString +encodeErr :: Err -> String+encodeErr e = UTF8.toString . Base64.encode . Lazy.toStrict . Binary.encode $ e++decodeErr :: String -> Err+decodeErr = Binary.decode . Lazy.fromStrict . Base64.decodeLenient . UTF8.fromString+ instance SExpable FC where toSExp (FC f (sl, sc) (el, ec)) = toSExp ((SymbolAtom "filename", StringAtom f),@@ -212,6 +227,9 @@ | TermNormalise [(Name, Bool)] Term | TermShowImplicits [(Name, Bool)] Term | TermNoImplicits [(Name, Bool)] Term+ | PrintDef String+ | ErrString Err+ | ErrPPrint Err sexpToCommand :: SExp -> Maybe IdeSlaveCommand sexpToCommand (SexpList (x:[])) = sexpToCommand x@@ -244,7 +262,7 @@ sexpToCommand (SymbolAtom "get-options") = Just GetOpts sexpToCommand (SexpList [SymbolAtom "set-option", SymbolAtom s, BoolAtom b]) | Just opt <- lookup s opts = Just (SetOpt opt b)- where opts = [("show-implicits", ShowImpl), ("error-context", ErrContext)] --TODO support more+ where opts = [("show-implicits", ShowImpl), ("error-context", ErrContext)] --TODO support more options. Issue #1611 in the Issue tracker. https://github.com/idris-lang/Idris-dev/issues/1611 sexpToCommand (SexpList [SymbolAtom "metavariables", IntegerAtom cols]) = Just (Metavariables (fromIntegral cols)) sexpToCommand (SexpList [SymbolAtom "who-calls", StringAtom name]) = Just (WhoCalls name) sexpToCommand (SexpList [SymbolAtom "calls-who", StringAtom name]) = Just (CallsWho name)@@ -254,6 +272,9 @@ Just (TermShowImplicits bnd tm) sexpToCommand (SexpList [SymbolAtom "hide-term-implicits", StringAtom encoded]) = let (bnd, tm) = decodeTerm encoded in Just (TermNoImplicits bnd tm)+sexpToCommand (SexpList [SymbolAtom "print-definition", StringAtom name]) = Just (PrintDef name)+sexpToCommand (SexpList [SymbolAtom "error-string", StringAtom encoded]) = Just . ErrString . decodeErr $ encoded+sexpToCommand (SexpList [SymbolAtom "error-pprint", StringAtom encoded]) = Just . ErrPPrint . decodeErr $ encoded sexpToCommand _ = Nothing parseMessage :: String -> Either Err (SExp, Integer)
src/Idris/IdrisDoc.hs view
@@ -13,6 +13,7 @@ import Idris.AbsSyntax import Idris.Docs import Idris.Docstrings (nullDocstring)+import qualified Idris.Docstrings as Docstrings import IRTS.System (getDataFileName) @@ -37,7 +38,6 @@ import System.FilePath import System.Directory -import Cheapskate.Html (renderDoc) import Text.PrettyPrint.Annotated.Leijen (displayDecorated, renderCompact) import Text.Blaze (toValue, contents)@@ -496,7 +496,7 @@ docExtractor (_, _, _, Nothing) = Nothing docExtractor (n, _, _, Just d) = Just (n, doc2Str d) -- TODO: Remove <p> tags more robustly- doc2Str d = let dirty = renderMarkup $ contents $ renderDoc $ d+ doc2Str d = let dirty = renderMarkup $ contents $ Docstrings.renderHtml $ d in take (length dirty - 8) $ drop 3 dirty name (NS n ns) = show (NS (sUN $ name n) ns)@@ -523,7 +523,7 @@ createFunDoc ist fd@(FD name docstring args ftype fixity) = do H.dt ! (A.id $ toValue $ show name) $ genTypeHeader ist fd H.dd $ do- (if nullDocstring docstring then Empty else renderDoc docstring)+ (if nullDocstring docstring then Empty else Docstrings.renderHtml docstring) let args' = filter (\(_, _, _, d) -> isJust d) args if (not $ null args') || (isJust fixity) then H.dl $ do@@ -546,7 +546,7 @@ genArg (_, _, _, Nothing) = Empty genArg (name, _, _, Just docstring) = do H.dt $ toHtml $ show name- H.dd $ renderDoc docstring+ H.dd $ Docstrings.renderHtml docstring -- | Generates HTML documentation for any Docs type@@ -564,7 +564,7 @@ $ toHtml $ name $ nsroot n H.span ! class_ "signature" $ nbsp H.dd $ do- (if nullDocstring docstring then Empty else renderDoc docstring)+ (if nullDocstring docstring then Empty else Docstrings.renderHtml docstring) H.dl ! class_ "decls" $ forM_ fds (createFunDoc ist) where name (NS n ns) = show (NS (sUN $ name n) ns)@@ -578,7 +578,7 @@ H.span ! class_ "word" $ do "data"; nbsp genTypeHeader ist fd H.dd $ do- (if nullDocstring docstring then Empty else renderDoc docstring)+ (if nullDocstring docstring then Empty else Docstrings.renderHtml docstring) let args' = filter (\(_, _, _, d) -> isJust d) args if not $ null args' then H.dl $ forM_ args' genArg@@ -588,7 +588,7 @@ where genArg (_, _, _, Nothing) = Empty genArg (name, _, _, Just docstring) = do H.dt $ toHtml $ show name- H.dd $ renderDoc docstring+ H.dd $ Docstrings.renderHtml docstring -- | Generates everything but the actual content of the page
src/Idris/Interactive.hs view
@@ -188,7 +188,7 @@ pprintPTerm defaultPPOption [] [] (idris_infixes i) (stripNS (dropCtxt envlen- (delab i (specialise ctxt [] [(mn, 1)] tm)))))+ (delab i (fst (specialise ctxt [] [(mn, 1)] tm)))))) (\e -> return ("?" ++ show n)) if updatefile then do let fb = fn ++ "~"
src/Idris/Output.hs view
@@ -1,7 +1,9 @@+{-# OPTIONS_GHC -fwarn-incomplete-patterns -Werror #-}+ module Idris.Output where import Idris.Core.TT-import Idris.Core.Evaluate (isDConName, isTConName, isFnName)+import Idris.Core.Evaluate (isDConName, isTConName, isFnName, normaliseAll) import Idris.AbsSyntax import Idris.Delaborate@@ -13,10 +15,12 @@ import Debug.Trace +import Control.Monad.Error (throwError)+ import System.IO (stdout, Handle, hPutStrLn) import Data.Char (isAlpha)-import Data.List (nub)+import Data.List (nub, intersperse) import Data.Maybe (fromMaybe) pshow :: IState -> Err -> String@@ -68,7 +72,7 @@ iPrintTermWithType tm ty = iRenderResult (tm <+> colon <+> align ty) -- | Pretty-print a collection of overloadings to REPL or IDESlave - corresponds to :t name-iPrintFunTypes :: [(Name, Bool)] -> Name -> [(Name, PTerm)] -> Idris ()+iPrintFunTypes :: [(Name, Bool)] -> Name -> [(Name, Doc OutputAnnotation)] -> Idris () iPrintFunTypes bnd n [] = iPrintError $ "No such variable " ++ show n iPrintFunTypes bnd n overloads = do ist <- getIState let ppo = ppOptionIst ist@@ -77,7 +81,7 @@ iRenderResult output where fullName n = prettyName True True bnd n ppOverload ppo infixes n tm =- fullName n <+> colon <+> align (pprintPTerm ppo bnd [] infixes tm)+ fullName n <+> colon <+> align tm iRenderOutput :: Doc OutputAnnotation -> Idris () iRenderOutput doc =@@ -170,3 +174,120 @@ printUndefinedNames ns = text "Undefined " <> names <> text "." where names = encloseSep empty empty (char ',') $ map ppName ns ppName = prettyName True True []+++prettyDocumentedIst :: IState+ -> (Name, PTerm, Maybe (Docstring DocTerm))+ -> Doc OutputAnnotation+prettyDocumentedIst ist (name, ty, docs) =+ prettyName True True [] name <+> colon <+> align (prettyIst ist ty) <$>+ fromMaybe empty (fmap (\d -> renderDocstring (renderDocTerm ppTm norm) d <> line) docs)+ where ppTm = pprintDelab ist+ norm = normaliseAll (tt_ctxt ist) []+++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."+ | otherwise =+ do ist <- getIState+ return . wrap fmt .+ displayDecorated (decorate fmt) .+ renderPretty 1.0 width .+ fmap (fancifyAnnots ist) $+ doc+ where+ decorate _ (AnnFC _) = id++ decorate HTMLOutput (AnnName _ (Just TypeOutput) d _) =+ tag "idris-type" d+ decorate HTMLOutput (AnnName _ (Just FunOutput) d _) =+ tag "idris-function" d+ decorate HTMLOutput (AnnName _ (Just DataOutput) d _) =+ tag "idris-data" d+ decorate HTMLOutput (AnnName _ (Just MetavarOutput) d _) =+ tag "idris-metavar" d+ decorate HTMLOutput (AnnName _ (Just PostulateOutput) d _) =+ tag "idris-postulate" d+ decorate HTMLOutput (AnnName _ _ _ _) = id+ decorate HTMLOutput (AnnBoundName _ True) = tag "idris-bound idris-implicit" Nothing+ decorate HTMLOutput (AnnBoundName _ False) = tag "idris-bound" Nothing+ decorate HTMLOutput (AnnConst c) =+ tag (if constIsType c then "idris-type" else "idris-data")+ (Just $ constDocs c)+ decorate HTMLOutput (AnnData _ _) = tag "idris-data" Nothing+ decorate HTMLOutput (AnnType _ _) = tag "idris-type" Nothing+ decorate HTMLOutput AnnKeyword = tag "idris-keyword" Nothing+ decorate HTMLOutput (AnnTextFmt fmt) =+ case fmt of+ BoldText -> mkTag "strong"+ ItalicText -> mkTag "em"+ UnderlineText -> tag "idris-underlined" Nothing+ where mkTag t x = "<"++t++">"++x++"</"++t++">"+ decorate HTMLOutput (AnnTerm _ _) = id+ decorate HTMLOutput (AnnSearchResult _) = id+ decorate HTMLOutput (AnnErr _) = id++ decorate LaTeXOutput (AnnName _ (Just TypeOutput) _ _) =+ latex "IdrisType"+ decorate LaTeXOutput (AnnName _ (Just FunOutput) _ _) =+ latex "IdrisFunction"+ decorate LaTeXOutput (AnnName _ (Just DataOutput) _ _) =+ latex "IdrisData"+ decorate LaTeXOutput (AnnName _ (Just MetavarOutput) _ _) =+ latex "IdrisMetavar"+ decorate LaTeXOutput (AnnName _ (Just PostulateOutput) _ _) =+ latex "IdrisPostulate"+ decorate LaTeXOutput (AnnName _ _ _ _) = id+ decorate LaTeXOutput (AnnBoundName _ True) = latex "IdrisImplicit"+ decorate LaTeXOutput (AnnBoundName _ False) = latex "IdrisBound"+ decorate LaTeXOutput (AnnConst c) =+ latex $ if constIsType c then "IdrisType" else "IdrisData"+ decorate LaTeXOutput (AnnData _ _) = latex "IdrisData"+ decorate LaTeXOutput (AnnType _ _) = latex "IdrisType"+ decorate LaTeXOutput AnnKeyword = latex "IdrisKeyword"+ decorate LaTeXOutput (AnnTextFmt fmt) =+ case fmt of+ BoldText -> latex "textbf"+ ItalicText -> latex "emph"+ UnderlineText -> latex "underline"+ decorate LaTeXOutput (AnnTerm _ _) = id+ decorate LaTeXOutput (AnnSearchResult _) = id+ decorate LaTeXOutput (AnnErr _) = id++ tag cls docs str = "<span class=\""++cls++"\""++title++">" ++ str ++ "</span>"+ where title = maybe "" (\d->" title=\"" ++ d ++ "\"") docs++ latex cmd str = "\\"++cmd++"{"++str++"}"++ wrap HTMLOutput str =+ "<!doctype html><html><head><style>" ++ css ++ "</style></head>" +++ "<body><!-- START CODE --><pre>" ++ str ++ "</pre><!-- END CODE --></body></html>"+ where css = concat . intersperse "\n" $+ [".idris-data { color: red; } ",+ ".idris-type { color: blue; }",+ ".idris-function {color: green; }",+ ".idris-keyword { font-weight: bold; }",+ ".idris-bound { color: purple; }",+ ".idris-implicit { font-style: italic; }",+ ".idris-underlined { text-decoration: underline; }"]+ wrap LaTeXOutput str =+ concat . intersperse "\n" $+ ["\\documentclass{article}",+ "\\usepackage{fancyvrb}",+ "\\usepackage[usenames]{xcolor}"] +++ map (\(cmd, color) ->+ "\\newcommand{\\"++ cmd +++ "}[1]{\\textcolor{"++ color ++"}{#1}}")+ [("IdrisData", "red"), ("IdrisType", "blue"),+ ("IdrisBound", "magenta"), ("IdrisFunction", "green")] +++ ["\\newcommand{\\IdrisKeyword}[1]{{\\underline{#1}}}",+ "\\newcommand{\\IdrisImplicit}[1]{{\\itshape \\IdrisBound{#1}}}",+ "\n",+ "\\begin{document}",+ "% START CODE",+ "\\begin{Verbatim}[commandchars=\\\\\\{\\}]",+ str,+ "\\end{Verbatim}",+ "% END CODE",+ "\\end{document}"]
src/Idris/ParseData.hs view
@@ -4,7 +4,7 @@ import Prelude hiding (pi) import Text.Trifecta.Delta-import Text.Trifecta hiding (span, stringLiteral, charLiteral, natural, symbol, char, string, whiteSpace)+import Text.Trifecta hiding (span, stringLiteral, charLiteral, natural, symbol, char, string, whiteSpace, Err) import Text.Parser.LookAhead import Text.Parser.Expression import qualified Text.Parser.Token as Tok@@ -42,25 +42,29 @@ DocComment Accessibility? 'record' FnName TypeSig 'where' OpenBlock Constructor KeepTerminator CloseBlock; -} record :: SyntaxInfo -> IdrisParser PDecl-record syn = do (doc, acc, opts) <- try (do- doc <- option noDocs docComment+record syn = do (doc, argDocs, acc, opts) <- try (do+ (doc, argDocs) <- option noDocs docComment+ ist <- get+ let doc' = annotCode (tryFullExpr syn ist) doc+ argDocs' = [ (n, annotCode (tryFullExpr syn ist) d)+ | (n, d) <- argDocs ] acc <- optional accessibility opts <- dataOpts [] reserved "record"- return (doc, acc, opts))+ return (doc', argDocs', acc, opts)) fc <- getFC tyn_in <- fnName lchar ':' ty <- typeExpr (allowImp syn) let tyn = expandNS syn tyn_in reserved "where"- (cdoc, argDocs, cn, cty, _, _) <- indentedBlockS (constructor syn)+ (cdoc, cargDocs, cn, cty, _, _) <- indentedBlockS (constructor syn) accData acc tyn [cn] let rsyn = syn { syn_namespace = show (nsroot tyn) : syn_namespace syn } let fns = getRecNames rsyn cty mapM_ (\n -> addAcc n acc) fns- return $ PRecord (fst doc) rsyn fc tyn ty opts cdoc cn cty+ return $ PRecord doc rsyn fc tyn ty opts cdoc cn cty <?> "record type declaration" where getRecNames :: SyntaxInfo -> PTerm -> [Name]@@ -112,8 +116,12 @@ acc <- optional accessibility elim <- dataOpts [] co <- dataI- let dataOpts = combineDataOpts(elim ++ co)- return (doc, argDocs, acc, dataOpts))+ ist <- get+ let dataOpts = combineDataOpts (elim ++ co)+ doc' = annotCode (tryFullExpr syn ist) doc+ argDocs' = [ (n, annotCode (tryFullExpr syn ist) d)+ | (n, d) <- argDocs ]+ return (doc', argDocs', acc, dataOpts)) fc <- getFC tyn_in <- fnName (do try (lchar ':')@@ -164,35 +172,39 @@ {- | Parses a type constructor declaration Constructor ::= DocComment? FnName TypeSig; -}-constructor :: SyntaxInfo -> IdrisParser (Docstring, [(Name, Docstring)], Name, PTerm, FC, [Name])+constructor :: SyntaxInfo -> IdrisParser (Docstring (Either Err PTerm), [(Name, Docstring (Either Err PTerm))], Name, PTerm, FC, [Name]) constructor syn = do (doc, argDocs) <- option noDocs docComment cn_in <- fnName; fc <- getFC let cn = expandNS syn cn_in lchar ':'- -- FIXME: 'forcenames' is an almighty hack! Need a better way of- -- erasing non-forceable things fs <- option [] (do lchar '%'; reserved "erase" sepBy1 name (lchar ',')) ty <- typeExpr (allowImp syn)- return (doc, argDocs, cn, ty, fc, fs)+ ist <- get+ let doc' = annotCode (tryFullExpr syn ist) doc+ argDocs' = [ (n, annotCode (tryFullExpr syn ist) d)+ | (n, d) <- argDocs ]+ return (doc', argDocs', cn, ty, fc, fs) <?> "constructor" -{- | Parses a constructor for simple discriminative union data types+{- | Parses a constructor for simple discriminated union data types SimpleConstructor ::= FnName SimpleExpr* DocComment? -}-simpleConstructor :: SyntaxInfo -> IdrisParser (Docstring, [(Name, Docstring)], Name, [PTerm], FC, [Name])+simpleConstructor :: SyntaxInfo -> IdrisParser (Docstring (Either Err PTerm), [(Name, Docstring (Either Err PTerm))], Name, [PTerm], FC, [Name]) simpleConstructor syn- = do doc <- option noDocs (try docComment)+ = do (doc, _) <- option noDocs (try docComment)+ ist <- get+ let doc' = annotCode (tryFullExpr syn ist) doc cn_in <- fnName let cn = expandNS syn cn_in fc <- getFC args <- many (do notEndApp simpleExpr syn)- return (fst doc, [], cn, args, fc, [])+ return (doc', [], cn, args, fc, []) <?> "constructor" -{- | Parses a dsl block declaration+{- | Parses a dsl block declaration DSL ::= 'dsl' FnName OpenBlock Overload'+ CloseBlock; -} dsl :: SyntaxInfo -> IdrisParser PDecl@@ -221,6 +233,11 @@ {- | Checks DSL for errors -} -- FIXME: currently does nothing, check if DSL is really sane+--+-- Issue #1595 on the Issue Tracker+--+-- https://github.com/idris-lang/Idris-dev/issues/1595+-- checkDSL :: DSL -> IdrisParser () checkDSL dsl = return () @@ -239,5 +256,3 @@ return (o, t) <?> "dsl overload declaratioN" where overloadable = ["let","lambda","pi","index_first","index_next","variable"]--
src/Idris/ParseExpr.hs view
@@ -5,7 +5,7 @@ import Prelude hiding (pi) import Text.Trifecta.Delta-import Text.Trifecta hiding (span, stringLiteral, charLiteral, natural, symbol, char, string, whiteSpace)+import Text.Trifecta hiding (span, stringLiteral, charLiteral, natural, symbol, char, string, whiteSpace, Err) import Text.Parser.LookAhead import Text.Parser.Expression import qualified Text.Parser.Token as Tok@@ -53,6 +53,11 @@ i <- get return $ debindApp syn (desugar syn i x) +tryFullExpr :: SyntaxInfo -> IState -> String -> Either Err PTerm+tryFullExpr syn st input =+ case runparser (fullExpr syn) st "" input of+ Success tm -> Right tm+ Failure e -> Left (Msg (show e)) {- | Parses an expression @@@ -278,7 +283,7 @@ {- External (User-defined) Simple Expression -} | '?' Name | % 'instance'- | 'refl' ('{' Expr '}')?+ | 'Refl' ('{' Expr '}')? | ProofExpr | TacticsExpr | FnName@@ -288,7 +293,7 @@ | Bracketed | Constant | Type- | '_|_'+ | 'Void' | Quasiquote | Unquote | '_'@@ -300,7 +305,7 @@ try (simpleExternalExpr syn) <|> do x <- try (lchar '?' *> name); return (PMetavar x) <|> do lchar '%'; fc <- getFC; reserved "instance"; return (PResolveTC fc)- <|> do reserved "refl"; fc <- getFC;+ <|> do reserved "Refl"; fc <- getFC; tm <- option Placeholder (do lchar '{'; t <- expr syn; lchar '}'; return t) return (PRefl fc tm)@@ -328,9 +333,6 @@ fc <- getFC return (PAppBind fc s []) <|> bracketed (disallowImp syn)- <|> do symbol "_|_"- fc <- getFC- return (PFalse fc) <|> quasiquote syn <|> unquote syn <|> do lchar '_'; return Placeholder@@ -600,9 +602,9 @@ -} quasiquote :: SyntaxInfo -> IdrisParser PTerm-quasiquote syn = do guard (not (syn_in_quasiquote syn))- symbol "`("- e <- expr syn { syn_in_quasiquote = True , inPattern = False}+quasiquote syn = do symbol "`("+ 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@@ -616,9 +618,9 @@ -} unquote :: SyntaxInfo -> IdrisParser PTerm-unquote syn = do guard (syn_in_quasiquote syn)+unquote syn = do guard (syn_in_quasiquote syn > 0) symbol "~"- e <- simpleExpr syn { syn_in_quasiquote = False }+ e <- simpleExpr syn { syn_in_quasiquote = syn_in_quasiquote syn - 1 } return $ PUnquote e <?> "unquotation" @@ -716,7 +718,8 @@ typeExpr :: SyntaxInfo -> IdrisParser PTerm typeExpr syn = do cs <- if implicitAllowed syn then constraintList syn else return [] sc <- expr syn- return (bindList (PPi constraint) (map (\x -> (sMN 0 "constrarg", x)) cs) sc)+ return (bindList (PPi constraint)+ (map (\x -> (sMN 0 "constrarg", x)) cs) sc) <?> "type signature" {- | Parses a lambda expression@@ -1018,7 +1021,7 @@ doBlock :: SyntaxInfo -> IdrisParser PTerm doBlock syn = do reserved "do"- ds <- indentedBlock (do_ syn)+ ds <- indentedBlock1 (do_ syn) return (PDoBlock ds) <?> "do block" @@ -1302,7 +1305,7 @@ return (TDocStr (Right c))) <|> try (do reserved "doc" whiteSpace- n <- (fnName <|> (string "_|_" >> return falseTy))+ n <- fnName eof return (TDocStr (Left n))) <|> try (do reserved "search"@@ -1325,3 +1328,4 @@ fullTactic syn = do t <- tactic syn eof return t+
src/Idris/ParseHelpers.hs view
@@ -51,6 +51,7 @@ someSpace = many (simpleWhiteSpace <|> singleLineComment <|> multiLineComment) *> pure () token p = do s <- get (FC fn (sl, sc) _) <- getFC --TODO: Update after fixing getFC+ -- See Issue #1594 r <- p (FC fn _ (el, ec)) <- getFC whiteSpace@@ -146,14 +147,14 @@ startEnd :: String startEnd = "{}-" -{-| Parses a documentation comment (similar to haddoc) given a marker character+{-| Parses a documentation comment (similar to haddock) given a marker character @ DocComment_t ::= '|||' ~EOL_t* EOL_t ; @ -}-docComment :: IdrisParser (Docstring, [(Name, Docstring)])+docComment :: IdrisParser (Docstring (), [(Name, Docstring ())]) docComment = do dc <- pushIndent *> docCommentLine rest <- many (indented docCommentLine) args <- many $ do (name, first) <- indented argDocCommentLine@@ -316,7 +317,7 @@ -- | Parses an operator operator :: MonadicParsing m => m String operator = do op <- token . some $ operatorLetter- when (op `elem` [":", "=>", "->", "<-", "=", "?=", "|"]) $ + when (op `elem` [":", "=>", "->", "<-", "=", "?=", "|"]) $ fail $ op ++ " is not a valid operator" return op @@ -343,6 +344,8 @@ let (dir, file) = splitFileName (fileName s) let f = if dir == addTrailingPathSeparator "." then file else fileName s return $ FC f (lineNum s, columnNum s) (lineNum s, columnNum s) -- TODO: Change to actual spanning+ -- Issue #1594 on the Issue Tracker.+ -- https://github.com/idris-lang/Idris-dev/issues/1594 {-* Syntax helpers-} -- | Bind constraints to term@@ -574,4 +577,3 @@ = PInstance f s cs n ps t en (collect ds) : collect ds' collect (d : ds) = d : collect ds collect [] = []-
src/Idris/ParseOps.hs view
@@ -33,12 +33,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 "-"))- [pexp (PApp fc (PRef fc (sUN "fromInteger")) [pexp (PConstant (BI 0))]), pexp x])]]- ++ toTable (reverse fixes) ++- [[backtick],- [binary "$" (\fc x y -> flatten $ PApp fc x [pexp y]) AssocRight],- [binary "=" (\fc x y -> PEq fc Placeholder Placeholder x y) AssocLeft]]+ = [[prefix "-" (\fc x -> PApp fc (PRef fc (sUN "negate")) [pexp x])]] +++ toTable (reverse fixes) +++ [[backtick],+ [binary "$" (\fc x y -> flatten $ PApp fc x [pexp y]) AssocRight],+ [binary "=" (\fc x y -> PEq fc Placeholder Placeholder x y) AssocLeft]] where flatten :: PTerm -> PTerm -- flatten application flatten (PApp fc (PApp _ f as) bs) = flatten (PApp fc f (as ++ bs))
src/Idris/Parser.hs view
@@ -37,7 +37,7 @@ import Idris.ParseExpr import Idris.ParseData -import Idris.Docstrings+import Idris.Docstrings hiding (Unchecked) import Paths_idris @@ -216,20 +216,29 @@ -} syntaxDecl :: SyntaxInfo -> IdrisParser PDecl syntaxDecl syn = do s <- syntaxRule syn- i <- get- let rs = syntax_rules i- let ns = syntax_keywords i- let ibc = ibc_write i- let ks = map show (names s)- put (i { syntax_rules = s : rs,- syntax_keywords = ks ++ ns,- ibc_write = IBCSyntax s : map IBCKeyword ks ++ ibc })+ i <- get + put (i `addSyntax` s) fc <- getFC- return (PSyntax fc s)- where names (Rule syms _ _) = mapMaybe ename syms- ename (Keyword n) = Just n- ename _ = Nothing+ return (PSyntax fc s) +-- | Extend an 'IState' with a new syntax extension. See also 'addReplSyntax'.+addSyntax :: IState -> Syntax -> IState+addSyntax i s = i { syntax_rules = s : rs,+ syntax_keywords = ks ++ ns,+ ibc_write = IBCSyntax s : map IBCKeyword ks ++ ibc }+ where rs = syntax_rules i+ ns = syntax_keywords i+ ibc = ibc_write i+ ks = map show (syntaxNames s)++-- | Like 'addSyntax', but no effect on the IBC.+addReplSyntax :: IState -> Syntax -> IState+addReplSyntax i s = i { syntax_rules = s : rs,+ syntax_keywords = ks ++ ns }+ where rs = syntax_rules i+ ns = syntax_keywords i+ ks = map show (syntaxNames s)+ {- | Parses a syntax extension declaration @@@ -329,12 +338,15 @@ -} fnDecl' :: SyntaxInfo -> IdrisParser PDecl fnDecl' syn = checkFixity $- do (doc, fc, opts', n, acc) <- try (do+ do (doc, argDocs, fc, opts', n, acc) <- try (do pushIndent- ist <- get- doc <- option noDocs docComment+ (doc, argDocs) <- option noDocs docComment ist <- get- let initOpts = if default_total ist+ let doc' = annotCode (tryFullExpr syn ist) doc+ argDocs' = [ (n, annotCode (tryFullExpr syn ist) d)+ | (n, d) <- argDocs ]++ initOpts = if default_total ist then [TotalFn] else [] opts <- fnOpts initOpts@@ -344,11 +356,11 @@ let n = expandNS syn n_in fc <- getFC lchar ':'- return (doc, fc, opts', n, acc))+ return (doc', argDocs', fc, opts', n, acc)) ty <- typeExpr (allowImp syn) terminator addAcc n acc- return (PTy (fst doc) (snd doc) syn fc opts' n ty)+ return (PTy doc argDocs syn fc opts' n ty) <|> postulate syn <|> caf syn <|> pattern syn@@ -396,6 +408,9 @@ @ -} -- FIXME: Check compatability for function options (i.e. partal/total)+--+-- Issue #1574 on the issue tracker.+-- https://github.com/idris-lang/Idris-dev/issues/1574 fnOpts :: [FnOpt] -> IdrisParser [FnOpt] fnOpts opts = do reserved "total"; fnOpts (TotalFn : opts)@@ -434,10 +449,12 @@ @ -} postulate :: SyntaxInfo -> IdrisParser PDecl-postulate syn = do doc <- try $ do doc <- option noDocs docComment+postulate syn = do doc <- try $ do (doc, _) <- option noDocs docComment+ ist <- get+ let doc' = annotCode (tryFullExpr syn ist) doc pushIndent reserved "postulate"- return doc+ return doc' ist <- get let initOpts = if default_total ist then [TotalFn]@@ -452,7 +469,7 @@ fc <- getFC terminator addAcc n acc- return (PPostulate (fst doc) syn fc opts' n ty)+ return (PPostulate doc syn fc opts' n ty) <?> "postulate" {- | Parses a using declaration@@ -581,16 +598,20 @@ @ -} class_ :: SyntaxInfo -> IdrisParser [PDecl]-class_ syn = do (doc, acc) <- try (do- doc <- option noDocs docComment+class_ syn = do (doc, argDocs, acc) <- try (do+ (doc, argDocs) <- option noDocs docComment+ ist <- get+ let doc' = annotCode (tryFullExpr syn ist) doc+ argDocs' = [ (n, annotCode (tryFullExpr syn ist) d)+ | (n, d) <- argDocs ] acc <- optional accessibility- return (doc, acc))+ return (doc', argDocs', acc)) reserved "class"; fc <- getFC; cons <- constraintList syn; n_in <- fnName let n = expandNS syn n_in cs <- many carg ds <- option [] (classBlock syn) accData acc n (concatMap declared ds)- return [PClass (fst doc) syn fc cons n cs (snd doc) ds]+ return [PClass doc syn fc cons n cs argDocs ds] <?> "type-class declaration" where carg :: IdrisParser (Name, PTerm)@@ -618,7 +639,8 @@ cn <- fnName args <- many (simpleExpr syn) let sc = PApp fc (PRef fc cn) (map pexp args)- let t = bindList (PPi constraint) (map (\x -> (sMN 0 "constraint", x)) cs) sc+ let t = bindList (PPi constraint)+ (map (\x -> (sMN 0 "constraint", x)) cs) sc ds <- option [] (instanceBlock syn) return [PInstance syn fc cs cn args t en ds] <?> "instance declaration"@@ -905,7 +927,7 @@ {-| Parses with pattern -@ +@ WExpr ::= '|' Expr'; @ -}@@ -1152,6 +1174,8 @@ case runparser mainProg i fname input of Failure doc -> do -- FIXME: Get error location from trifecta -- this can't be the solution!+ -- Issue #1575 on the issue tracker.+ -- https://github.com/idris-lang/Idris-dev/issues/1575 let (fc, msg) = findFC doc i <- getIState case idris_outputmode i of@@ -1263,7 +1287,7 @@ putIState (i { default_access = Hidden, module_aliases = modAliases }) clearIBC -- start a new .ibc file -- record package info in .ibc- imps <- allImportDirs + imps <- allImportDirs mapM_ addIBC (map IBCImportDir imps) mapM_ (addIBC . IBCImport) [realName | (realName, alias, fc) <- imports] let syntax = defaultSyntax{ syn_namespace = reverse mname,
src/Idris/PartialEval.hs view
@@ -1,7 +1,8 @@ {-# LANGUAGE PatternGuards #-} module Idris.PartialEval(partial_eval, getSpecApps, specType,- mkPE_TyDecl, mkPE_TermDecl, PEArgType(..)) where+ mkPE_TyDecl, mkPE_TermDecl, PEArgType(..),+ pe_app, pe_def, pe_clauses, pe_simple) where import Idris.AbsSyntax import Idris.Delaborate@@ -10,23 +11,70 @@ import Idris.Core.Evaluate import Control.Monad.State+import Control.Applicative+import Data.Maybe import Debug.Trace +-- | Data type representing binding-time annotations for partial evaluation of arguments+data PEArgType = ImplicitS -- ^ Implicit static argument+ | ImplicitD -- ^ Implicit dynamic argument+ | ExplicitS -- ^ Explicit static argument+ | ExplicitD -- ^ Explicit dynamic argument+ | UnifiedD -- ^ Erasable dynamic argument (found under unification)+ deriving (Eq, Show)++-- | A partially evaluated function. pe_app captures the lhs of the+-- new definition, pe_def captures the rhs, and pe_clauses is the+-- specialised implementation.+-- pe_simple is set if the result is always reducible, because in such a+-- case we'll also need to reduce the static argument+data PEDecl = PEDecl { pe_app :: PTerm, -- new application+ pe_def :: PTerm, -- old application+ pe_clauses :: [(PTerm, PTerm)], -- clauses of new application + pe_simple :: Bool -- if just one reducible clause+ }+ -- | Partially evaluates given terms under the given context.-partial_eval :: Context -> [(Name, Maybe Int)] ->+-- It is an error if partial evaluation fails to make any progress.+-- Making progress is defined as: all of the names given with explicit+-- reduction limits (in practice, the function being specialised)+-- must have reduced at least once.+-- If we don't do this, we might end up making an infinite function after+-- applying the transformation.+partial_eval :: Context -> + [(Name, Maybe Int)] -> [Either Term (Term, Term)] ->- [Either Term (Term, Term)]-partial_eval ctxt ns tms = map peClause tms where+ Maybe [Either Term (Term, Term)]+partial_eval ctxt ns_in tms = mapM peClause tms where+ ns = squash ns_in+ squash ((n, Just x) : ns) + | Just (Just y) <- lookup n ns + = squash ((n, Just (x + y)) : drop n ns)+ | otherwise = (n, Just x) : squash ns+ squash (n : ns) = n : squash ns+ squash [] = []++ drop n ((m, _) : ns) | n == m = ns+ drop n (x : ns) = x : drop n ns+ drop n [] = []+ -- If the term is not a clause, it is simply kept as is- peClause (Left t) = Left t+ peClause (Left t) = Just $ Left t -- If the term is a clause, specialise the right hand side peClause (Right (lhs, rhs))- = let rhs' = specialise ctxt [] (map toLimit ns) rhs in- Right (lhs, rhs')+ = let (rhs', reductions) = specialise ctxt [] (map toLimit ns) rhs in+ do when (length tms == 1) $ checkProgress ns reductions+ return (Right (lhs, rhs')) toLimit (n, Nothing) = (n, 65536) -- somewhat arbitrary reduction limit toLimit (n, Just l) = (n, l) + checkProgress ns [] = return ()+ checkProgress ns ((n, r) : rs)+ | Just (Just start) <- lookup n ns+ = if start <= 1 || r < start then checkProgress ns rs else Nothing+ | otherwise = checkProgress ns rs+ -- | Specialises the type of a partially evaluated TT function returning -- a pair of the specialised type and the types of expected arguments. specType :: [(PEArgType, Term)] -> Type -> (Type, [(PEArgType, Term)])@@ -68,23 +116,37 @@ put (args ++ (zip xs (repeat (sUN "_")))) return t --- | Creates an Idris type declaration given current state and a specialised TT function application type.+-- | Creates an Idris type declaration given current state and a +-- specialised TT function application type. -- Can be used in combination with the output of 'specType'.+--+-- This should: specialise any static argument position, then generalise+-- over any function applications in the result. mkPE_TyDecl :: IState -> [(PEArgType, Term)] -> Type -> PTerm mkPE_TyDecl ist args ty = mkty args ty where mkty ((ExplicitD, v) : xs) (Bind n (Pi t k) sc)- = PPi expl n (delab ist t) (mkty xs sc)+ = PPi expl n (delab ist (generaliseIn t)) (mkty xs sc) mkty ((ImplicitD, v) : xs) (Bind n (Pi t k) sc) | concreteClass ist t = mkty xs sc | classConstraint ist t - = PPi constraint n (delab ist t) (mkty xs sc)- | otherwise = PPi impl n (delab ist t) (mkty xs sc)+ = PPi constraint n (delab ist (generaliseIn t)) (mkty xs sc)+ | otherwise = PPi impl n (delab ist (generaliseIn t)) (mkty xs sc) mkty (_ : xs) t = mkty xs t mkty [] t = delab ist t + generaliseIn tm = evalState (gen tm) 0+ + gen tm | (P _ fn _, args) <- unApply tm,+ isFnName fn (tt_ctxt ist)+ = do nm <- get+ put (nm + 1)+ return (P Bound (sMN nm "spec") Erased)+ gen (App f a) = App <$> gen f <*> gen a+ gen tm = return tm+ -- | Checks if a given argument is a type class constraint argument classConstraint :: Idris.AbsSyntax.IState -> TT Name -> Bool classConstraint ist v@@ -107,13 +169,89 @@ _ -> False | otherwise = False --- | Creates a new clause for a specialised function application+mkNewPats :: IState ->+ [(Term, Term)] -> -- definition to specialise+ [(PEArgType, Term)] -> -- arguments to specialise with+ Name -> -- New name+ Name -> -- Specialised function name+ PTerm -> -- Default lhs+ PTerm -> -- Default rhs+ PEDecl+-- If all of the dynamic positions on the lhs are variables (rather than+-- patterns or constants) then we can just make a simple definition+-- directly applying the specialised function, since we know the+-- definition isn't going to block on any of the dynamic arguments+-- in this case+mkNewPats ist d ns newname sname lhs rhs | all dynVar (map fst d) + = PEDecl lhs rhs [(lhs, rhs)] True+ where dynVar ap = case unApply ap of+ (_, args) -> dynArgs ns args+ dynArgs _ [] = True -- can definitely reduce from here+ -- if Static, doesn't matter what the argument is+ dynArgs ((ImplicitS, _) : ns) (a : as) = dynArgs ns as+ dynArgs ((ExplicitS, _) : ns) (a : as) = dynArgs ns as+ -- if Dynamic, it had better be a variable or we'll need to+ -- do some more work+ 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 + mkClause :: (Term, Term) -> (PTerm, PTerm)+ mkClause (oldlhs, oldrhs)+ = let (_, as) = unApply oldlhs + lhsargs = mkLHSargs [] ns as+ lhs = PApp emptyFC (PRef emptyFC newname) lhsargs+ rhs = PApp emptyFC (PRef emptyFC sname) + (mkRHSargs ns lhsargs) in+ (lhs, rhs)++ mkLHSargs _ [] _ = []+ -- dynamics don't appear if they're implicit+ mkLHSargs sub ((ExplicitD, t) : ns) (a : as) + = pexp (delab ist (substNames sub a)) : mkLHSargs sub ns as+ mkLHSargs sub ((ImplicitD, _) : ns) (a : as) + = mkLHSargs sub ns as+ mkLHSargs sub ((UnifiedD, _) : ns) (a : as) + = mkLHSargs sub ns as+ -- statics get dropped in any case+ mkLHSargs sub ((ImplicitS, t) : ns) (a : as) + = mkLHSargs (extend a t sub) ns as+ mkLHSargs sub ((ExplicitS, t) : ns) (a : as) + = mkLHSargs (extend a t sub) ns as+ mkLHSargs sub _ [] = [] -- no more LHS++ extend (P _ n _) t sub = (n, t) : sub+ extend _ _ sub = sub++ mkRHSargs ((ExplicitS, t) : ns) as = pexp (delab ist t) : mkRHSargs ns as+ mkRHSargs ((ExplicitD, t) : ns) (a : as) = a : mkRHSargs ns as+ mkRHSargs (_ : ns) as = mkRHSargs ns as+ mkRHSargs _ _ = []++ 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.+-- More complex version to do: specialise the definition clause by clause mkPE_TermDecl :: IState -> Name -> Name ->- [(PEArgType, Term)] -> [(PTerm, PTerm)]+ [(PEArgType, Term)] -> PEDecl mkPE_TermDecl ist newname sname ns = let lhs = PApp emptyFC (PRef emptyFC newname) (map pexp (mkp ns)) - rhs = eraseImps $ delab ist (mkApp (P Ref sname Erased) (map snd ns)) in - [(lhs, rhs)] where+ rhs = eraseImps $ delab ist (mkApp (P Ref sname Erased) (map snd ns)) + patdef = lookupCtxtExact sname (idris_patdefs ist)+ newpats = case patdef of+ Nothing -> PEDecl lhs rhs [(lhs, rhs)] True+ Just d -> mkNewPats ist (getPats d) ns + newname sname lhs rhs in+ newpats where++ getPats (ps, _) = map (\(_, lhs, rhs) -> (lhs, rhs)) ps+ mkp [] = [] mkp ((ExplicitD, tm) : tms) = delab ist tm : mkp tms mkp (_ : tms) = mkp tms@@ -126,14 +264,6 @@ deImpArg a@(PImp _ _ _ _ _) = a { getTm = Placeholder } deImpArg a = a --- | Data type representing binding-time annotations for partial evaluation of arguments-data PEArgType = ImplicitS -- ^ Implicit static argument- | ImplicitD -- ^ Implicit dynamic argument- | ExplicitS -- ^ Explicit static argument- | ExplicitD -- ^ Explicit dynamic argument- | UnifiedD -- ^ Erasable dynamic argument (found under unification)- deriving (Eq, Show)- -- | Get specialised applications for a given function getSpecApps :: IState -> [Name] -> Term -> [(Name, [(PEArgType, Term)])]@@ -156,18 +286,22 @@ = let s' = staticArg env s i a n ss' = buildApp env ss is as ns in (s' : ss')- - ga env tm@(App f a) | (P _ n _, args) <- unApply tm =- ga env f ++ ga env a ++- case (lookupCtxt n (idris_statics ist),- lookupCtxt n (idris_implicits ist)) of- ([statics], [imps]) -> - if (length statics == length args && or statics) then- case buildApp env statics imps args [0..] of- args -> [(n, args)]--- _ -> []- else []- _ -> []++ -- if we have a *defined* function that has static arguments,+ -- it will become a specialised application+ ga env tm@(App f a) | (P _ n _, args) <- unApply tm,+ n `notElem` map fst (idris_metavars ist) =+ ga env f ++ ga env a +++ case (lookupCtxtExact n (idris_statics ist),+ lookupCtxtExact n (idris_implicits ist)) of+ (Just statics, Just imps) ->+ if (length statics == length args && or statics) then+ case buildApp env statics imps args [0..] of+ args -> [(n, args)]+-- _ -> []+ else []+ _ -> []+ ga env (Bind n (Let t v) sc) = ga env v ++ ga (n : env) sc ga env (Bind n t sc) = ga (n : env) sc ga env t = []
src/Idris/Primitives.hs view
@@ -153,6 +153,8 @@ (1, LFFloor) total, Prim (sUN "prim__floatCeil") (ty [(AType ATFloat)] (AType ATFloat)) 1 (p_floatCeil) (1, LFCeil) total,+ Prim (sUN "prim__negFloat") (ty [(AType ATFloat)] (AType ATFloat)) 1 (c_negFloat)+ (1, LFNegate) total, Prim (sUN "prim__strHead") (ty [StrType] (AType (ATInt ITChar))) 1 (p_strHead) (1, LStrHead) partial,@@ -260,6 +262,9 @@ , iCmp ity "gt" True (bCmp ity (>)) LGt total ] +-- The TODOs in this function are documented as Issue #1617 on the issue tracker.+--+-- https://github.com/idris-lang/Idris-dev/issues/1617 vecOps :: IntTy -> [Prim] vecOps ity@(ITVec elem count) = [ Prim (sUN $ "prim__mk" ++ intTyName ity)@@ -659,6 +664,10 @@ c_intToChar _ = Nothing c_charToInt [(Ch x)] = Just . I . fromEnum $ x c_charToInt _ = Nothing++c_negFloat :: [Const] -> Maybe Const+c_negFloat [Fl x] = Just $ Fl (negate x)+c_negFloat _ = Nothing c_floatToStr :: [Const] -> Maybe Const c_floatToStr [Fl x] = Just $ Str (show x)
src/Idris/Prover.hs view
@@ -274,7 +274,7 @@ -- 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, delabTy ist' n)) ts)+ 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)
src/Idris/REPL.hs view
@@ -66,11 +66,6 @@ -- import RTS.Bytecode -- import RTS.PreC -- import RTS.CodegenC-#ifdef IDRIS_LLVM-import LLVM.General.Target-#else-import Util.LLVMStubs-#endif import System.Console.Haskeline as H import System.FilePath import System.Exit@@ -86,7 +81,7 @@ import Network import Control.Concurrent import Data.Maybe-import Data.List+import Data.List hiding (group) import Data.Char import Data.Version import Data.Word (Word)@@ -145,14 +140,12 @@ showM c thm n = if c then colouriseFun thm (show n) else show n --- | Run the REPL server-startServer :: IState -> [FilePath] -> Idris ()-startServer orig fn_in = do tid <- runIO $ forkOS serverLoop- return ()- where serverLoop :: IO ()- -- TODO: option for port number- serverLoop = withSocketsDo $- do sock <- listenOnLocalhost $ PortNumber 4294+-- | Run the REPL seDver+startServer :: PortID -> IState -> [FilePath] -> Idris ()+startServer port orig fn_in = do tid <- runIO $ forkOS (serverLoop port)+ return ()+ where serverLoop port = withSocketsDo $+ do sock <- listenOnLocalhost port loop fn orig { idris_colourRepl = False } sock fn = case fn_in of@@ -175,7 +168,8 @@ processNetCmd orig i h fn cmd = do res <- case parseCmd i "(net)" cmd of Failure err -> return (Left (Msg " invalid command"))- Success c -> runErrorT $ evalStateT (processNet fn c) i+ Success (Right c) -> runErrorT $ evalStateT (processNet fn c) i+ Success (Left err) -> return (Left (Msg err)) case res of Right x -> return x Left err -> do hPutStrLn h (show err)@@ -206,9 +200,9 @@ IdeSlave n _ -> ist {idris_outputmode = IdeSlave n h} -- | Run a command on the server on localhost-runClient :: String -> IO ()-runClient str = withSocketsDo $ do- h <- connectTo "localhost" (PortNumber 4294)+runClient :: PortID -> String -> IO ()+runClient port str = withSocketsDo $ do+ h <- connectTo "localhost" port hSetEncoding h utf8 hPutStrLn h str resp <- hGetResp "" h@@ -279,7 +273,7 @@ i <- getIState case parseCmd i "(input)" cmd of Failure err -> iPrintError $ show (fixColour False err)- Success (Prove n') ->+ Success (Right (Prove n')) -> idrisCatch (do process fn (Prove n') isetPrompt (mkPrompt mods)@@ -298,9 +292,10 @@ IdeSlave.convSExp "abandon-proof" "Abandoned" n _ -> return () iRenderError $ pprintErr ist e)- Success cmd -> idrisCatch+ Success (Right cmd) -> idrisCatch (ideslaveProcess fn cmd) (\e -> getIState >>= iRenderError . flip pprintErr e)+ Success (Left err) -> iPrintError err runIdeSlaveCommand h id orig fn mods (IdeSlave.REPLCompletions str) = do (unused, compls) <- replCompletion (reverse str, "") let good = IdeSlave.SexpList [IdeSlave.SymbolAtom "ok",@@ -482,6 +477,28 @@ ideSlaveForceTermImplicits h id bnd True tm runIdeSlaveCommand h id orig fn modes (IdeSlave.TermNoImplicits bnd tm) = ideSlaveForceTermImplicits h id bnd False tm+runIdeSlaveCommand h id orig fn mods (IdeSlave.PrintDef name) =+ case splitName name of+ Left err -> iPrintError err+ Right n -> process "(ideslave)" (PrintDef n)+ where splitName :: String -> Either String Name+ splitName s = case reverse $ splitOn "." s of+ [] -> Left ("Didn't understand name '" ++ s ++ "'")+ [n] -> Right $ sUN n+ (n:ns) -> Right $ sNS (sUN n) ns+runIdeSlaveCommand h id orig fn modes (IdeSlave.ErrString e) =+ do ist <- getIState+ let out = displayS . renderPretty 1.0 60 $ pprintErr ist e+ msg = (IdeSlave.SymbolAtom "ok", IdeSlave.StringAtom $ out "")+ runIO . hPutStrLn h $ IdeSlave.convSExp "return" msg id+runIdeSlaveCommand h id orig fn modes (IdeSlave.ErrPPrint e) =+ do ist <- getIState+ let (out, spans) =+ displaySpans .+ renderPretty 0.9 80 .+ fmap (fancifyAnnots ist) $ pprintErr ist e+ msg = (IdeSlave.SymbolAtom "ok", out, spans)+ runIO . hPutStrLn h $ IdeSlave.convSExp "return" msg id -- | Show a term for IDESlave with the specified implicitness ideSlaveForceTermImplicits :: Handle -> Integer -> [(Name, Bool)] -> Bool -> Term -> Idris ()@@ -569,6 +586,8 @@ iPrintResult "" ideslaveProcess fn (WhoCalls n) = process fn (WhoCalls n) ideslaveProcess fn (CallsWho n) = process fn (CallsWho n)+ideslaveProcess fn (PrintDef n) = process fn (PrintDef n)+ideslaveProcess fn (PPrint fmt n tm) = process fn (PPrint fmt n tm) ideslaveProcess fn _ = iPrintError "command not recognized or not supported" @@ -593,36 +612,38 @@ _ -> "" c <- colourise case parseCmd i "(input)" cmd of- Failure err -> do runIO $ print (fixColour c err)+ Failure err -> do iputStrLn $ show (fixColour c err) return (Just inputs)- Success Reload ->+ Success (Right Reload) -> do putIState $ orig { idris_options = idris_options i , idris_colourTheme = idris_colourTheme i } clearErr mods <- loadInputs inputs Nothing return (Just inputs)- Success (Load f toline) ->+ Success (Right (Load f toline)) -> do putIState orig { idris_options = idris_options i , idris_colourTheme = idris_colourTheme i } clearErr mod <- loadInputs [f] toline return (Just [f])- Success (ModImport f) ->+ Success (Right (ModImport f)) -> do clearErr fmod <- loadModule f return (Just (inputs ++ [fmod]))- Success Edit -> do -- takeMVar stvar+ Success (Right Edit) -> do -- takeMVar stvar edit fn orig return (Just inputs)- Success Proofs -> do proofs orig- return (Just inputs)- Success Quit -> do when (not quiet) (iputStrLn "Bye bye")- return Nothing- Success cmd -> do idrisCatch (process fn cmd)+ Success (Right Proofs) -> do proofs orig+ return (Just inputs)+ Success (Right Quit) -> do when (not quiet) (iputStrLn "Bye bye")+ return Nothing+ Success (Right cmd ) -> do idrisCatch (process fn cmd) (\e -> do msg <- showErr e ; iputStrLn msg)- return (Just inputs)+ return (Just inputs)+ Success (Left err) -> do runIO $ putStrLn err+ return (Just inputs) resolveProof :: Name -> Idris Name resolveProof n'@@ -719,7 +740,7 @@ getClauseName (PClause fc name whole with rhs whereBlock) = name getClauseName (PWith fc name whole with rhs whereBlock) = name defineName :: [PDecl] -> Idris ()- defineName (tyDecl@(PTy docs argdocs syn fc opts name ty) : decls) = do + defineName (tyDecl@(PTy docs argdocs syn fc opts name ty) : decls) = do elabDecl EAll recinfo tyDecl elabClauses recinfo fc opts name (concatMap getClauses decls) setReplDefined (Just name)@@ -736,7 +757,9 @@ defineName (PFix fc fixity strs : defns) = do fmodifyState idris_fixities (map (Fix fixity) strs ++) unless (null defns) $ defineName defns- defineName (PSyntax{}:_) = tclift $ tfail (Msg "That kind of declaration is not supported. If you feel it should be supported, please submit an issue at https://github.com/idris-lang/Idris-dev.")+ defineName (PSyntax _ syntax:_) = do+ i <- get+ put (addReplSyntax i syntax) defineName decls = do elabDecls toplevel (map fixClauses decls) setReplDefined (getName (head decls))@@ -759,7 +782,7 @@ fixClauses :: PDecl' t -> PDecl' t fixClauses (PClauses fc opts _ css@(clause:cs)) = PClauses fc opts (getClauseName clause) css- fixClauses (PInstance syn fc constraints cls parms ty instName decls) = + fixClauses (PInstance syn fc constraints cls parms ty instName decls) = PInstance syn fc constraints cls parms ty instName (map fixClauses decls) fixClauses decl = decl @@ -769,10 +792,10 @@ undefine [] = do allDefined <- idris_repl_defs `fmap` get undefine' allDefined []- -- Keep track of which names you've removed so you can + -- Keep track of which names you've removed so you can -- print them out to the user afterward undefine names = undefine' names []- undefine' [] list = do iRenderOutput $ printUndefinedNames list + undefine' [] list = do iRenderOutput $ printUndefinedNames list return () undefine' (n:names) already = do allDefined <- idris_repl_defs `fmap` get@@ -786,12 +809,12 @@ -- smart detection of exactly what kind of name we're undefining. fputState (ctxt_lookup n . known_classes) Nothing fmodifyState repl_definitions (delete n)- undefClosure n = + undefClosure n = do replDefs <- idris_repl_defs `fmap` get callGraph <- whoCalls n let users = case lookup n callGraph of Just ns -> nub ns- Nothing -> fail ("Tried to undefine nonexistent name" ++ show n) + Nothing -> fail ("Tried to undefine nonexistent name" ++ show n) undefinedJustNow <- concat `fmap` mapM undefClosure users undefOne n return (nub (n : undefinedJustNow))@@ -818,7 +841,7 @@ case lookup t (idris_metavars ist) of Just (_, i, _) -> iRenderResult . fmap (fancifyAnnots ist) $ showMetavarInfo ppo ist n i- Nothing -> iPrintFunTypes [] n (map (\n -> (n, delabTy ist n)) ts)+ Nothing -> iPrintFunTypes [] n (map (\n -> (n, pprintDelabTy ist n)) ts) [] -> iPrintError $ "No such variable " ++ show n where showMetavarInfo ppo ist n i@@ -1053,12 +1076,14 @@ (\e -> getIState >>= iRenderError . flip pprintErr e) where fc = fileFC "main" process fn (Compile codegen f)- = do (m, _) <- elabVal recinfo ERHS- (PApp fc (PRef fc (sUN "run__IO"))- [pexp $ PRef fc (sNS (sUN "main") ["Main"])])- ir <- compile codegen f m- i <- getIState- runIO $ generate codegen (head (idris_imported i)) ir+ | map toLower (takeExtension f) `elem` [".idr", ".lidr", ".idc"] =+ iPrintError $ "Invalid filename for compiler output \"" ++ f ++"\""+ | otherwise = do (m, _) <- elabVal recinfo ERHS+ (PApp fc (PRef fc (sUN "run__IO"))+ [pexp $ PRef fc (sNS (sUN "main") ["Main"])])+ ir <- compile codegen f m+ i <- getIState+ runIO $ generate codegen (head (idris_imported i)) ir where fc = fileFC "main" process fn (LogLvl i) = setLogLevel i -- Elaborate as if LHS of a pattern (debug command)@@ -1172,8 +1197,47 @@ else return . Left $ "Illegal name: " ++ head bad case result of Right _ -> iputStrLn "IdrisDoc generated" Left err -> iPrintError err+process fn (PrintDef n) =+ do result <- pprintDef n+ case result of+ [] -> iPrintError "Not found"+ outs -> iRenderResult . vsep $ outs +-- Show relevant transformation rules for the name 'n'+process fn (TransformInfo n)+ = do i <- getIState+ let ts = lookupCtxt n (idris_transforms i)+ let res = map (showTrans i) ts+ iRenderResult . vsep $ concat res+ where showTrans :: IState -> [(Term, Term)] -> [Doc OutputAnnotation]+ showTrans i [] = []+ showTrans i ((lhs, rhs) : ts)+ = let ppTm tm = annotate (AnnTerm [] tm) .+ pprintPTerm (ppOptionIst i) [] [] [] .+ delab i $ tm+ ts' = showTrans i ts in+ ppTm lhs <+> text " ==> " <+> ppTm rhs : ts' +-- iRenderOutput (pretty lhs)+-- iputStrLn " ==> "+-- iPrintTermWithType (pprintDelab i rhs)+-- iputStrLn "---------------"+-- showTrans i ts++process fn (PPrint fmt width (PRef _ n))+ = do outs <- pprintDef n+ iPrintResult =<< renderExternal fmt width (vsep outs)+++process fn (PPrint fmt width t)+ = do (tm, ty) <- elabVal recinfo ERHS t+ ctxt <- getContext+ ist <- getIState+ let ppo = ppOptionIst ist+ ty' = normaliseC ctxt [] ty+ iPrintResult =<< renderExternal fmt width (pprintDelab ist tm)++ showTotal :: Totality -> IState -> String showTotal t@(Partial (Other ns)) i = show t ++ "\n\t" ++ showSep "\n\t" (map (showTotalN i) ns)@@ -1192,6 +1256,45 @@ l ++ take (c1 - length l) (repeat ' ') ++ m ++ take (c2 - length m) (repeat ' ') ++ r ++ "\n" +pprintDef :: Name -> Idris [Doc OutputAnnotation]+pprintDef n =+ do ist <- getIState+ ctxt <- getContext+ let ambiguous = length (lookupNames n ctxt) > 1+ patdefs = idris_patdefs ist+ tyinfo = idris_datatypes ist+ return $ map (ppDef ambiguous ist) (lookupCtxtName n patdefs) +++ map (ppTy ambiguous ist) (lookupCtxtName n tyinfo) +++ map (ppCon ambiguous ist) (filter (flip isDConName ctxt) (lookupNames n ctxt))+ where ppDef :: Bool -> IState -> (Name, ([([Name], Term, Term)], [PTerm])) -> Doc OutputAnnotation+ ppDef amb ist (n, (clauses, missing)) =+ prettyName True amb [] n <+> colon <+>+ align (pprintDelabTy ist n) <$>+ ppClauses ist clauses <> ppMissing missing+ ppClauses ist [] = text "No clauses."+ ppClauses ist cs = vsep (map pp cs)+ where pp (vars, lhs, rhs) =+ let ppTm t = annotate (AnnTerm (zip vars (repeat False)) t) .+ pprintPTerm (ppOptionIst ist)+ (zip vars (repeat False))+ [] [] .+ delab ist $+ t+ in group $ ppTm lhs <+> text "=" <$> (group . align . hang 2 $ ppTm rhs)+ ppMissing _ = empty++ ppTy :: Bool -> IState -> (Name, TypeInfo) -> Doc OutputAnnotation+ ppTy amb ist (n, TI constructors isCodata _ _ _)+ = kwd key <+> prettyName True amb [] n <+> colon <+>+ align (pprintDelabTy ist n) <+> kwd "where" <$>+ indent 2 (vsep (map (ppCon False ist) constructors))+ where+ key | isCodata = "codata"+ | otherwise = "data"+ kwd = annotate AnnKeyword . text+ ppCon amb ist n = prettyName True amb [] n <+> colon <+> align (pprintDelabTy ist n)++ helphead = [ (["Command"], SpecialHeaderArg, "Purpose"), ([""], NoArg, "")@@ -1273,6 +1376,8 @@ iWarn f $ pprintErr i e' ProgramLineComment -> return () -- fail elsewhere _ -> do setErrSpan emptyFC -- FIXME! Propagate it+ -- Issue #1576 on the issue tracker.+ -- https://github.com/idris-lang/Idris-dev/issues/1576 iWarn emptyFC $ pprintErr i e) where -- load all files, stop if any fail tryLoad :: Bool -> [IFileType] -> Idris ()@@ -1294,6 +1399,9 @@ inew <- getIState -- FIXME: Save these in IBC to avoid this hack! Need to -- preserve it all from source inputs+ --+ -- Issue #1577 on the issue tracker.+ -- https://github.com/idris-lang/Idris-dev/issues/1577 let tidata = idris_tyinfodata inew let patdefs = idris_patdefs inew ok <- noErrors@@ -1346,27 +1454,26 @@ let importdirs = opt getImportDir opts let bcs = opt getBC opts let pkgdirs = opt getPkgDir opts- let optimize = case opt getOptLevel opts of+ -- Set default optimisations+ let optimise = case opt getOptLevel opts of [] -> 2 xs -> last xs- trpl <- case opt getTriple opts of- [] -> runIO $ getDefaultTargetTriple- xs -> return (last xs)- tcpu <- case opt getCPU opts of- [] -> runIO $ getHostCPUName- xs -> return (last xs)+ setOptLevel optimise let outty = case opt getOutputTy opts of [] -> Executable xs -> last xs let cgn = case opt getCodegen opts of [] -> Via "c" xs -> last xs+ -- Now set/unset specifically chosen optimisations+ sequence_ (opt getOptimisation opts) script <- case opt getExecScript opts of [] -> return Nothing x:y:xs -> do iputStrLn "More than one interpreter expression found." runIO $ exitWith (ExitFailure 1) [expr] -> return (Just expr) let immediate = opt getEvalExpr opts+ let port = getPort opts when (DefaultTotal `elem` opts) $ do i <- getIState putIState (i { default_total = True })@@ -1380,9 +1487,6 @@ setOutputTy outty setNoBanner nobanner setCodegen cgn- setTargetTriple trpl- setTargetCPU tcpu- setOptLevel optimize mapM_ makeOption opts -- if we have the --bytecode flag, drop into the bytecode assembler case bcs of@@ -1458,7 +1562,7 @@ when (runrepl && not idesl) $ do -- clearOrigPats- startServer orig inputs+ startServer port orig inputs runInputT (replSettings (Just historyFile)) $ repl orig inputs let idesock = IdeslaveSocket `elem` opts when (idesl) $ ideslaveStart idesock orig inputs@@ -1524,13 +1628,14 @@ processLine i cmd input clr = case parseCmd i input cmd of Failure err -> runIO $ print (fixColour clr err)- Success Reload -> iPrintError "Init scripts cannot reload the file"- Success (Load f _) -> iPrintError "Init scripts cannot load files"- Success (ModImport f) -> iPrintError "Init scripts cannot import modules"- Success Edit -> iPrintError "Init scripts cannot invoke the editor"- Success Proofs -> proofs i- Success Quit -> iPrintError "Init scripts cannot quit Idris"- Success cmd -> process [] cmd+ Success (Right Reload) -> iPrintError "Init scripts cannot reload the file"+ Success (Right (Load f _)) -> iPrintError "Init scripts cannot load files"+ Success (Right (ModImport f)) -> iPrintError "Init scripts cannot import modules"+ Success (Right Edit) -> iPrintError "Init scripts cannot invoke the editor"+ Success (Right Proofs) -> proofs i+ Success (Right Quit) -> iPrintError "Init scripts cannot quit Idris"+ Success (Right cmd ) -> process [] cmd+ Success (Left err) -> runIO $ print err getFile :: Opt -> Maybe String getFile (Filename str) = Just str@@ -1613,18 +1718,38 @@ getCPU (TargetCPU x) = Just x getCPU _ = Nothing -getOptLevel :: Opt -> Maybe Word+getOptLevel :: Opt -> Maybe Int getOptLevel (OptLevel x) = Just x getOptLevel _ = Nothing +getOptimisation :: Opt -> Maybe (Idris ())+getOptimisation (AddOpt p) = Just $ addOptimise p+getOptimisation (RemoveOpt p) = Just $ removeOptimise p+getOptimisation _ = Nothing+ getColour :: Opt -> Maybe Bool getColour (ColourREPL b) = Just b getColour _ = Nothing +getClient :: Opt -> Maybe String+getClient (Client x) = Just x+getClient _ = Nothing++-- Get the first valid port+getPort :: [Opt] -> PortID+getPort [] = defaultPort+getPort (Port p:xs)+ | all (`elem` ['0'..'9']) p = PortNumber $ fromIntegral (read p)+ | otherwise = getPort xs+getPort (_:xs) = getPort xs+ opt :: (Opt -> Maybe a) -> [Opt] -> [a] opt = mapMaybe ver = showVersion version ++ gitHash++defaultPort :: PortID+defaultPort = PortNumber (fromIntegral 4294) banner = " ____ __ _ \n" ++ " / _/___/ /____(_)____ \n" ++
src/Idris/REPLParser.hs view
@@ -23,192 +23,378 @@ import Data.Char(toLower) import qualified Data.ByteString.UTF8 as UTF8 -parseCmd :: IState -> String -> String -> Result Command+parseCmd :: IState -> String -> String -> Result (Either String Command) parseCmd i inputname = P.runparser pCmd i inputname -cmd :: [String] -> P.IdrisParser ()-cmd xs = try (do P.lchar ':'; docmd (sortBy (\x y -> compare (length y) (length x)) xs))- where docmd [] = fail "No such command"- docmd (x:xs) = try (discard (P.reserved x)) <|> docmd xs+pCmd :: P.IdrisParser (Either String Command)+pCmd = do c <- cmd ["q", "quit"]; noArgs c Quit+ <|> do c <- cmd ["h", "?", "help"]; noArgs c Help+ <|> do c <- cmd ["w", "warranty"]; noArgs c Warranty+ <|> do c <- cmd ["r", "reload"]; noArgs c Reload+ <|> do c <- cmd ["exec", "execute"]; noArgs c Execute+ <|> do c <- cmd ["proofs"]; noArgs c Proofs+ <|> do c <- cmd ["u", "universes"]; noArgs c Universes+ <|> do c <- cmd ["errorhandlers"]; noArgs c ListErrorHandlers+ <|> do c <- cmd ["m", "metavars"]; noArgs c Metavars+ <|> do c <- cmd ["e", "edit"]; noArgs c Edit -pCmd :: P.IdrisParser Command+ <|> do c <- cmd ["d", "def"]; fnNameArg c Defn+ <|> do c <- cmd ["total"]; fnNameArg c TotCheck+ <|> do c <- cmd ["printdef"]; fnNameArg c PrintDef+ <|> do c <- cmd ["transinfo"]; fnNameArg c TransformInfo+ <|> do c <- cmd ["wc", "whocalls"]; fnNameArg c WhoCalls+ <|> do c <- cmd ["cw", "callswho"]; fnNameArg c CallsWho+ <|> do c <- cmd ["di", "dbginfo"]; fnNameArg c DebugInfo+ <|> do c <- cmd ["miss", "missing"]; fnNameArg c Missing -pCmd = do P.whiteSpace; do cmd ["q", "quit"]; eof; return Quit- <|> do cmd ["h", "?", "help"]; eof; return Help- <|> do cmd ["w", "warranty"]; eof; return Warranty- <|> do cmd ["r", "reload"]; eof; return Reload- <|> do cmd ["module"]; f <- P.identifier; eof;- return (ModImport (toPath f))- <|> do cmd ["e", "edit"]; eof; return Edit- <|> do cmd ["exec", "execute"]; eof; return Execute- <|> try (do cmd ["c", "compile"]- i <- get- f <- P.identifier- eof- return (Compile (Via "c") f))- <|> do cmd ["c", "compile"]- i <- get- c <- codegenOption- f <- P.identifier- eof- return (Compile c f)- <|> do cmd ["proofs"]; eof; return Proofs- <|> do cmd ["rmproof"]; n <- P.name; eof; return (RmProof n)- <|> do cmd ["showproof"]; n <- P.name; eof; return (ShowProof n)- <|> do cmd ["log"]; i <- P.natural; eof; return (LogLvl (fromIntegral i))- <|> do cmd ["let"]- defn <- concat <$> many (P.decl defaultSyntax)- return (NewDefn defn)- <|> do cmd ["unlet","undefine"]- Undefine `fmap` many P.name- <|> do cmd ["lto", "loadto"];- toline <- P.natural- f <- many anyChar;- return (Load f (Just (fromInteger toline)))- <|> do cmd ["l", "load"]; f <- many anyChar;- return (Load f Nothing)- <|> do cmd ["cd"]; f <- many anyChar; return (ChangeDirectory f)- <|> do cmd ["spec"]; P.whiteSpace; t <- P.fullExpr defaultSyntax; return (Spec t)- <|> do cmd ["hnf"]; P.whiteSpace; t <- P.fullExpr defaultSyntax; return (HNF t)- <|> do cmd ["inline"]; P.whiteSpace; t <- P.fullExpr defaultSyntax; return (TestInline t)- <|> do c <- try (cmd ["doc"] *> P.constant); eof; return (DocStr (Right c))- <|> do cmd ["doc"]; n <- (P.fnName <|> (P.string "_|_" >> return falseTy)); eof; return (DocStr (Left n))- <|> do cmd ["d", "def"]; P.whiteSpace; n <- P.fnName; eof; return (Defn n)- <|> do cmd ["total"]; do n <- P.fnName; eof; return (TotCheck n)- <|> do cmd ["t", "type"]; do P.whiteSpace; t <- P.fullExpr defaultSyntax; return (Check t)- <|> do cmd ["u", "universes"]; eof; return Universes- <|> do cmd ["di", "dbginfo"]; n <- P.fnName; eof; return (DebugInfo n)- <|> do cmd ["miss", "missing"]; n <- P.fnName; eof; return (Missing n)- <|> try (do cmd ["dynamic"]; eof; return ListDynamic)- <|> do cmd ["dynamic"]; l <- many anyChar; return (DynamicLink l)- <|> do cmd ["color", "colour"]; pSetColourCmd- <|> do cmd ["set"]; o <- pOption; return (SetOpt o)- <|> do cmd ["unset"]; o <- pOption; return (UnsetOpt o)- <|> do cmd ["s", "search"]; P.whiteSpace;- t <- P.typeExpr (defaultSyntax { implicitAllowed = True }); return (Search t)- <|> do cmd ["cs", "casesplit"]; P.whiteSpace;- upd <- option False (do P.lchar '!'; return True)- l <- P.natural; n <- P.name;- return (CaseSplitAt upd (fromInteger l) n)- <|> do cmd ["apc", "addproofclause"]; P.whiteSpace;- upd <- option False (do P.lchar '!'; return True)- l <- P.natural; n <- P.name;- return (AddProofClauseFrom upd (fromInteger l) n)- <|> do cmd ["ac", "addclause"]; P.whiteSpace;- upd <- option False (do P.lchar '!'; return True)- l <- P.natural; n <- P.name;- return (AddClauseFrom upd (fromInteger l) n)- <|> do cmd ["am", "addmissing"]; P.whiteSpace;- upd <- option False (do P.lchar '!'; return True)- l <- P.natural; n <- P.name;- return (AddMissing upd (fromInteger l) n)- <|> do cmd ["mw", "makewith"]; P.whiteSpace;- upd <- option False (do P.lchar '!'; return True)- l <- P.natural; n <- P.name;- return (MakeWith upd (fromInteger l) n)- <|> do cmd ["ml", "makelemma"]; P.whiteSpace;- upd <- option False (do P.lchar '!'; return True)- l <- P.natural; n <- P.name;- return (MakeLemma upd (fromInteger l) n)- <|> do cmd ["ps", "proofsearch"]; P.whiteSpace;- upd <- option False (do P.lchar '!'; return True)- l <- P.natural; n <- P.name;- hints <- many P.fnName- return (DoProofSearch upd True (fromInteger l) n hints)- <|> do cmd ["ref", "refine"]; P.whiteSpace;- upd <- option False (do P.lchar '!'; return True)- l <- P.natural; n <- P.name;- hint <- P.fnName- return (DoProofSearch upd False (fromInteger l) n [hint])- <|> do cmd ["p", "prove"]; n <- P.name; eof; return (Prove n)- <|> do cmd ["m", "metavars"]; eof; return Metavars- <|> do cmd ["a", "addproof"]; do n <- option Nothing (do x <- P.name;- return (Just x))- eof; return (AddProof n)- <|> do cmd ["x"]; P.whiteSpace; t <- P.fullExpr defaultSyntax; return (ExecVal t)- <|> do cmd ["patt"]; P.whiteSpace; t <- P.fullExpr defaultSyntax; return (Pattelab t)- <|> do cmd ["errorhandlers"]; eof ; return ListErrorHandlers- <|> do cmd ["consolewidth"]; w <- pConsoleWidth ; return (SetConsoleWidth w)- <|> do cmd ["apropos"]; str <- many anyChar ; return (Apropos str)- <|> do cmd ["wc", "whocalls"]; P.whiteSpace; n <- P.fnName ; return (WhoCalls n)- <|> do cmd ["cw", "callswho"]; P.whiteSpace; n <- P.fnName ; return (CallsWho n)- <|> do cmd ["mkdoc"]; str <- many anyChar; return (MakeDoc str)- <|> do P.whiteSpace; do eof; return NOP- <|> do t <- P.fullExpr defaultSyntax; return (Eval t)+ <|> do c <- cmd ["t", "type"]; exprArg c Check+ <|> do c <- cmd ["x"]; exprArg c ExecVal+ <|> do c <- cmd ["patt"]; exprArg c Pattelab+ <|> do c <- cmd ["spec"]; exprArg c Spec+ <|> do c <- cmd ["hnf"]; exprArg c HNF+ <|> do c <- cmd ["inline"]; exprArg c TestInline - where toPath n = foldl1' (</>) $ splitOn "." n+ <|> do c <- cmd ["rmproof"]; nameArg c RmProof+ <|> do c <- cmd ["showproof"]; nameArg c ShowProof+ <|> do c <- cmd ["p", "prove"]; nameArg c Prove -pOption :: P.IdrisParser Opt-pOption = do discard (P.symbol "errorcontext"); return ErrContext- <|> do discard (P.symbol "showimplicits"); return ShowImpl- <|> do discard (P.symbol "originalerrors"); return ShowOrigErr- <|> do discard (P.symbol "autosolve"); return AutoSolve- <|> do discard (P.symbol "nobanner") ; return NoBanner- <|> do discard (P.symbol "warnreach"); return WarnReach+ <|> do c <- cmd ["set"]; optArg c SetOpt+ <|> do c <- cmd ["unset"]; optArg c UnsetOpt -codegenOption :: P.IdrisParser Codegen-codegenOption = do discard (P.symbol "bytecode"); return Bytecode- <|> do x <- P.identifier- return (Via (map toLower x))+ <|> do c <- cmd ["l", "load"]; strArg c (\f -> Load f Nothing)+ <|> do c <- cmd ["cd"]; strArg c ChangeDirectory+ <|> do c <- cmd ["apropos"]; strArg c Apropos+ <|> do c <- cmd ["mkdoc"]; strArg c MakeDoc -pConsoleWidth :: P.IdrisParser ConsoleWidth-pConsoleWidth = do discard (P.symbol "auto"); return AutomaticWidth- <|> do discard (P.symbol "infinite"); return InfinitelyWide- <|> do n <- fmap fromInteger P.natural; return (ColsWide n)+ <|> do c <- cmd ["cs", "casesplit"]; proofArg c CaseSplitAt+ <|> do c <- cmd ["apc", "addproofclause"]; proofArg c AddProofClauseFrom+ <|> do c <- cmd ["ac", "addclause"]; proofArg c AddClauseFrom+ <|> do c <- cmd ["am", "addmissing"]; proofArg c AddMissing+ <|> do c <- cmd ["mw", "makewith"]; proofArg c MakeWith+ <|> do c <- cmd ["ml", "makelemma"]; proofArg c MakeLemma -colours :: [(String, Maybe Color)]-colours = [ ("black", Just Black)- , ("red", Just Red)- , ("green", Just Green)- , ("yellow", Just Yellow)- , ("blue", Just Blue)- , ("magenta", Just Magenta)- , ("cyan", Just Cyan)- , ("white", Just White)- , ("default", Nothing)- ]+ <|> do c <- cmd ["pp", "pprint"]; cmd_pprint c+ <|> do c <- cmd ["doc"]; cmd_doc c+ <|> do c <- cmd ["dynamic"]; cmd_dynamic c+ <|> do c <- cmd ["consolewidth"]; cmd_consolewidth c+ <|> do c <- cmd ["module"]; cmd_module c+ <|> do c <- cmd ["c", "compile"]; cmd_compile c+ <|> do c <- cmd ["a", "addproof"]; cmd_addproof c+ <|> do c <- cmd ["log"]; cmd_log c+ <|> do c <- cmd ["let"]; cmd_let c+ <|> do c <- cmd ["unlet","undefine"]; cmd_unlet c+ <|> do c <- cmd ["lto", "loadto"]; cmd_loadto c+ <|> do c <- cmd ["color", "colour"]; cmd_colour c+ <|> do c <- cmd ["s", "search"]; cmd_search c+ <|> do c <- cmd ["ps", "proofsearch"]; cmd_proofsearch c+ <|> do c <- cmd ["ref", "refine"]; cmd_refine c -pColour :: P.IdrisParser (Maybe Color)-pColour = doColour colours- where doColour [] = fail "Unknown colour"- doColour ((s, c):cs) = (try (P.symbol s) >> return c) <|> doColour cs+ <|> unrecognized+ <|> nop+ <|> eval -pColourMod :: P.IdrisParser (IdrisColour -> IdrisColour)-pColourMod = try (P.symbol "vivid" >> return doVivid)- <|> try (P.symbol "dull" >> return doDull)- <|> try (P.symbol "underline" >> return doUnderline)- <|> try (P.symbol "nounderline" >> return doNoUnderline)- <|> try (P.symbol "bold" >> return doBold)- <|> try (P.symbol "nobold" >> return doNoBold)- <|> try (P.symbol "italic" >> return doItalic)- <|> try (P.symbol "noitalic" >> return doNoItalic)- <|> try (pColour >>= return . doSetColour)- where doVivid i = i { vivid = True }- doDull i = i { vivid = False }- doUnderline i = i { underline = True }- doNoUnderline i = i { underline = False }- doBold i = i { bold = True }- doNoBold i = i { bold = False }- doItalic i = i { italic = True }- doNoItalic i = i { italic = False }- doSetColour c i = i { colour = c }+ where nop = do P.whiteSpace; eof; return (Right NOP)+ eval = exprArg "" Eval+ unrecognized = do + P.lchar ':' + cmd <- many anyChar+ let cmd' = takeWhile (/=' ') cmd+ return (Left $ "Unrecognized command: " ++ cmd') --- | Generate the colour type names using the default Show instance.-colourTypes :: [(String, ColourType)]-colourTypes = map (\x -> ((map toLower . reverse . drop 6 . reverse . show) x, x)) $- enumFromTo minBound maxBound+cmd :: [String] -> P.IdrisParser String+cmd xs = try $ do + P.lchar ':'+ docmd sorted_xs+ + where docmd [] = fail "Could not parse command"+ docmd (x:xs) = try (P.reserved x >> return x) <|> docmd xs+ + sorted_xs = sortBy (\x y -> compare (length y) (length x)) xs -pColourType :: P.IdrisParser ColourType-pColourType = doColourType colourTypes- where doColourType [] = fail $ "Unknown colour category. Options: " ++- (concat . intersperse ", " . map fst) colourTypes- doColourType ((s,ct):cts) = (try (P.symbol s) >> return ct) <|> doColourType cts -pSetColourCmd :: P.IdrisParser Command-pSetColourCmd = (do c <- pColourType- let defaultColour = IdrisColour Nothing True False False False- opts <- sepBy pColourMod (P.whiteSpace)- let colour = foldr ($) defaultColour $ reverse opts- return $ SetColour c colour)- <|> try (P.symbol "on" >> return ColourOn)- <|> try (P.symbol "off" >> return ColourOff)+noArgs :: String -> Command -> P.IdrisParser (Either String Command)+noArgs name cmd = do+ let emptyArgs = do+ P.whiteSpace+ eof+ return (Right cmd)++ let failure = return (Left $ ":" ++ name ++ " takes no arguments")++ try emptyArgs <|> failure++exprArg :: String -> (PTerm -> Command) -> P.IdrisParser (Either String Command)+exprArg name cmd = do+ P.whiteSpace+ let noArg = do+ eof+ return $ Left ("Usage is :" ++ name ++ " <expression>")++ let properArg = do+ t <- P.fullExpr defaultSyntax+ return $ Right (cmd t)+ try noArg <|> properArg+++fnNameArg :: String -> (Name -> Command) -> P.IdrisParser (Either String Command)+fnNameArg name cmd = do+ P.whiteSpace+ let emptyArgs = do eof+ return $ Left ("Usage is :" ++ name ++ " <functionname>")+ oneArg = do n <- P.fnName+ eof+ return (Right (cmd n))+ badArg = return $ Left ("Usage is :" ++ name ++ " <functionname>")+ try emptyArgs <|> try oneArg <|> badArg++nameArg :: String -> (Name -> Command) -> P.IdrisParser (Either String Command)+nameArg name cmd = do+ P.whiteSpace+ let emptyArgs = do eof+ return $ Left ("Usage is :" ++ name ++ " <functionname>")+ oneArg = do n <- P.name+ eof+ return (Right (cmd n))+ badArg = return $ Left ("Usage is :" ++ name ++ " <functionname>")+ try emptyArgs <|> try oneArg <|> badArg++strArg :: String -> (String -> Command) -> P.IdrisParser (Either String Command)+strArg name cmd = do+ n <- many anyChar+ eof+ return (Right (cmd n))++optArg :: String -> (Opt -> Command) -> P.IdrisParser (Either String Command)+optArg name cmd = do+ let emptyArgs = do+ eof+ return $ Left ("Usage is :" ++ name ++ " <option>")++ let oneArg = do+ P.whiteSpace+ o <- pOption+ P.whiteSpace+ eof+ return (Right (cmd o))++ let failure = do+ return $ Left "Unrecognized setting"++ try emptyArgs <|> try oneArg <|> failure++ where+ pOption :: P.IdrisParser Opt+ pOption = do discard (P.symbol "errorcontext"); return ErrContext+ <|> do discard (P.symbol "showimplicits"); return ShowImpl+ <|> do discard (P.symbol "originalerrors"); return ShowOrigErr+ <|> do discard (P.symbol "autosolve"); return AutoSolve+ <|> do discard (P.symbol "nobanner") ; return NoBanner+ <|> do discard (P.symbol "warnreach"); return WarnReach++proofArg :: String -> (Bool -> Int -> Name -> Command) -> P.IdrisParser (Either String Command)+proofArg name cmd = do+ P.whiteSpace+ upd <- option False $ do+ P.lchar '!'+ return True+ l <- P.natural+ n <- P.name;+ return (Right (cmd upd (fromInteger l) n))++cmd_doc :: String -> P.IdrisParser (Either String Command)+cmd_doc name = do+ let constant = do+ c <- P.constant+ eof+ return $ Right (DocStr (Right c))++ let fnName = fnNameArg name (\n -> DocStr (Left n))++ try constant <|> fnName++cmd_consolewidth :: String -> P.IdrisParser (Either String Command)+cmd_consolewidth name = do+ w <- pConsoleWidth+ return (Right (SetConsoleWidth w))++ where+ pConsoleWidth :: P.IdrisParser ConsoleWidth+ pConsoleWidth = do discard (P.symbol "auto"); return AutomaticWidth+ <|> do discard (P.symbol "infinite"); return InfinitelyWide+ <|> do n <- fmap fromInteger P.natural; return (ColsWide n)++cmd_dynamic :: String -> P.IdrisParser (Either String Command)+cmd_dynamic name = do+ let emptyArgs = noArgs name ListDynamic++ let oneArg = do l <- many anyChar+ return $ Right (DynamicLink l)++ let failure = return $ Left $ "Usage is :" ++ name ++ " [<library>]"++ try emptyArgs <|> try oneArg <|> failure++cmd_pprint :: String -> P.IdrisParser (Either String Command)+cmd_pprint name = do+ P.whiteSpace+ fmt <- ppFormat+ P.whiteSpace+ n <- fmap fromInteger P.natural+ P.whiteSpace+ t <- P.fullExpr defaultSyntax+ return (Right (PPrint fmt n t))++ where+ ppFormat :: P.IdrisParser OutputFmt+ ppFormat = (discard (P.symbol "html") >> return HTMLOutput)+ <|> (discard (P.symbol "latex") >> return LaTeXOutput)+++cmd_module :: String -> P.IdrisParser (Either String Command)+cmd_module name = do+ f <- P.identifier+ eof;+ return (Right (ModImport (toPath f)))+ where+ toPath n = foldl1' (</>) $ splitOn "." n++cmd_compile :: String -> P.IdrisParser (Either String Command)+cmd_compile name = do+ let defaultCodegen = Via "c"++ let codegenOption :: P.IdrisParser Codegen+ codegenOption = do+ let bytecodeCodegen = discard (P.symbol "bytecode") *> return Bytecode+ viaCodegen = do x <- P.identifier+ return (Via (map toLower x))+ bytecodeCodegen <|> viaCodegen++ let hasOneArg = do+ i <- get+ f <- P.identifier+ eof+ return $ Right (Compile defaultCodegen f)++ let hasTwoArgs = do+ i <- get+ codegen <- codegenOption+ f <- P.identifier+ eof+ return $ Right (Compile codegen f)++ let failure = return $ Left $ "Usage is :" ++ name ++ " [<codegen>] <filename>"+ try hasTwoArgs <|> try hasOneArg <|> failure++cmd_addproof :: String -> P.IdrisParser (Either String Command)+cmd_addproof name = do+ n <- option Nothing $ do+ x <- P.name;+ return (Just x)+ eof+ return (Right (AddProof n))++cmd_log :: String -> P.IdrisParser (Either String Command)+cmd_log name = do+ i <- P.natural+ eof+ return (Right (LogLvl (fromIntegral i)))++cmd_let :: String -> P.IdrisParser (Either String Command)+cmd_let name = do+ defn <- concat <$> many (P.decl defaultSyntax)+ return (Right (NewDefn defn))++cmd_unlet :: String -> P.IdrisParser (Either String Command)+cmd_unlet name = do+ (Right . Undefine) `fmap` many P.name++cmd_loadto :: String -> P.IdrisParser (Either String Command)+cmd_loadto name = do+ toline <- P.natural+ f <- many anyChar;+ return (Right (Load f (Just (fromInteger toline))))++cmd_colour :: String -> P.IdrisParser (Either String Command)+cmd_colour name = do+ pSetColourCmd >>= return . Right++ where+ colours :: [(String, Maybe Color)]+ colours = [ ("black", Just Black)+ , ("red", Just Red)+ , ("green", Just Green)+ , ("yellow", Just Yellow)+ , ("blue", Just Blue)+ , ("magenta", Just Magenta)+ , ("cyan", Just Cyan)+ , ("white", Just White)+ , ("default", Nothing)+ ]++ pSetColourCmd :: P.IdrisParser Command+ pSetColourCmd = (do c <- pColourType+ let defaultColour = IdrisColour Nothing True False False False+ opts <- sepBy pColourMod (P.whiteSpace)+ let colour = foldr ($) defaultColour $ reverse opts+ return $ SetColour c colour)+ <|> try (P.symbol "on" >> return ColourOn)+ <|> try (P.symbol "off" >> return ColourOff)++ pColour :: P.IdrisParser (Maybe Color)+ pColour = doColour colours+ where doColour [] = fail "Unknown colour"+ doColour ((s, c):cs) = (try (P.symbol s) >> return c) <|> doColour cs++ pColourMod :: P.IdrisParser (IdrisColour -> IdrisColour)+ pColourMod = try (P.symbol "vivid" >> return doVivid)+ <|> try (P.symbol "dull" >> return doDull)+ <|> try (P.symbol "underline" >> return doUnderline)+ <|> try (P.symbol "nounderline" >> return doNoUnderline)+ <|> try (P.symbol "bold" >> return doBold)+ <|> try (P.symbol "nobold" >> return doNoBold)+ <|> try (P.symbol "italic" >> return doItalic)+ <|> try (P.symbol "noitalic" >> return doNoItalic)+ <|> try (pColour >>= return . doSetColour)+ where doVivid i = i { vivid = True }+ doDull i = i { vivid = False }+ doUnderline i = i { underline = True }+ doNoUnderline i = i { underline = False }+ doBold i = i { bold = True }+ doNoBold i = i { bold = False }+ doItalic i = i { italic = True }+ doNoItalic i = i { italic = False }+ doSetColour c i = i { colour = c }++ -- | Generate the colour type names using the default Show instance.+ colourTypes :: [(String, ColourType)]+ colourTypes = map (\x -> ((map toLower . reverse . drop 6 . reverse . show) x, x)) $+ enumFromTo minBound maxBound++ pColourType :: P.IdrisParser ColourType+ pColourType = doColourType colourTypes+ where doColourType [] = fail $ "Unknown colour category. Options: " +++ (concat . intersperse ", " . map fst) colourTypes+ doColourType ((s,ct):cts) = (try (P.symbol s) >> return ct) <|> doColourType cts+++cmd_search :: String -> P.IdrisParser (Either String Command)+cmd_search name = do+ P.whiteSpace;+ t <- P.typeExpr (defaultSyntax { implicitAllowed = True })+ return (Right (Search t))++cmd_proofsearch :: String -> P.IdrisParser (Either String Command)+cmd_proofsearch name = do+ P.whiteSpace+ upd <- option False (do P.lchar '!'; return True)+ l <- P.natural; n <- P.name;+ hints <- many P.fnName+ return (Right (DoProofSearch upd True (fromInteger l) n hints))++cmd_refine :: String -> P.IdrisParser (Either String Command)+cmd_refine name = do+ P.whiteSpace+ upd <- option False (do P.lchar '!'; return True)+ l <- P.natural; n <- P.name;+ hint <- P.fnName+ return (Right (DoProofSearch upd False (fromInteger l) n [hint]))
src/Idris/Transforms.hs view
@@ -1,57 +1,99 @@ {-# LANGUAGE PatternGuards #-} -module Idris.Transforms where+module Idris.Transforms(transformPats, + transformPatsWith,+ applyTransRulesWith,+ applyTransRules) where import Idris.AbsSyntax import Idris.Core.CaseTree import Idris.Core.TT -data TTOpt = TermTrans (TT Name -> TT Name) -- term transform- | CaseTrans (SC -> SC) -- case expression transform+import Debug.Trace -class Transform a where- transform :: TTOpt -> a -> a+transformPats :: IState -> [Either Term (Term, Term)] ->+ [Either Term (Term, Term)]+transformPats ist ps = map tClause ps where+ tClause (Left t) = Left t -- not a clause, leave it alone+ tClause (Right (lhs, rhs)) -- apply transforms on RHS+ = let rhs' = applyTransRules ist rhs in+ Right (lhs, rhs') -instance Transform (TT Name) where- transform o@(TermTrans t) tm = trans t tm where- trans t (Bind n b tm) = t $ Bind n (transform o b) (trans t tm)- trans t (App f a) = t $ App (trans t f) (trans t a)- trans t tm = t tm- transform _ tm = tm+transformPatsWith :: [(Term, Term)] -> [Either Term (Term, Term)] ->+ [Either Term (Term, Term)]+transformPatsWith rs ps = map tClause ps where+ tClause (Left t) = Left t -- not a clause, leave it alone+ tClause (Right (lhs, rhs)) -- apply transforms on RHS+ = let rhs' = applyTransRulesWith rs rhs in+ Right (lhs, rhs') -instance Transform a => Transform (Binder a) where- transform t (Let ty v) = Let (transform t ty) (transform t v)- transform t b = b { binderTy = transform t (binderTy b) }+-- Work on explicitly named terms, so we don't have to manipulate+-- de Bruijn indices+applyTransRules :: IState -> Term -> Term+applyTransRules ist tm = finalise $ applyAll [] (idris_transforms ist) (vToP tm) -instance Transform SC where- transform o@(CaseTrans t) sc = trans t sc where- trans t (Case up n alts) = t (Case up n (map (transform o) alts))- trans t x = t x- transform o@(TermTrans t) sc = trans t sc where- trans t (Case up n alts) = Case up n (map (transform o) alts)- trans t (STerm tm) = STerm (t tm)- trans t x = x+-- Work on explicitly named terms, so we don't have to manipulate+-- de Bruijn indices+applyTransRulesWith :: [(Term, Term)] -> Term -> Term+applyTransRulesWith rules tm + = finalise $ applyAll rules emptyContext (vToP tm) -instance Transform CaseAlt where- transform o (ConCase n i ns sc) = ConCase n i ns (transform o sc)- transform o (ConstCase c sc) = ConstCase c (transform o sc)- transform o (DefaultCase sc) = DefaultCase (transform o sc)+applyAll :: [(Term, Term)] -> Ctxt [(Term, Term)] -> Term -> Term+applyAll extra ts ap@(App f a) + | (P _ fn ty, args) <- unApply ap+ = let rules = case lookupCtxtExact fn ts of+ Just r -> extra ++ r+ Nothing -> extra + ap' = App (applyAll extra ts f) (applyAll extra ts a) in+ case rules of+ [] -> ap'+ rs -> case applyFnRules rs ap of+ Just tm'@(App f' a') ->+ App (applyAll extra ts f')+ (applyAll extra ts a')+ Just tm' -> tm'+ _ -> App (applyAll extra ts f) + (applyAll extra ts a)+applyAll extra ts (Bind n b sc) = Bind n (fmap (applyAll extra ts) b) + (applyAll extra ts sc)+applyAll extra ts t = t -natTrans = [TermTrans zero, TermTrans suc, CaseTrans natcase]+applyFnRules :: [(Term, Term)] -> Term -> Maybe Term+applyFnRules [] tm = Nothing+applyFnRules (r : rs) tm | Just tm' <- applyRule r tm = Just tm'+ | otherwise = applyFnRules rs tm -zname = sNS (sUN "Z") ["Nat","Prelude"]-sname = sNS (sUN "S") ["Nat","Prelude"]+applyRule :: (Term, Term) -> Term -> Maybe Term+applyRule (lhs, rhs) tm + | Just ms <- matchTerm lhs tm +-- = trace ("SUCCESS " ++ show ms ++ "\n FROM\n" ++ show lhs +++-- "\n" ++ show rhs +-- ++ "\n" ++ show tm ++ " GIVES\n" ++ show (depat ms rhs)) $ + = Just $ depat ms rhs+ | otherwise = Nothing+ where depat ms (Bind n (PVar t) sc) + = case lookup n ms of+ Just tm -> depat ms (subst n tm sc)+ _ -> depat ms sc -- no occurrence? Shouldn't happen+ depat ms tm = tm -zero :: TT Name -> TT Name-zero (P _ n _) | n == zname- = Constant (BI 0)-zero x = x+matchTerm :: Term -> Term -> Maybe [(Name, Term)]+matchTerm lhs tm = matchVars [] lhs tm+ where+ matchVars acc (Bind n (PVar t) sc) tm + = matchVars (n : acc) (instantiate (P Bound n t) sc) tm+ matchVars acc sc tm + = -- trace (show acc ++ ": " ++ show (sc, tm)) $+ doMatch acc sc tm -suc :: TT Name -> TT Name-suc (App (P _ s _) a) | s == sname- = mkApp (P Ref (sUN "prim__addBigInt") Erased) [Constant (BI 1), a]-suc x = x+ doMatch :: [Name] -> Term -> Term -> Maybe [(Name, Term)]+ doMatch ns (P _ n _) tm+ | n `elem` ns = return [(n, tm)]+ doMatch ns (App f a) (App f' a')+ = do fm <- doMatch ns f f'+ am <- doMatch ns a a'+ return (fm ++ am)+ doMatch ns x y | x == y = return []+ | otherwise = Nothing -natcase :: SC -> SC-natcase = undefined
src/Idris/TypeSearch.hs view
@@ -23,18 +23,18 @@ import Idris.AbsSyntax (addUsingConstraints, addImpl, getIState, putIState, implicit) import Idris.AbsSyntaxTree (class_instances, ClassInfo, defaultSyntax, eqTy, Idris, IState (idris_classes, idris_docstrings, tt_ctxt, idris_outputmode),- implicitAllowed, OutputMode(..), prettyDocumentedIst, PTerm, toplevel)+ implicitAllowed, OutputMode(..), PTerm, toplevel) import Idris.Core.Evaluate (Context (definitions), Def (Function, TyDecl, CaseOp), normaliseC) import Idris.Core.TT hiding (score) import Idris.Core.Unify (match_unify) import Idris.Delaborate (delabTy) import Idris.Docstrings (noDocs, overview) import Idris.Elab.Type (elabType)-import Idris.Output (iRenderOutput, iPrintResult, iRenderResult)+import Idris.Output (iRenderOutput, iPrintResult, iRenderResult, prettyDocumentedIst) import Prelude hiding (pred) -import Util.Pretty (text, char, vsep, (<>), Doc)+import Util.Pretty (text, char, vsep, (<>), Doc, annotate) searchByType :: PTerm -> Idris () searchByType pterm = do@@ -173,13 +173,14 @@ , asymMods :: !(Sided AsymMods) } deriving (Eq, Show) -displayScore :: Score -> Doc a-displayScore score = text $ case both noMods (asymMods score) of- Sided True True -> "=" -- types are isomorphic- Sided True False -> "<" -- found type is more general than searched type- Sided False True -> ">" -- searched type is more general than found type- Sided False False -> "_"+displayScore :: Score -> Doc OutputAnnotation+displayScore score = case both noMods (asymMods score) of+ Sided True True -> annotated EQ "=" -- types are isomorphic+ Sided True False -> annotated LT "<" -- found type is more general than searched type+ Sided False True -> annotated GT ">" -- searched type is more general than found type+ Sided False False -> text "_" where + annotated ordr = annotate (AnnSearchResult ordr) . text noMods (Mods app tcApp tcIntro) = app + tcApp + tcIntro == 0 scoreCriterion :: Score -> Bool
src/Idris/Unlit.hs view
@@ -23,9 +23,11 @@ check f l [x] = return () check f l [] = return () +-- Issue #1593 on the issue checker.+--+-- https://github.com/idris-lang/Idris-dev/issues/1593+-- chkAdj :: FilePath -> Int -> LineType -> LineType -> TC () chkAdj f l Prog Comm = tfail $ At (FC f (l, 0) (l, 0)) ProgramLineComment --TODO: Span correctly chkAdj f l Comm Prog = tfail $ At (FC f (l, 0) (l, 0)) ProgramLineComment --TODO: Span correctly chkAdj f l _ _ = return ()--
src/Pkg/Package.hs view
@@ -63,10 +63,10 @@ -- Also give up if there are metavariables to solve case (map fst (idris_metavars ist) \\ primDefs) of _ -> when install $ installPkg pkgdesc--- ms -> do if install +-- ms -> do if install -- then putStrLn "Can't install: there are undefined metavariables:" -- else putStrLn "There are undefined metavariables:"--- putStrLn $ "\t" ++ show ms +-- putStrLn $ "\t" ++ show ms -- exitWith (ExitFailure 1) -- | Type check packages only@@ -107,7 +107,7 @@ runIO $ setCurrentDirectory $ dir </> sourcedir pkgdesc if (f /= "")- then idrisMain ((Filename f) : opts) + then idrisMain ((Filename f) : opts) else iputStrLn "Can't start REPL: no main module given" runIO $ setCurrentDirectory dir @@ -129,6 +129,9 @@ -- | Generate IdrisDoc for package -- TODO: Handle case where module does not contain a matching namespace -- E.g. from prelude.ipkg: IO, Prelude.Chars, Builtins+--+-- Issue number #1572 on the issue tracker+-- https://github.com/idris-lang/Idris-dev/issues/1572 documentPkg :: FilePath -- ^ Path to .ipkg file. -> IO () documentPkg fp =@@ -143,7 +146,7 @@ make (makefile pkgdesc) setCurrentDirectory $ pkgDir let run l = runErrorT . (execStateT l)- load [] = return () + load [] = return () load (f:fs) = do loadModule f; load fs loader = do idrisMain opts; load fs idrisInstance <- run loader idrisInit
− src/Util/LLVMStubs.hs
@@ -1,24 +0,0 @@-{----Things needed to build without LLVM-Replaces stuff from LLVM.General.Target and IRTS.CodegenLLVM.----}--module Util.LLVMStubs where--import qualified Idris.Core.TT as TT-import IRTS.Simplified-import IRTS.CodegenCommon--import Data.Word (Word)--getDefaultTargetTriple :: IO String-getDefaultTargetTriple = return ""--getHostCPUName :: IO String-getHostCPUName = return ""---codegenLLVM :: CodeGenerator-codegenLLVM _ = fail "This Idris was compiled without the LLVM backend."
src/Util/System.hs view
@@ -2,7 +2,6 @@ -- System helper functions. import Control.Monad (when)-import Distribution.Text (display) import System.Directory (getTemporaryDirectory , removeFile , removeDirectoryRecursive
test/Makefile view
@@ -11,7 +11,7 @@ @perl ./runtest.pl without --codegen Java test_js:- @perl ./runtest.pl without sugar004 reg029 io001 dsl002 io003 effects001 effects002 buffer001 --codegen node+ @perl ./runtest.pl without sugar004 reg029 reg052 io001 dsl002 io003 effects001 effects002 buffer001 basic011 --codegen node test_llvm: @perl ./runtest.pl without primitives003 sugar004 io003 buffer001 --codegen llvm
test/basic001/basic001a.idr view
@@ -13,7 +13,7 @@ rle (x :: xs) with (rle xs) rle (x :: []) | REnd = RChar 0 x REnd rle (x :: (c :: (replicate n c ++ ys))) | (RChar n c rs) with (decEq x c)- rle (x :: (x :: (replicate n x ++ ys))) | (RChar n x rs) | (Yes refl) + rle (x :: (x :: (replicate n x ++ ys))) | (RChar n x rs) | (Yes Refl) = RChar (S n) x rs rle (x :: (c :: (replicate n c ++ ys))) | (RChar n c rs) | (No f) = RChar 0 x (RChar n c rs)
test/basic001/reg005.idr view
@@ -16,7 +16,7 @@ -> RLE (rep (S n) x ++ xs) eq : (x : Char) -> (y : Char) -> Maybe (x = y)-eq x y = if x == y then Just (believe_me (refl {x})) else Nothing+eq x y = if x == y then Just (believe_me (Refl {x})) else Nothing ------------ @@ -25,7 +25,7 @@ rle (x :: xs) with (rle xs) rle (x :: Vect.Nil) | REnd = RChar Z x REnd rle (x :: rep (S n) yvar ++ ys) | RChar n yvar rs with (eq x yvar)- rle (x :: rep (S n) x ++ ys) | RChar n x rs | Just refl+ rle (x :: rep (S n) x ++ ys) | RChar n x rs | Just Refl = RChar (S n) x rs rle (x :: rep (S n) y ++ ys) | RChar n y rs | Nothing = RChar Z x (RChar n y rs)
test/basic005/test019.lidr view
@@ -1,16 +1,16 @@ > module Main -> ifTrue : so True -> Nat-> ifTrue oh = S Z+> ifTrue : So True -> Nat+> ifTrue Oh = S Z -> ifFalse : so False -> Nat-> ifFalse oh impossible+> ifFalse : So False -> Nat+> ifFalse Oh impossible -> test : (f : Nat -> Bool) -> (n : Nat) -> so (f n) -> Nat+> test : (f : Nat -> Bool) -> (n : Nat) -> So (f n) -> Nat > test f n x with (f n) > | True = ifTrue x > | False = ifFalse x > main : IO ()-> main = print (test ((S 4) ==) 5 oh)+> main = print (test ((S 4) ==) 5 Oh)
test/basic009/Faulty.idr view
@@ -4,4 +4,4 @@ import B.C fault : num = Z-fault = refl+fault = Refl
test/basic009/Main.idr view
@@ -4,13 +4,13 @@ import B.C as Y checkX : X.num = Z-checkX = refl+checkX = Refl checkY : Y.num = S Z-checkY = refl+checkY = Refl checkAX : X.num = A.num-checkAX = refl+checkAX = Refl checkBY : Y.num = B.C.num-checkBY = refl+checkBY = Refl
test/basic010/Main.idr view
@@ -20,7 +20,7 @@ -- Here, the proof is very expensive to compute. -- We add a recursive argument to prevent Idris from inlining the function. f : (r, n : Nat) -> Subset Nat (\k => qib n `equals` qib k)-f Z n = element n eq_refl+f Z n = Element n eq_refl f (S r) n = f r n -- A (contrived) relation, just to have something to show.@@ -30,7 +30,7 @@ -- Here, the witness is very expensive to compute. -- We add a recursive argument to prevent Idris from inlining the function. g : (r, n : Nat) -> Exists (\k : Nat => k `represents` n)-g Z n = evidence (qib n) (axiom n)+g Z n = Evidence (qib n) (axiom n) g (S r) n = g r n fmt : qib n `represents` n -> String
+ test/basic011/basic011.idr view
@@ -0,0 +1,16 @@+module Main++import Data.Hash++main : IO ()+main = do print $ hash (the Bits8 3)+ print $ hash (the (List Bits8) [3])+ print $ hash "hello world"+ print $ hash 'a'+ print $ hash (the Bits8 3)+ print $ hash (the Bits16 3)+ print $ hash (the Bits32 3)+ print $ hash (the Bits64 3)+ print $ hash (the Int 3)+ print $ hash (the Integer 3)+
+ test/basic011/expected view
@@ -0,0 +1,10 @@+6EA049D797FA18D6+6EA049D797FA18D6+FDA01C93B78A192F+AD85270E93646134+6EA049D797FA18D6+6EA049D797FA18D6+6EA049D797FA18D6+6EA049D797FA18D6+6EA049D797FA18D6+6EA049D797FA18D6
+ test/basic011/run view
@@ -0,0 +1,4 @@+#!/usr/bin/env bash+idris $@ basic011.idr -o basic011+./basic011+rm -f basic011 *.ibc
test/dsl001/test001.idr view
@@ -14,8 +14,8 @@ (::) : interpTy a -> Env G -> Env (a :: G) data HasType : (i : Fin n) -> Vect n Ty -> Ty -> Type where- stop : HasType fZ (t :: G) t- pop : HasType k G t -> HasType (fS k) (u :: G) t+ stop : HasType FZ (t :: G) t+ pop : HasType k G t -> HasType (FS k) (u :: G) t lookup : HasType i G t -> Env G -> interpTy t lookup stop (x :: xs) = x@@ -58,7 +58,7 @@ eAdd = expr (\x, y => Op (+) x y) -- eDouble : Expr G (TyFun TyInt TyInt)--- eDouble = Lam (App (App (Lam (Lam (Op' (+) (Var fZ) (Var (fS fZ))))) (Var fZ)) (Var fZ))+-- eDouble = Lam (App (App (Lam (Lam (Op' (+) (Var FZ) (Var (FS FZ))))) (Var FZ)) (Var FZ)) eDouble : Expr G (TyFun TyInt TyInt) eDouble = expr (\x => App (App eAdd x) (Var stop))
test/dsl002/Resimp.idr view
@@ -46,8 +46,8 @@ interpTy (a :-> b) = a -> interpTy b data HasType : Vect n Ty -> Fin n -> Ty -> Type where- stop : HasType (a :: gam) fZ a- pop : HasType gam i b -> HasType (a :: gam) (fS i) b+ stop : HasType (a :: gam) FZ a+ pop : HasType gam i b -> HasType (a :: gam) (FS i) b data Env : Vect n Ty -> Type where Nil : Env Nil
test/dsl003/DSLPi.idr view
@@ -6,7 +6,7 @@ pi = ARR test1 : simple_type (BOOL -> INT -> UNIT) = BOOL `ARR` (INT `ARR` UNIT)-test1 = refl+test1 = Refl using (vars : Vect n Ty) infix 2 ===@@ -25,14 +25,14 @@ dsl specs pi = ForAll variable = Var- index_first = fZ- index_next = fS+ index_first = FZ+ index_next = FS test2 : Spec [] test2 = specs ((x, y : INT) -> x === y) test3 : Spec []-test3 = ForAll INT . ForAll INT . ItHolds $ Var (fS fZ) === Var fZ+test3 = ForAll INT . ForAll INT . ItHolds $ Var (FS FZ) === Var FZ test4 : test2 = test3-test4 = refl+test4 = Refl
test/dsl003/expected view
@@ -1,2 +1,2 @@-ForAll INT (ForAll INT (ItHolds (Var (fS fZ) === Var fZ))) : Spec []-refl : ARR BOOL (ARR INT UNIT) = ARR BOOL (ARR INT UNIT)+ForAll INT (ForAll INT (ItHolds (Var (FS FZ) === Var FZ))) : Spec []+Refl : ARR BOOL (ARR INT UNIT) = ARR BOOL (ARR INT UNIT)
test/effects002/test025.idr view
@@ -16,14 +16,14 @@ testMemory : MemoryIO () () (Vect 4 Int) testMemory = do Src :- allocate 5- Src :- poke 0 inpVect oh+ Src :- poke 0 inpVect Oh Dst :- allocate 5- Dst :- initialize (prim__truncInt_B8 1) 2 oh- move 2 2 3 oh oh+ Dst :- initialize (prim__truncInt_B8 1) 2 Oh+ move 2 2 3 Oh Oh Src :- free- end <- Dst :- peek 4 (S Z) oh- Dst :- poke 4 (sub1 end) oh- res <- Dst :- peek 1 (S(S(S(S Z)))) oh+ end <- Dst :- peek 4 (S Z) Oh+ Dst :- poke 4 (sub1 end) Oh+ res <- Dst :- peek 1 (S(S(S(S Z)))) Oh Dst :- free return (map (prim__zextB8_Int) res)
test/error004/FunErrTest.idr view
@@ -11,9 +11,9 @@ -> {auto cons1 : isCons xs = True} -> {auto cons2 : isCons (tail xs) = True} -> 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=Refl} {cons2=Refl} = y+cadr (x :: []) {cons1=Refl} {cons2=Refl} impossible+cadr [] {cons1=Refl} {cons2=Refl} impossible extractList : TT -> Maybe TT extractList (App (App reflCon (App isCons lst)) _) = Just lst
test/ffi002/test023.idr view
@@ -10,9 +10,9 @@ goodProvider : IO (Provider Type) goodProvider = return (Provide (the Type ())) -%provide (Unit : Type) with goodProvider+%provide (Unit' : Type) with goodProvider -foo : Unit+foo : Unit' foo = () -- Always fail
test/ffi005/Postulate.idr view
@@ -5,7 +5,7 @@ %language TypeProviders bad : IO (Provider Type)-bad = return $ pure _|_+bad = return $ pure Void %provide postulate oops with bad
test/interactive001/expected view
@@ -7,7 +7,7 @@ f x :: map f xs isElem2 x (y :: ys) with (_) isElem2 x (y :: ys) | with_pat = ?isElem2_rhs- isElem3 x (x :: ys) | (Yes refl) = ?isElem3_rhs_3+ isElem3 x (x :: ys) | (Yes Refl) = ?isElem3_rhs_3 [] => ?bar_1 (x :: ys) => ?bar_2
+ test/interactive005/expected view
@@ -0,0 +1,34 @@+Type checking ./interactive005.idr+3 : Nat+Hello, World+main : IO ()+ This is a docstring+ +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++ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN+ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.++main : IO ()+ This+ is a+ docstring+ +main : IO ()+ This is a docstring+ +Nat2 : Type+Invalid filename for compiler output "Test.idr"
+ test/interactive005/input view
@@ -0,0 +1,26 @@+:consolewidth 80+the Nat (1 + 2)+:exec+:c bytecode hello.bytecode+:c c hello+:doc main+:reload+:consolewidth 80+:load interactive005.idr+:total main+:exec+:consolewidth 80+:t id+:set showimplicits+:t id+:unset showimplicits+:t id+:warranty+:consolewidth 10+:doc main+:consolewidth infinite+:doc main+:let data Nat2 = Zero | Succ Nat2+:t Nat2+:compile Test.idr+:compile a.out
+ test/interactive005/interactive005.idr view
@@ -0,0 +1,3 @@+||| This is a docstring+main : IO ()+main = putStrLn "Hello, World"
+ test/interactive005/run view
@@ -0,0 +1,6 @@+#!/usr/bin/env bash+idris --nocolour --quiet interactive005.idr < input+rm -f *.ibc+rm -f hello.bytecode+rm -f hello+rm -f a.out
+ test/interactive006/expected view
@@ -0,0 +1,2 @@+Type checking ./interactive006.idr+plus ?foo_rhs2 ?foo_rhs3
+ test/interactive006/input view
@@ -0,0 +1,1 @@+:ref 2 foo_rhs1 plus
+ test/interactive006/interactive006.idr view
@@ -0,0 +1,3 @@+foo : Nat -> Nat -> Nat+foo k j = ?foo_rhs1+
+ test/interactive006/run view
@@ -0,0 +1,3 @@+#!/usr/bin/env bash+idris --quiet --port 5000 interactive006.idr < input+rm -f *.ibc
test/io003/test018a.idr view
@@ -4,17 +4,17 @@ ping : ProcID String -> ProcID String -> Process String () ping main proc- = do lift (usleep 1000)+ = do Lift (usleep 1000) send proc "Hello!"- lift (putStrLn "Sent ping")+ Lift (putStrLn "Sent ping") msg <- recv- lift (putStrLn ("Reply: " ++ show msg))+ Lift (putStrLn ("Reply: " ++ show msg)) send main "Done" pong : Process String ()-pong = do -- lift (putStrLn "Waiting for message")+pong = do -- Lift (putStrLn "Waiting for message") (sender, m) <- recvWithSender- lift $ putStrLn ("Received " ++ m)+ Lift $ putStrLn ("Received " ++ m) send sender ("Hello back!") mainProc : Process String ()
test/primitives002/expected view
@@ -42,3 +42,5 @@ 0.0 prim__floatSqrt 1.0 1.0+prim__negFloat 1.0+-1.0
test/primitives002/run view
@@ -31,6 +31,7 @@ "prim__floatExp 1.0" "prim__floatLog 1.0" "prim__floatSqrt 1.0"+"prim__negFloat 1.0" ) generate_testfile()
test/primitives003/test038.idr view
@@ -2,7 +2,7 @@ test : DecEq a => a -> a -> Bool test i1 i2 with (decEq i1 i2)- test i1 i1 | Yes refl = True+ test i1 i1 | Yes Refl = True test i1 i2 | No p = False main : IO ()@@ -52,10 +52,10 @@ putStrLn . show $ test (Left "hello") (Right "world") putStrLn . show $ test (Left "hello") (Right False) -- Fin- putStrLn . show $ test (the (Fin (S (S (S (Z))))) (fS (fS (fZ)))) - (the (Fin (S (S (S (Z))))) (fS (fS (fZ))))- putStrLn . show $ test (the (Fin (S (S (S (Z))))) (fS (fS (fZ)))) - (the (Fin (S (S (S (Z))))) (fS (fZ)))+ putStrLn . show $ test (the (Fin (S (S (S (Z))))) (FS (FS (FZ)))) + (the (Fin (S (S (S (Z))))) (FS (FS (FZ))))+ putStrLn . show $ test (the (Fin (S (S (S (Z))))) (FS (FS (FZ)))) + (the (Fin (S (S (S (Z))))) (FS (FZ))) -- Nat putStrLn . show $ test (S (S (S Z))) (S (S (S Z))) putStrLn . show $ test (S (S (S Z))) (S (S Z))
test/proof001/test029.idr view
@@ -5,13 +5,13 @@ -- Base case (Z + m = m + Z) <== plus_comm = rewrite ((m + Z = m) <== plusZeroRightNeutral) ==>- (Z + m = m) in refl+ (Z + m = m) in Refl -- Step case (S k + m = m + S k) <== plus_comm = rewrite ((k + m = m + k) <== plus_comm) in rewrite ((S (m + k) = m + S k) <== plusSuccRightSucc) in- refl+ Refl -- QED append : Vect n a -> Vect m a -> Vect (m + n) a
test/proof002/Reflect.idr view
@@ -36,8 +36,8 @@ -- list appends expr_r : Expr G xs -> (xs' ** (RExpr G xs', xs = xs'))- expr_r ENil = (_ ** (RNil, refl))- expr_r (Var i) = (_ ** (RApp RNil i, refl))+ expr_r ENil = (_ ** (RNil, Refl))+ expr_r (Var i) = (_ ** (RApp RNil i, Refl)) expr_r (App ex ey) = let (xl ** (xr, xprf)) = expr_r ex in let (yl ** (yr, yprf)) = expr_r ey in appRExpr _ _ xr yr xprf yprf@@ -47,7 +47,7 @@ RExpr G xs -> RExpr G ys -> (xs' = xs) -> (ys' = ys) -> (ws' ** (RExpr G ws', xs' ++ ys' = ws')) appRExpr x' y' rxs (RApp e i) xprf yprf- = let (xs ** (rec, prf)) = appRExpr _ _ rxs e refl refl in+ = let (xs ** (rec, prf)) = appRExpr _ _ rxs e Refl Refl in (_ ** (RApp rec i, ?appRExpr1)) appRExpr x' y' rxs RNil xprf yprf = (_ ** (rxs, ?appRExpr2)) @@ -68,12 +68,12 @@ eqExpr : (e : Expr G xs) -> (e' : Expr G ys) -> Maybe (e = e') eqExpr (App x y) (App x' y') with (eqExpr x x', eqExpr y y')- eqExpr (App x y) (App x y) | (Just refl, Just refl) = Just refl+ eqExpr (App x y) (App x y) | (Just Refl, Just Refl) = Just Refl eqExpr (App x y) (App x' y') | _ = Nothing eqExpr (Var i) (Var j) with (prim__syntactic_eq _ _ i j)- eqExpr (Var i) (Var i) | (Just refl) = Just refl+ eqExpr (Var i) (Var i) | (Just Refl) = Just Refl eqExpr (Var i) (Var j) | _ = Nothing- eqExpr ENil ENil = Just refl+ eqExpr ENil ENil = Just Refl eqExpr _ _ = Nothing -- Given a couple of reflected expressions, try to produce a proof that@@ -83,7 +83,7 @@ Expr G ln -> Expr G rn -> (xs = ln) -> (ys = rn) -> Maybe (xs = ys) buildProof e e' lp rp with (eqExpr e e')- buildProof e e lp rp | Just refl = ?bp1+ buildProof e e lp rp | Just Refl = ?bp1 buildProof e e' lp rp | Nothing = Nothing testEq : Expr G xs -> Expr G ys -> Maybe (xs = ys)@@ -108,7 +108,7 @@ isElem : (x : a) -> (xs : List a) -> Maybe (Elem x xs) isElem x [] = Nothing isElem x (y :: ys) with (prim__syntactic_eq _ _ x y)- isElem x (x :: ys) | Just refl = [| Stop |]+ isElem x (x :: ys) | Just Refl = [| Stop |] isElem x (y :: ys) | Nothing = [| Pop (isElem x ys) |] weakenElem : (G' : List a) -> Elem x xs -> Elem x (G' ++ xs)@@ -126,7 +126,7 @@ -- %reflection means a function runs on syntax, rather than on constructors. -- So, 'reflectList' builds a reflected List expression as defined above. --- It also converts (x :: xs) into a reflected [x] ++ xs so that the above+-- It also converts (x :: xs) into a reflected [x] ++ xs So that the above -- reduction will work the right way. %reflection
test/proof003/test015.idr view
@@ -45,7 +45,7 @@ testBin = natToBin _ _ pattern syntax bitpair [x] [y] = (_ ** (_ ** (x, y, _)))-term syntax bitpair [x] [y] = (_ ** (_ ** (x, y, refl)))+term syntax bitpair [x] [y] = (_ ** (_ ** (x, y, Refl))) addBit : Bit x -> Bit y -> Bit c -> (bX ** (bY ** (Bit bX, Bit bY, c + x + y = bY + 2 * bX)))
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 7 0) (MN 0 "__Unit") (TType (UVar 10)))) (P (DCon 0 0) (MN 0 "__II") (P (TCon 0 0) (MN 0 "__Unit") (TType (UVar 10))))) (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 7 0) (MN 0 "__Unit") (TType (UVar 10)))) (P (DCon 0 0) (MN 0 "__II") (P (TCon 0 0) (MN 0 "__Unit") (TType (UVar 10))))) (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 7 0) (MN 0 "__Unit") (TType (UVar 10))))))+(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 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 190))) (TType (UVar 192))) (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 194))) (App (App (App (App (P (DCon 0 4) (MN 0 "__MkPair") (Bind (MN 0 "A") (Pi (TType (UVar 64))) (Bind (MN 0 "B") (Pi (TType (UVar 68))) (Bind (MN 0 "a") (Pi (V 1)) (Bind (MN 0 "b") (Pi (V 1)) (App (App (P (TCon 0 0) (MN 0 "__Pair") (Bind (MN 1 "A") (Pi (TType (UVar 52))) (Bind (MN 1 "B") (Pi (TType (UVar 56))) (TType (UVar 60))))) (V 3)) (V 2))))))) (TType (UVar 184))) (TType (UVar 186))) (P (TCon 15 0) (NS (UN Nat) ["Nat", "Prelude"]) (TType (UVar -1)))) (P (TCon 15 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 196)))))+(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 48))) (TType (UVar 50))) (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 52))) (App (App (App (App (P (DCon 0 4) (UN MkPair) (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) (UN Pair) Erased) (V 3)) (V 2))))))) (TType (UVar 42))) (TType (UVar 44))) (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 54))))) ---------------(App (App (App (App (P (DCon 0 4) (MN 0 "__MkPair") (Bind (MN 0 "A") (Pi (TType (UVar 64))) (Bind (MN 0 "B") (Pi (TType (UVar 68))) (Bind (MN 0 "a") (Pi (V 1)) (Bind (MN 0 "b") (Pi (V 1)) (App (App (P (TCon 0 0) (MN 0 "__Pair") (Bind (MN 1 "A") (Pi (TType (UVar 52))) (Bind (MN 1 "B") (Pi (TType (UVar 56))) (TType (UVar 60))))) (V 3)) (V 2))))))) (TType (UVar 184))) (TType (UVar 186))) (App (App (App (App (P (DCon 0 4) (MN 0 "__MkPair") (Bind (MN 0 "A") (Pi (TType (UVar 64))) (Bind (MN 0 "B") (Pi (TType (UVar 68))) (Bind (MN 0 "a") (Pi (V 1)) (Bind (MN 0 "b") (Pi (V 1)) (App (App (P (TCon 0 0) (MN 0 "__Pair") (Bind (MN 1 "A") (Pi (TType (UVar 52))) (Bind (MN 1 "B") (Pi (TType (UVar 56))) (TType (UVar 60))))) (V 3)) (V 2))))))) (TType (UVar 184))) (TType (UVar 186))) (TType (UVar 190))) (TType (UVar 190)))) (App (App (App (App (P (DCon 0 4) (MN 0 "__MkPair") (Bind (MN 0 "A") (Pi (TType (UVar 64))) (Bind (MN 0 "B") (Pi (TType (UVar 68))) (Bind (MN 0 "a") (Pi (V 1)) (Bind (MN 0 "b") (Pi (V 1)) (App (App (P (TCon 0 0) (MN 0 "__Pair") (Bind (MN 1 "A") (Pi (TType (UVar 52))) (Bind (MN 1 "B") (Pi (TType (UVar 56))) (TType (UVar 60))))) (V 3)) (V 2))))))) (TType (UVar 184))) (TType (UVar 186))) (TType (UVar 190))) (TType (UVar 190))))+(App (App (App (App (P (DCon 0 4) (UN MkPair) (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) (UN Pair) Erased) (V 3)) (V 2))))))) (TType (UVar 42))) (TType (UVar 44))) (App (App (App (App (P (DCon 0 4) (UN MkPair) (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) (UN Pair) Erased) (V 3)) (V 2))))))) (TType (UVar 42))) (TType (UVar 44))) (TType (UVar 48))) (TType (UVar 48)))) (App (App (App (App (P (DCon 0 4) (UN MkPair) (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) (UN Pair) Erased) (V 3)) (V 2))))))) (TType (UVar 42))) (TType (UVar 44))) (TType (UVar 48))) (TType (UVar 48))))
test/quasiquote003/NoInfer.idr view
@@ -4,7 +4,7 @@ import Language.Reflection.Utils zzz2 : TT-zzz2 = `(fZ : Fin 3)+zzz2 = `(FZ : Fin 3) zzz : TT-zzz = `(fZ)+zzz = `(FZ)
test/quasiquote004/Quasiquote004.idr view
@@ -24,7 +24,7 @@ -- Fizzy is a correct specification of divisibility by 3 - that is, if n is -- fizzy then there exists some k such that n = 3*k. fizzyCorrect : (n : Nat) -> Fizzy n -> (k : Nat ** n = 3 * k)-fizzyCorrect Z ZeroFizzy = (Z ** refl)+fizzyCorrect Z ZeroFizzy = (Z ** Refl) fizzyCorrect (S (S (S k))) (Fizz x) = let (k' ** ih) = fizzyCorrect k x in (S k' ** ?fizzyIsAOK)
test/reg002/reg002.idr view
@@ -10,17 +10,17 @@ S (Co n) = Co (S n) S Infinity = Infinity -Sn_notzero : Main.S n = Co 0 -> _|_+Sn_notzero : Main.S n = Co 0 -> Void Sn_notzero = believe_me -S_Co_not_Inf : Main.S (Co n) = Infinity -> _|_+S_Co_not_Inf : Main.S (Co n) = Infinity -> Void S_Co_not_Inf = believe_me S_inj : (n : CoNat) -> (m : CoNat) -> Main.S n = Main.S m -> n = m-S_inj (Co n) (Co _) refl = refl-S_inj (Co n) Infinity p = FalseElim (S_Co_not_Inf p)-S_inj Infinity (Co m) p = FalseElim (S_Co_not_Inf (sym p))-S_inj Infinity Infinity refl = refl+S_inj (Co n) (Co _) Refl = Refl+S_inj (Co n) Infinity p = void (S_Co_not_Inf p)+S_inj Infinity (Co m) p = void (S_Co_not_Inf (sym p))+S_inj Infinity Infinity Refl = Refl swap : {n : Nat} -> Vect n a -> Vect n a swap Nil = Nil
test/reg006/reg006.idr view
@@ -8,9 +8,9 @@ BlackBranch : k -> v -> RBTree k v n x -> RBTree k v n y -> RBTree k v (S n) Black toBlack : RBTree k v n c -> (m ** (RBTree k v m Black, Either (m = n) (m = (S n))))-toBlack (RedBranch k v l r) = (_ ** (BlackBranch k v l r, Right refl))-toBlack Leaf = (_ ** (Leaf, Left refl))-toBlack (BlackBranch k v l r) = (_ ** (BlackBranch k v l r, Left refl))+toBlack (RedBranch k v l r) = (_ ** (BlackBranch k v l r, Right Refl))+toBlack Leaf = (_ ** (Leaf, Left Refl))+toBlack (BlackBranch k v l r) = (_ ** (BlackBranch k v l r, Left Refl)) total lookup : Ord k => k -> RBTree k v n Black -> Maybe v
test/reg007/reg007.lidr view
@@ -3,7 +3,7 @@ > import A > isSame : A.n = A.lala-> isSame = refl+> isSame = Refl > A.n = Z -- This is where it's at! > A.lala = S Z
test/reg009/reg009.lidr view
@@ -4,15 +4,15 @@ > filterTagP : (p : alpha -> Bool) -> > (as : Vect n alpha) ->-> so (isAnyBy p (n ** as)) ->-> (m : Nat ** (Vect m (a : alpha ** so (p a)), so (m > Z)))+> So (isAnyBy p (n ** as)) ->+> (m : Nat ** (Vect m (a : alpha ** So (p a)), So (m > Z))) > filterTagP {n = S m} p (a :: as) q with (p a) > | True = (_ > **-> ((a ** believe_me oh)+> ((a ** believe_me Oh) > ::-> (fst (getProof (filterTagP p as (believe_me oh)))),-> oh+> (fst (getProof (filterTagP p as (believe_me Oh)))),+> Oh > ) > )-> | False = filterTagP p as (believe_me oh)+> | False = filterTagP p as (believe_me Oh)
test/reg012/reg012.lidr view
@@ -1,21 +1,21 @@-> total soElim : (C : (b : Bool) -> so b -> Type) ->-> C True oh ->-> (b : Bool) -> (s : so b) -> (C b s)-> soElim C coh .True .oh = coh+> total soElim : (C : (b : Bool) -> So b -> Type) ->+> C True Oh ->+> (b : Bool) -> (s : So b) -> (C b s)+> soElim C coh .True .Oh = coh -> soFalseElim : so False -> a-> soFalseElim x = FalseElim (soElim C () False x)+> soFalseElim : So False -> a+> soFalseElim x = void (soElim C () False x) > where-> C : (b : Bool) -> so b -> Type+> C : (b : Bool) -> So b -> Type > C True s = ()-> C False s = _|_+> C False s = Void -> soTrue : so b -> b = True+> soTrue : So b -> b = True > soTrue {b = False} x = soFalseElim x-> soTrue {b = True} x = refl+> soTrue {b = True} x = Refl > class Eq alpha => ReflEqEq alpha where-> reflexive_eqeq : (a : alpha) -> so (a == a)+> reflexive_eqeq : (a : alpha) -> So (a == a) > modifyFun : (Eq alpha) => > (alpha -> beta) ->@@ -28,7 +28,7 @@ > (ab : (alpha, beta)) -> > modifyFun f ab (fst ab) = snd ab > modifyFunLemma f (a,b) =-> rewrite soTrue (reflexive_eqeq a) in refl+> rewrite soTrue (reflexive_eqeq a) in Refl replace {P = \ z => boolElim (a == a) b (f a) = boolElim z b (f a)}- (soTrue (reflexive_eqeq a)) refl+ (soTrue (reflexive_eqeq a)) Refl
test/reg017/reg017.idr view
@@ -2,10 +2,10 @@ foo : { t : Type } -> (a : t) ->- { default tactics { refine refl; solve; } prfA : a = a } ->+ { default tactics { refine Refl; solve; } prfA : a = a } -> (b : Nat) -> (c : Nat) ->- { default tactics { refine refl; solve; } prfBC : b = c } ->+ { default tactics { refine Refl; solve; } prfBC : b = c } -> Nat foo {t} a {prfA = p} b c {prfBC} = b
test/reg018/reg018d.idr view
@@ -3,10 +3,10 @@ total pull : Fin (S n) -> Vect (S n) a -> (a, Vect n a) pull {n=Z} _ (x :: xs) = (x, xs)--- pull {n=S q} fZ (Vect.(::) {n=S _} x xs) = (x, xs)-pull {n=S _} (fS n) (x :: xs) =+-- pull {n=S q} FZ (Vect.(::) {n=S _} x xs) = (x, xs)+pull {n=S _} (FS n) (x :: xs) = let (v, vs) = pull n xs in (v, x::vs) main : IO ()-main = print (pull fZ [0, 1, 2])+main = print (pull FZ [0, 1, 2])
test/reg025/reg025.idr view
@@ -21,22 +21,22 @@ FullBoard : Board n -> Type FullBoard (MkBoard b) = All (All Filled) b -indexStep : {i : Fin n} -> {xs : Vect n a} -> {x : a} -> index i xs = index (fS i) (x::xs)-indexStep = refl+indexStep : {i : Fin n} -> {xs : Vect n a} -> {x : a} -> index i xs = index (FS i) (x::xs)+indexStep = Refl find : {P : a -> Type} -> ((x : a) -> Dec (P x)) -> (xs : Vect n a) -> Either (All (\x => Not (P x)) xs) (y : a ** (P y, (i : Fin n ** y = index i xs))) find _ Nil = Left Nil find {P} d (x::xs) with (d x)- | Yes prf = Right (x ** (prf, (fZ ** refl)))+ | Yes prf = Right (x ** (prf, (FZ ** Refl))) | No prf = case find {P} d xs of Right (y ** (prf', (i ** prf''))) =>- Right (y ** (prf', (fS i ** replace {P=(\x => y = x)} (indexStep {x=x}) prf'')))+ Right (y ** (prf', (FS i ** replace {P=(\x => y = x)} (indexStep {x=x}) prf''))) Left prf' => Left (prf::prf') empty : (cell : Cell n) -> Dec (Empty cell)-empty Nothing = Yes refl+empty Nothing = Yes Refl empty (Just _) = No nothingNotJust findEmptyInRow : (xs : Vect n (Cell n)) -> Either (All Filled xs) (i : Fin n ** Empty (index i xs))@@ -60,11 +60,11 @@ helper Nil = Left Nil helper (r::rs) = case findEmptyInRow r of- Right (ci ** pf3) => Right (fZ ** (ci ** pf3))+ Right (ci ** pf3) => Right (FZ ** (ci ** pf3)) Left prf => case helper rs of Left prf' => Left (prf::prf')- Right (ri ** (ci ** pf4)) => Right (fS ri ** (ci ** pf4))+ Right (ri ** (ci ** pf4)) => Right (FS ri ** (ci ** pf4)) main : IO ()
test/reg026/reg026.idr view
@@ -1,7 +1,7 @@ module Test X : Nat -> Type-X t = (c : Nat ** so (c < 5))+X t = (c : Nat ** So (c < 5)) column : X t -> Nat column = getWitness
test/reg034/reg034.idr view
@@ -3,8 +3,8 @@ bar : (xs : List ()) -> (ys : List ()) -> Prelude.List.length xs = Prelude.List.length ys -> xs = ys-bar xs xs refl = refl+bar xs xs Refl = Refl foo : (f : Nat -> Nat) -> (x : Nat) -> (y : Nat) -> f x = f y -> x = y-foo f x x refl = refl+foo f x x Refl = Refl
test/reg035/reg035.idr view
@@ -2,10 +2,10 @@ (a1 : a) -> (a2 : a) -> (m : (x : a) -> (y : a) -> x = y -> Type) ->- (f : (x : a) -> m x x refl) ->+ (f : (x : a) -> m x x Refl) -> (id : a1 = a2) -> m a1 a2 id-elimId _ x _ _ f refl = f x+elimId _ x _ _ f Refl = f x tran : (a : Type) -> (b : a) -> (c : a) -> (d : a) -> (e : b = c) -> (f : c = d) -> b = d
test/reg035/reg035a.lidr view
@@ -6,9 +6,9 @@ > (q : beta -> Bool) -> > (a : alpha) -> > (b : beta) ->-> so (p a) ->-> so (q b) ->-> so (p a && q b)+> So (p a) ->+> So (q b) ->+> So (p a && q b) > hasNoDuplicates : (Eq alpha) => List alpha -> Bool > hasNoDuplicates as = as == nub as@@ -33,7 +33,7 @@ > postulate reflexive_Set_eqeq : (Eq a) => > (as : Set a) -> -> so (as == as)+> So (as == as) > unwrap : Set a -> List a > unwrap (setify as) = as@@ -53,14 +53,14 @@ > partitionLemma0 : (Eq alpha) => > (ass : Set (Set alpha)) -> -> so (arePairwiseDisjoint ass) ->-> so (ass `isPartition` union ass)+> So (arePairwiseDisjoint ass) ->+> So (ass `isPartition` union ass) > partitionLemma0 ass asspd = (soAndIntro (\ xss => arePairwiseDisjoint xss) > (\ xs => union ass == xs) > ass > (union ass) > asspd > uasseqas) where-> uasseqas : so (union ass == union ass)+> uasseqas : So (union ass == union ass) > uasseqas = reflexive_Set_eqeq (union ass)
test/reg035/reg035b.idr view
@@ -6,6 +6,6 @@ fins : (n : Nat) -> (xs : Vect n (Fin n) ** ((x : Fin n) -> Elem x xs)) fins Z = ([] ** (finZEmpty {a=_})) --- f : (a : Nat) -> a = S a -> _|_+-- f : (a : Nat) -> a = S a -> Void -- f a = believe_me
test/reg041/ott.idr view
@@ -11,7 +11,7 @@ El : U -> Type El u = U- El zero = _|_+ El zero = Void El one = () El two = Bool El (pi s t) = (x : El s) -> El (t x)
test/reg044/reg044.idr view
@@ -3,4 +3,4 @@ pf = proof intros- refine refl+ refine Refl
test/reg047/reg047.idr view
@@ -8,11 +8,11 @@ Id : (A : Type) -> A -> A -> Type Id A = (=) {a0 = A} {b0 = A} -Refl : (A : Type) -> (a : A) -> Id A a a-Refl A a = refl {a}+IdRefl : (A : Type) -> (a : A) -> Id A a a+IdRefl A a = Refl {a} zzz : Id Nat zero zero-zzz = Refl Nat zero+zzz = IdRefl Nat zero eep : TTSigma Nat (\ a => Id Nat a zero) eep = sigma Nat (\ a => Id Nat a zero) zero zzz
test/reg047/reg047a.idr view
@@ -8,17 +8,17 @@ Id : (A : Type) -> A -> A -> Type Id = \A,x,y => x = y -- {a = A} {b = A} -Refl : (A : Type) -> (a : A) -> Id A a a-Refl A a = refl {a}+IdRefl : (A : Type) -> (a : A) -> Id A a a+IdRefl A a = Refl {a} zzzz : Id MNat zero zero-zzzz = Refl MNat zero+zzzz = IdRefl MNat zero eep : TTSigma MNat (\ c => Id MNat c zero) eep = (sigma MNat (\b => Id MNat b zero) zero zzzz) eep2 : TTSigma MNat (\ c => Id MNat c zero)-eep2 = (sigma MNat (\b => Id MNat b zero) zero (Refl MNat zero))+eep2 = (sigma MNat (\b => Id MNat b zero) zero (IdRefl MNat zero))
− test/reg048/test.idr
@@ -1,26 +0,0 @@-module Main-import Data.SortedMap--test : List Int -> IO ()-test xs = do let lst = Data.SortedMap.toList mp- putStrLn (show lst)---- if length lst /= n --- then putStrLn $ "wrong length for " ++ show xs--- else do let res = map (\x => lookup x mp) xs--- let found = mapMaybe id res--- if length found /= n --- then putStrLn $ "some lost in " ++ show xs ++ ": res=" ++ show res --- ++ " toList=" ++ show lst--- else return ()-- where - mp : SortedMap Int ()- mp = foldr (\x => \m => insert x () m) empty xs--- n : Nat--- n = length xs--main : IO ()-main = do test [4,1,3,2]- test [4,3,2,1]- test [1,2,3,4]
test/reg049/expected view
@@ -1,2 +1,2 @@ reg049.idr:2:9:When elaborating constructor Main.Bogus:-{__False0} is not Main.Foo+Void is not Main.Foo
test/reg049/reg049.idr view
@@ -1,5 +1,5 @@ data Foo : Type where- Bogus : _|_+ Bogus : Void -uhOh : _|_+uhOh : Void uhOh = Bogus
+ test/reg052/expected view
@@ -0,0 +1,1 @@+000000000000002A
+ test/reg052/reg052.idr view
@@ -0,0 +1,8 @@+impure_op : Bits64 -> IO Bits64+impure_op foo = return $ foo + 1++impure_int : IO Int+impure_int = return 41++main : IO ()+main = impure_int >>= impure_op . prim__zextInt_B64 >>= print
+ test/reg052/run view
@@ -0,0 +1,4 @@+#!/usr/bin/env bash+idris $@ -o reg052 reg052.idr+./reg052+rm -f reg052 *.ibc
+ test/reg053/expected view
+ test/reg053/four.idr view
@@ -0,0 +1,9 @@+module FourFunctor++data FourFunctor y = Four y y y y++traverseFourFunctor : Applicative f -> + (x -> f b) -> FourFunctor x -> f (FourFunctor b)+traverseFourFunctor constr f (Four w x y z) + = pure Four <$> (f w) <$> (f x) <$> (f y) <$> (f z)+
+ test/reg053/run view
@@ -0,0 +1,3 @@+#!/usr/bin/env bash+idris $@ --check four.idr +rm -f *.ibc
test/totality002/test017.idr view
@@ -82,9 +82,9 @@ maxCommutative : (left : Nat) -> (right : Nat) -> maximum left right = maximum right left-maxCommutative Z Z = refl-maxCommutative (S left) Z = refl-maxCommutative Z (S right) = refl+maxCommutative Z Z = Refl+maxCommutative (S left) Z = Refl+maxCommutative Z (S right) = Refl maxCommutative (S left) (S right) = let inductiveHypothesis = maxCommutative left right in ?maxCommutativeStepCase
test/totality002/test017b.idr view
@@ -1,5 +1,5 @@ module foo -total foo : _|_+total foo : Void foo = foo
test/totality006/expected view
@@ -1,2 +1,2 @@ totality006.idr:6:1:Main.prf is not total as there are missing cases-totality006a.idr:9:6:prf' (S _) (S _) oh is a valid case+totality006a.idr:9:6:prf' (S _) (S _) Oh is a valid case
test/totality006/totality006.idr view
@@ -1,11 +1,11 @@-antitrue : so False -> a-antitrue oh impossible+antitrue : So False -> a+antitrue Oh impossible total-prf : (a:Nat) -> (b:Nat) -> so (a > b) -> GT a b-prf Z Z oh impossible+prf : (a:Nat) -> (b:Nat) -> So (a > b) -> GT a b+prf Z Z Oh impossible prf Z (S k) um = antitrue um-prf (S k) Z um = lteSucc lteZero --- prf (S _) (S _) oh impossible+prf (S k) Z um = LTESucc LTEZero +-- prf (S _) (S _) Oh impossible
test/totality006/totality006a.idr view
@@ -1,10 +1,10 @@-antitrue : so False -> a-antitrue oh impossible+antitrue : So False -> a+antitrue Oh impossible total-prf' : (a:Nat) -> (b:Nat) -> so (a > b) -> GT a b-prf' Z Z oh impossible+prf' : (a:Nat) -> (b:Nat) -> So (a > b) -> GT a b+prf' Z Z Oh impossible prf' Z (S k) um = antitrue um-prf' (S k) Z um = lteSucc lteZero -prf' (S _) (S _) oh impossible+prf' (S k) Z um = LTESucc LTEZero +prf' (S _) (S _) Oh impossible
test/tutorial004/tutorial004.idr view
@@ -1,38 +1,38 @@ fiveIsFive : 5 = 5-fiveIsFive = refl+fiveIsFive = Refl twoPlusTwo : 2 + 2 = 4-twoPlusTwo = refl+twoPlusTwo = Refl -total disjoint : (n : Nat) -> Z = S n -> _|_+total disjoint : (n : Nat) -> Z = S n -> Void disjoint n p = replace {P = disjointTy} p () where disjointTy : Nat -> Type disjointTy Z = ()- disjointTy (S k) = _|_+ disjointTy (S k) = Void -total acyclic : (n : Nat) -> n = S n -> _|_+total acyclic : (n : Nat) -> n = S n -> Void acyclic Z p = disjoint _ p acyclic (S k) p = acyclic k (succInjective _ _ p) -empty1 : _|_+empty1 : Void empty1 = hd [] where hd : List a -> a hd (x :: xs) = x -empty2 : _|_+empty2 : Void empty2 = empty2 plusReduces : (n:Nat) -> plus Z n = n-plusReduces n = refl+plusReduces n = Refl plusReducesZ : (n:Nat) -> n = plus n Z-plusReducesZ Z = refl+plusReducesZ Z = Refl plusReducesZ (S k) = cong (plusReducesZ k) plusReducesS : (n:Nat) -> (m:Nat) -> S (plus n m) = plus n (S m)-plusReducesS Z m = refl+plusReducesS Z m = Refl plusReducesS (S k) m = cong (plusReducesS k m) plusReducesZ' : (n:Nat) -> n = plus n Z