9 | module Language.Reflection.Syntax
13 | import Language.Reflection
22 | FromString Name where
23 | fromString s = run (split ('.' ==) s) []
26 | run : List1 String -> List String -> Name
27 | run (h ::: []) [] = UN $
Basic h
28 | run (h ::: []) ns = NS (MkNS ns) (UN $
Basic h)
29 | run ll@(h ::: (y :: ys)) xs =
30 | run (assert_smaller ll $
y ::: ys) (h :: xs)
33 | Interpolation Name where
38 | isNil : Name -> Bool
39 | isNil (NS ns nm) = isNil nm
40 | isNil (UN $
Basic "Nil") = True
45 | isLin : Name -> Bool
46 | isLin (NS ns nm) = isLin nm
47 | isLin (UN $
Basic "Lin") = True
52 | isCons : Name -> Bool
53 | isCons (NS ns nm) = isCons nm
54 | isCons (UN $
Basic "::") = True
59 | isSnoc : Name -> Bool
60 | isSnoc (NS ns nm) = isSnoc nm
61 | isSnoc (UN $
Basic ":<") = True
69 | camelCase : Name -> String
70 | camelCase = concat . split ('.' ==) . show
78 | nameStr : Name -> String
79 | nameStr (UN $
Basic x) = x
80 | nameStr (UN $
Field x) = x
81 | nameStr (UN Underscore) = "_"
82 | nameStr (NS _ x) = nameStr x
83 | nameStr (MN x y) = x ++ show y
84 | nameStr (DN _ x) = nameStr x
85 | nameStr (Nested (x,y) n) = #"nested_\#{nameStr n}_\#{show x}_\#{show y}"#
86 | nameStr (CaseBlock x n) = #"case_n_\#{show x}"#
87 | nameStr (WithBlock x n) = #"with_n_\#{show x}"#
96 | interface Named a where
101 | (.getName) : a -> Name
103 | public export %inline
108 | public export %inline
109 | (.nameStr) : Named a => a -> String
110 | x.nameStr = nameStr x.getName
123 | public export %inline
124 | var : (name : Name) -> TTImp
128 | public export %inline
129 | (.nameVar) : Named a => a -> TTImp
130 | n.nameVar = var n.getName
133 | public export %inline
134 | varStr : String -> TTImp
135 | varStr = var . fromString
140 | public export %inline
141 | bindVar : Name -> TTImp
142 | bindVar = IBindVar EmptyFC
146 | public export %inline
147 | (.bindVar) : Named a => a -> TTImp
148 | x.bindVar = bindVar x.getName
153 | public export %inline
154 | implicitTrue : TTImp
155 | implicitTrue = Implicit EmptyFC True
160 | public export %inline
161 | implicitFalse : TTImp
162 | implicitFalse = Implicit EmptyFC False
167 | public export %inline
168 | primVal : (c : Constant) -> TTImp
169 | primVal = IPrimVal EmptyFC
173 | public export %inline
174 | (.namePrim) : Named a => a -> TTImp
175 | x.namePrim = primVal $
Str x.nameStr
180 | public export %inline
182 | type = IType EmptyFC
187 | public export %inline
188 | hole : String -> TTImp
189 | hole = IHole EmptyFC
195 | unVar : TTImp -> Maybe Name
196 | unVar (IVar _ n) = Just n
202 | public export %inline
203 | iSearch : (depth : Nat) -> TTImp
204 | iSearch = ISearch EmptyFC
216 | public export %inline
217 | app : (fun, arg : TTImp) -> TTImp
221 | unApp : TTImp -> (TTImp,List TTImp)
225 | run : List TTImp -> TTImp -> (TTImp,List TTImp)
226 | run xs (IApp _ y z) = run (z :: xs) y
232 | public export %inline
233 | appAll : Name -> List TTImp -> TTImp
234 | appAll fun = foldl app (var fun)
240 | public export %inline
241 | appNames : (fun : Name) -> (args : List Name) -> TTImp
242 | appNames fun = appAll fun . map var
249 | public export %inline
250 | bindAll : (fun : Name) -> (args : List Name) -> TTImp
251 | bindAll fun = appAll fun . map bindVar
254 | public export %inline
255 | bindHere : (mode : BindMode) -> (val : TTImp) -> TTImp
256 | bindHere = IBindHere EmptyFC
259 | public export %inline
260 | mustUnify : (reason : DotReason) -> (val : TTImp) -> TTImp
261 | mustUnify = IMustUnify EmptyFC
264 | public export %inline
265 | iAs : (side : UseSide) -> (name : Name) -> (val : TTImp) -> TTImp
266 | iAs = IAs EmptyFC EmptyFC
274 | public export %inline
275 | autoApp : (fun, arg : TTImp) -> TTImp
276 | autoApp = IAutoApp EmptyFC
279 | public export %inline
280 | (.@) : TTImp -> TTImp -> TTImp
286 | public export %inline
287 | withApp : (fun, arg : TTImp) -> TTImp
288 | withApp = IWithApp EmptyFC
296 | public export %inline
297 | namedApp : (fun : TTImp) -> (name : Name) -> (arg : TTImp) -> TTImp
298 | namedApp = INamedApp EmptyFC
305 | public export %inline
306 | bindAny : Named a => a -> TTImp
307 | bindAny n = namedApp n.nameVar (UN Underscore) implicitTrue
310 | public export %inline
311 | alternative : (tpe : AltType) -> (alts : List TTImp) -> TTImp
312 | alternative = IAlternative EmptyFC
324 | piInfo : PiInfo TTImp
329 | public export %inline
331 | arg = MkArg MW ExplicitArg Nothing
335 | public export %inline
336 | erasedArg : TTImp -> Arg
337 | erasedArg = MkArg M0 ExplicitArg Nothing
341 | public export %inline
342 | lambdaArg : Named a => a -> Arg
343 | lambdaArg n = MkArg MW ExplicitArg (Just n.getName) implicitFalse
346 | public export %inline
347 | erasedImplicit : Named a => a -> Arg
348 | erasedImplicit n = MkArg M0 ImplicitArg (Just n.getName) implicitFalse
352 | isExplicit : Arg -> Bool
353 | isExplicit (MkArg _ ExplicitArg _ _) = True
354 | isExplicit (MkArg _ _ _ _) = False
358 | isErased : Arg -> Bool
359 | isErased (MkArg M0 _ _ _) = True
365 | isExplicitUnerased : Arg -> Bool
366 | isExplicitUnerased (MkArg M1 ExplicitArg _ _) = True
367 | isExplicitUnerased (MkArg MW ExplicitArg _ _) = True
368 | isExplicitUnerased _ = False
372 | unPi : TTImp -> (List Arg, TTImp)
373 | unPi (IPi _ c p n at rt) = mapFst (MkArg c p n at ::) $
unPi rt
374 | unPi tpe = ([],tpe)
378 | unLambda : TTImp -> (List Arg, TTImp)
379 | unLambda (ILam _ c p n at rt) = mapFst (MkArg c p n at ::) $
unLambda rt
380 | unLambda tpe = ([],tpe)
390 | lam : (arg : Arg) -> (lamTy : TTImp) -> TTImp
391 | lam (MkArg c p n t) = ILam EmptyFC c p n t
401 | pi : (arg : Arg) -> (retTy : TTImp) -> TTImp
402 | pi (MkArg c p n t) = IPi EmptyFC c p n t
405 | public export %inline
406 | piAll : TTImp -> List Arg -> TTImp
407 | piAll res = foldr pi res
411 | public export %inline
412 | piAllImplicit : TTImp -> List Name -> TTImp
413 | piAllImplicit res = piAll res . map erasedImplicit
417 | piAllAuto : TTImp -> List TTImp -> TTImp
418 | piAllAuto res = piAll res . map (MkArg MW AutoImplicit Nothing)
427 | public export %inline
428 | impossibleClause : (lhs : TTImp) -> Clause
429 | impossibleClause = ImpossibleClause EmptyFC
435 | public export %inline
436 | patClause : (lhs : TTImp) -> (rhs : TTImp) -> Clause
437 | patClause = PatClause EmptyFC
442 | public export %inline
447 | -> (prf : Maybe (Count, Name))
448 | -> (flags : List WithFlag)
449 | -> (clauses : List Clause)
451 | withClause = WithClause EmptyFC
456 | public export %inline
457 | iCase : (sc : TTImp) -> (ty : TTImp) -> (clauses : List Clause) -> TTImp
458 | iCase = ICase EmptyFC []
463 | public export %inline
464 | as : Name -> TTImp -> TTImp
465 | as = IAs EmptyFC EmptyFC UseLeft
474 | public export %inline
475 | mkTy : (name : Name) -> (type : TTImp) -> ITy
476 | mkTy = MkTy EmptyFC . MkFCVal EmptyFC
482 | public export %inline
485 | -> (vis : Visibility)
486 | -> (opts : List FnOpt)
490 | claim c v opts n tp = IClaim $
MkFCVal EmptyFC $
MkIClaimData c v opts (mkTy n tp)
493 | public export %inline
494 | simpleClaim : Visibility -> Name -> TTImp -> Decl
495 | simpleClaim v = claim MW v []
498 | public export %inline
499 | public' : Name -> TTImp -> Decl
500 | public' = simpleClaim Public
503 | public export %inline
504 | private' : Name -> TTImp -> Decl
505 | private' = simpleClaim Private
508 | public export %inline
509 | export' : Name -> TTImp -> Decl
510 | export' = simpleClaim Export
513 | public export %inline
514 | directHint : Visibility -> Name -> TTImp -> Decl
515 | directHint v = claim MW v [Hint True]
518 | public export %inline
519 | interfaceHintOpts : Visibility -> List FnOpt -> Name -> TTImp -> Decl
520 | interfaceHintOpts v opts = claim MW v (Hint False :: opts)
523 | public export %inline
524 | interfaceHint : Visibility -> Name -> TTImp -> Decl
525 | interfaceHint v = claim MW v [Hint False]
530 | public export %inline
531 | def : Name -> List Clause -> Decl
541 | public export %inline
549 | iLet = ILet EmptyFC EmptyFC
554 | public export %inline
555 | local : (decls : List Decl) -> (scope : TTImp) -> TTImp
556 | local = ILocal EmptyFC
561 | public export %inline
562 | update : (updates : List IFieldUpdate) -> (arg : TTImp) -> TTImp
563 | update = IUpdate EmptyFC
577 | -> (opts : List DataOpt)
578 | -> (cons : List ITy)
580 | iData v n tycon opts cons =
581 | IData EmptyFC (specified v) Nothing (MkData EmptyFC n (Just tycon) opts cons)
592 | iDataLater v n tycon =
593 | IData EmptyFC (specified v) Nothing (MkLater EmptyFC n tycon)
599 | public export %inline
600 | simpleData : Visibility -> Name -> (cons : List ITy) -> Decl
601 | simpleData v n = iData v n type []
604 | public export %inline
605 | simpleDataPublic : Name -> (cons : List ITy) -> Decl
606 | simpleDataPublic = simpleData Public
609 | public export %inline
610 | simpleDataExport : Name -> (cons : List ITy) -> Decl
611 | simpleDataExport = simpleData Export
618 | public export %inline
619 | iRewrite : (eq,scope : TTImp) -> TTImp
620 | iRewrite = IRewrite EmptyFC
627 | public export %inline
628 | iDelayed : (reason : LazyReason) -> (arg : TTImp) -> TTImp
629 | iDelayed = IDelayed EmptyFC
632 | public export %inline
633 | iDelay : (arg : TTImp) -> TTImp
634 | iDelay = IDelay EmptyFC
637 | public export %inline
638 | iForce : (arg : TTImp) -> TTImp
639 | iForce = IForce EmptyFC
646 | public export %inline
647 | quote : TTImp -> TTImp
648 | quote = IQuote EmptyFC
651 | public export %inline
652 | quoteName : Name -> TTImp
653 | quoteName = IQuoteName EmptyFC
656 | public export %inline
657 | quoteDecl : List Decl -> TTImp
658 | quoteDecl = IQuoteDecl EmptyFC
661 | public export %inline
662 | unquote : TTImp -> TTImp
663 | unquote = IUnquote EmptyFC
673 | rec : List Name -> (tpe : TTImp) -> Bool
674 | rec nms (IVar fc nm1) = nm1 `elem` nms
675 | rec nms (IApp fc s t) = rec nms s || rec nms t
676 | rec nms (INamedApp fc s _ t) = rec nms s || rec nms t
677 | rec nms (IAutoApp fc s t) = rec nms s || rec nms t
678 | rec nms (IDelayed _ LLazy t) = rec nms t
684 | assertIfRec : List Name -> (tpe : TTImp) -> (expr : TTImp) -> TTImp
685 | assertIfRec nms tpe expr =
686 | if rec nms tpe then var "assert_total" `app` expr else expr
697 | public export %inline
698 | listOf : Foldable t => t TTImp -> TTImp
699 | listOf = foldr (\e,acc => `(~(e) ::
~(acc))) `( Nil
)
701 | private errMsg : Name -> List (Name,TTImp) -> String
702 | errMsg n [] = show n ++ " is not in scope."
704 | let rest := concat $
intersperse ", " $
map (show . fst) xs
705 | in show n ++ " is not unique: " ++ rest
707 | lookupRefinedName : Elaboration m => (prev : List (Name, TTImp)) -> Name -> m (Name, TTImp)
708 | lookupRefinedName prev n = case !(getType n) of
710 | [] => fail $
errMsg n prev
711 | ps => fail $
errMsg n ps
715 | lookupName : Elaboration m => Name -> m (Name, TTImp)
721 | UN _ => inCurrentNS n >>= lookupRefinedName ps
722 | _ => fail $
errMsg n ps