summaryrefslogtreecommitdiff
path: root/src/AST.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/AST.hs')
-rw-r--r--src/AST.hs16
1 files changed, 13 insertions, 3 deletions
diff --git a/src/AST.hs b/src/AST.hs
index 4d642ba..3179d92 100644
--- a/src/AST.hs
+++ b/src/AST.hs
@@ -91,6 +91,11 @@ data Expr x env t where
EVar :: x t -> STy t -> Idx env t -> Expr x env t
ELet :: x t -> Expr x env a -> Expr x (a : env) t -> Expr x env t
+ -- base types
+ EPair :: x (TPair a b) -> Expr x env a -> Expr x env b -> Expr x env (TPair a b)
+ EFst :: x a -> STy b -> Expr x env (TPair a b) -> Expr x env a
+ ESnd :: x b -> STy a -> Expr x env (TPair a b) -> Expr x env b
+
-- array operations
EBuild1 :: x (TArr (S Z) t) -> Expr x env TIx -> Expr x (TIx : env) t -> Expr x env (TArr (S Z) t)
EBuild :: x (TArr n t) -> SNat n -> Vec n (Expr x env TIx) -> Expr x (ConsN n TIx env) t -> Expr x env (TArr n t)
@@ -103,7 +108,10 @@ data Expr x env t where
EOp :: x t -> SOp a t -> Expr x env a -> Expr x env t
-- EVM operations
- EMOne :: Idx venv t -> Expr x env t -> Expr x env (TEVM venv TNil)
+ EMOne :: SList STy venv -> Idx venv t -> Expr x env t -> Expr x env (TEVM venv TNil)
+ EMScope :: Expr x env (TEVM (t : venv) a) -> Expr x env (TEVM venv (TPair a t))
+ EMReturn :: SList STy venv -> Expr x env t -> Expr x env (TEVM venv t)
+ EMBind :: Expr x env (TEVM venv a) -> Expr x (a : env) (TEVM venv b) -> Expr x env (TEVM venv b)
deriving instance (forall ty. Show (x ty)) => Show (Expr x env t)
type SOp :: Ty -> Ty -> Type
@@ -141,7 +149,7 @@ typeOf = \case
EIdx _ e _ | STArr _ t <- typeOf e -> t
EOp _ op _ -> opt2 op
- EMOne _ _ -> STEVM _ STNil
+ EMOne t _ _ -> STEVM t STNil
unSNat :: SNat n -> Nat
unSNat SZ = Z
@@ -175,6 +183,7 @@ data env :> env' where
WId :: env :> env
WSink :: env :> (t : env)
WCopy :: env :> env' -> (t : env) :> (t : env')
+ WPop :: (t : env) :> env' -> env :> env'
WThen :: env1 :> env2 -> env2 :> env3 -> env1 :> env3
deriving instance Show (env :> env')
@@ -187,6 +196,7 @@ WId @> i = i
WSink @> i = IS i
WCopy _ @> IZ = IZ
WCopy w @> (IS i) = IS (w @> i)
+WPop w @> i = w @> IS i
WThen w1 w2 @> i = w2 @> w1 @> i
weakenExpr :: env :> env' -> Expr x env t -> Expr x env' t
@@ -200,7 +210,7 @@ weakenExpr w = \case
EIdx1 x e1 e2 -> EIdx1 x (weakenExpr w e1) (weakenExpr w e2)
EIdx x e1 es -> EIdx x (weakenExpr w e1) (weakenVec w es)
EOp x op e -> EOp x op (weakenExpr w e)
- EMOne i e -> EMOne i (weakenExpr w e)
+ EMOne t i e -> EMOne t i (weakenExpr w e)
wcopyN :: SNat n -> env :> env' -> ConsN n TIx env :> ConsN n TIx env'
wcopyN SZ w = w