@@ -13,9 +13,14 @@ import Core.TT
1313import Core.Value
1414
1515import Data.List
16+ import Data.SnocList
1617import Data.Maybe
1718import Data.Vect
1819
20+ import Libraries.Data.List.SizeOf
21+ import Libraries.Data.SnocList.SizeOf
22+ import Libraries.Data.SnocList.Extra
23+
1924%default covering
2025
2126data Args
@@ -40,7 +45,7 @@ numArgs defs (Ref _ _ n)
4045 _ => pure (Arity 0 )
4146numArgs _ tm = pure (Arity 0 )
4247
43- mkSub : Nat -> (ns : List Name ) -> List Nat -> (ns' ** Thin ns' ns)
48+ mkSub : Nat -> (ns : Scope ) -> List Nat -> (ns' ** Thin ns' ns)
4449mkSub i _ [] = (_ ** Refl )
4550mkSub i [] ns = (_ ** Refl )
4651mkSub i (x :: xs) es
@@ -319,7 +324,7 @@ mutual
319324 where
320325 mkSubst : Nat -> CExp vs ->
321326 Nat -> (args : List Name) -> (SizeOf args, SubstCEnv args vs)
322- mkSubst _ _ _ [] = (zero, [] )
327+ mkSubst _ _ _ [] = (zero, ScopeEmpty )
323328 mkSubst i scr pos (a :: as)
324329 = let (s, env) = mkSubst (1 + i) scr pos as in
325330 if i == pos
@@ -386,8 +391,8 @@ mutual
386391
387392-- Need this for ensuring that argument list matches up to operator arity for
388393-- builtins
389- data ArgList : Nat -> List Name -> Type where
390- NoArgs : ArgList Z []
394+ data ArgList : Nat -> Scope -> Type where
395+ NoArgs : ArgList Z ScopeEmpty
391396 ConsArg : (a : Name) -> ArgList k as -> ArgList (S k) (a :: as)
392397
393398mkArgList : Int -> (n : Nat ) -> (ns ** ArgList n ns)
@@ -397,17 +402,17 @@ mkArgList i (S k)
397402 (_ ** ConsArg (MN " arg" i) rec)
398403
399404data NArgs : Type where
400- User : Name -> List (Closure []) -> NArgs
401- Struct : String -> List (String, Closure [] ) -> NArgs
405+ User : Name -> List ClosedClosure -> NArgs
406+ Struct : String -> List (String, ClosedClosure ) -> NArgs
402407 NUnit : NArgs
403408 NPtr : NArgs
404409 NGCPtr : NArgs
405410 NBuffer : NArgs
406411 NForeignObj : NArgs
407- NIORes : Closure [] -> NArgs
412+ NIORes : ClosedClosure -> NArgs
408413
409414getPArgs : {auto c : Ref Ctxt Defs} ->
410- Defs -> Closure [] -> Core (String, Closure [] )
415+ Defs -> ClosedClosure -> Core (String, ClosedClosure )
411416getPArgs defs cl
412417 = do NDCon fc _ _ _ args <- evalClosure defs cl
413418 | nf => throw (GenericMsg (getLoc nf) " Badly formed struct type" )
@@ -419,7 +424,7 @@ getPArgs defs cl
419424 _ => throw (GenericMsg fc " Badly formed struct type" )
420425
421426getFieldArgs : {auto c : Ref Ctxt Defs} ->
422- Defs -> Closure [] -> Core (List (String, Closure [] ))
427+ Defs -> ClosedClosure -> Core (List (String, ClosedClosure ))
423428getFieldArgs defs cl
424429 = do NDCon fc _ _ _ args <- evalClosure defs cl
425430 | nf => throw (GenericMsg (getLoc nf) " Badly formed struct type" )
@@ -433,7 +438,7 @@ getFieldArgs defs cl
433438 _ => pure []
434439
435440getNArgs : {auto c : Ref Ctxt Defs} ->
436- Defs -> Name -> List (Closure []) -> Core NArgs
441+ Defs -> Name -> List ClosedClosure -> Core NArgs
437442getNArgs defs (NS _ (UN $ Basic " IORes" )) [arg] = pure $ NIORes arg
438443getNArgs defs (NS _ (UN $ Basic " Ptr" )) [arg] = pure NPtr
439444getNArgs defs (NS _ (UN $ Basic " AnyPtr" )) [] = pure NPtr
@@ -449,7 +454,7 @@ getNArgs defs (NS _ (UN $ Basic "Struct")) [n, args]
449454getNArgs defs n args = pure $ User n args
450455
451456nfToCFType : {auto c : Ref Ctxt Defs} ->
452- FC -> (inStruct : Bool ) -> NF [] -> Core CFType
457+ FC -> (inStruct : Bool ) -> ClosedNF -> Core CFType
453458nfToCFType _ _ (NPrimVal _ $ PrT IntType ) = pure CFInt
454459nfToCFType _ _ (NPrimVal _ $ PrT IntegerType ) = pure CFInteger
455460nfToCFType _ _ (NPrimVal _ $ PrT Bits8Type ) = pure CFUnsigned8
@@ -469,15 +474,15 @@ nfToCFType _ _ (NPrimVal _ $ PrT WorldType) = pure CFWorld
469474nfToCFType _ False (NBind fc _ (Pi _ _ _ ty) sc)
470475 = do defs <- get Ctxt
471476 sty <- nfToCFType fc False ! (evalClosure defs ty)
472- sc' <- sc defs (toClosure defaultOpts [] (Erased fc Placeholder ))
477+ sc' <- sc defs (toClosure defaultOpts ScopeEmpty (Erased fc Placeholder ))
473478 tty <- nfToCFType fc False sc'
474479 pure (CFFun sty tty)
475480nfToCFType _ True (NBind fc _ _ _ )
476481 = throw (GenericMsg fc " Function types not allowed in a foreign struct" )
477482nfToCFType _ s (NTCon fc n_in _ _ args)
478483 = do defs <- get Ctxt
479484 n <- toFullNames n_in
480- case ! (getNArgs defs n $ map snd args) of
485+ case ! (getNArgs defs n $ toList ( map snd args) ) of
481486 User un uargs =>
482487 do nargs <- traverse (evalClosure defs) uargs
483488 cargs <- traverse (nfToCFType fc s) nargs
@@ -504,24 +509,24 @@ nfToCFType _ s (NErased _ _)
504509 = pure (CFUser (UN (Basic " __" )) [])
505510nfToCFType fc s t
506511 = do defs <- get Ctxt
507- ty <- quote defs [] t
512+ ty <- quote defs ScopeEmpty t
508513 throw (GenericMsg (getLoc t)
509514 (" Can't marshal type for foreign call " ++
510515 show ! (toFullNames ty)))
511516
512517getCFTypes : {auto c : Ref Ctxt Defs} ->
513- List CFType -> NF [] ->
518+ List CFType -> ClosedNF ->
514519 Core (List CFType, CFType)
515520getCFTypes args (NBind fc _ (Pi _ _ _ ty) sc)
516521 = do defs <- get Ctxt
517522 aty <- nfToCFType fc False ! (evalClosure defs ty)
518- sc' <- sc defs (toClosure defaultOpts [] (Erased fc Placeholder ))
523+ sc' <- sc defs (toClosure defaultOpts ScopeEmpty (Erased fc Placeholder ))
519524 getCFTypes (aty :: args) sc'
520525getCFTypes args t
521526 = pure (reverse args, ! (nfToCFType (getLoc t) False t))
522527
523- lamRHSenv : Int -> FC -> (ns : List Name ) -> (SizeOf ns, SubstCEnv ns [] )
524- lamRHSenv i fc [] = (zero, [] )
528+ lamRHSenv : Int -> FC -> (ns : Scope ) -> (SizeOf ns, SubstCEnv ns ScopeEmpty )
529+ lamRHSenv i fc [] = (zero, ScopeEmpty )
525530lamRHSenv i fc (n :: ns)
526531 = let (s, env) = lamRHSenv (i + 1 ) fc ns in
527532 (suc s, CRef fc (MN " x" i) :: env)
@@ -531,7 +536,7 @@ mkBounds [] = None
531536mkBounds (x :: xs) = Add x x (mkBounds xs)
532537
533538getNewArgs : {done : _} ->
534- SubstCEnv done args -> List Name
539+ SubstCEnv done args -> Scope
535540getNewArgs [] = []
536541getNewArgs (CRef _ n :: xs) = n :: getNewArgs xs
537542getNewArgs {done = x :: xs} (_ :: sub) = x :: getNewArgs sub
@@ -540,16 +545,16 @@ getNewArgs {done = x :: xs} (_ :: sub) = x :: getNewArgs sub
540545-- we have to assume arity 0 for incremental compilation because
541546-- we have no idea how it's defined, and when we made calls to the
542547-- function, they had arity 0.
543- lamRHS : (ns : List Name ) -> CExp ns -> CExp []
548+ lamRHS : (ns : Scope ) -> CExp ns -> ClosedCExp
544549lamRHS ns tm
545550 = let (s, env) = lamRHSenv 0 (getFC tm) ns
546551 tmExp = substs s env (rewrite appendNilRightNeutral ns in tm)
547552 newArgs = reverse $ getNewArgs env
548553 bounds = mkBounds newArgs
549- expLocs = mkLocals zero {vars = [] } bounds tmExp in
554+ expLocs = mkLocals zero {vars = ScopeEmpty } bounds tmExp in
550555 lamBind (getFC tm) _ expLocs
551556 where
552- lamBind : FC -> (ns : List Name ) -> CExp ns -> CExp []
557+ lamBind : FC -> (ns : Scope ) -> CExp ns -> ClosedCExp
553558 lamBind fc [] tm = tm
554559 lamBind fc (n :: ns) tm = lamBind fc ns (CLam fc n tm)
555560
@@ -566,7 +571,7 @@ toCDef n ty erased (PMDef pi args _ tree _)
566571 else MkFun args' (shrinkCExp p comptree)
567572 where
568573 toLam : Bool -> CDef -> CDef
569- toLam True (MkFun args rhs) = MkFun [] (lamRHS args rhs)
574+ toLam True (MkFun args rhs) = MkFun ScopeEmpty (lamRHS args rhs)
570575 toLam _ d = d
571576toCDef n ty _ (ExternDef arity)
572577 = let (ns ** args) = mkArgList 0 arity in
@@ -580,7 +585,7 @@ toCDef n ty _ (ExternDef arity)
580585 getVars (ConsArg a rest) = MkVar First :: map weakenVar (getVars rest)
581586toCDef n ty _ (ForeignDef arity cs)
582587 = do defs <- get Ctxt
583- (atys, retty) <- getCFTypes [] ! (nf defs [] ty)
588+ (atys, retty) <- getCFTypes [] ! (nf defs ScopeEmpty ty)
584589 pure $ MkForeign cs atys retty
585590toCDef n ty _ (Builtin {arity} op)
586591 = let (ns ** args) = mkArgList 0 arity in
@@ -595,7 +600,7 @@ toCDef n ty _ (Builtin {arity} op)
595600toCDef n _ _ (DCon tag arity pos)
596601 = do let nt = snd <$> pos
597602 defs <- get Ctxt
598- args <- numArgs {vars = [] } defs (Ref EmptyFC (DataCon tag arity) n)
603+ args <- numArgs {vars = ScopeEmpty } defs (Ref EmptyFC (DataCon tag arity) n)
599604 let arity' = case args of
600605 NewTypeBy ar _ => ar
601606 EraseArgs ar erased => ar `minus` length erased
@@ -620,7 +625,7 @@ toCDef n ty _ def
620625
621626export
622627compileExp : {auto c : Ref Ctxt Defs} ->
623- ClosedTerm -> Core (CExp [])
628+ ClosedTerm -> Core ClosedCExp
624629compileExp tm
625630 = do s <- newRef NextMN 0
626631 exp <- toCExp (UN $ Basic " main" ) tm
0 commit comments