wasmslop
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
{-# LANGUAGE OverloadedLists #-}
|
||||
module Gyehoek.CPS.Convert
|
||||
( convert
|
||||
) where
|
||||
@@ -29,9 +30,21 @@ convert (Scm.ExpPrim p) k =
|
||||
r <- gensym' "r"
|
||||
ExpPrim p' [r] . pure <$> k (ValVar r)
|
||||
|
||||
convert (Scm.ExpLambda xs e) k = do
|
||||
f <- gensym' "f"
|
||||
ktail <- gensym' "ktail"
|
||||
m <- convert e $ \e' ->
|
||||
pure $ ExpApply (ValVar ktail) [e']
|
||||
ExpFix [(f, MkKappa (xs ++ [ktail]) m)] <$> k (ValVar f)
|
||||
|
||||
convert (Scm.ExpApply f xs) k =
|
||||
telescope (convert @es) (f:|xs) \(f':|xs') -> do
|
||||
_
|
||||
_
|
||||
r <- gensym' "r"
|
||||
x <- gensym' "x"
|
||||
m <- k (ValVar x)
|
||||
pure $ ExpFix [(r, MkKappa [x] m)] $ ExpApply f' (xs' ++ [ValVar r])
|
||||
|
||||
convert _ k = _
|
||||
|
||||
halt :: Applicative f => Val -> f Exp
|
||||
halt = pure . ExpApply (ValVar "halt") . pure
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
{-# LANGUAGE OverloadedLists #-}
|
||||
module Gyehoek.CPS.Lower
|
||||
( lower
|
||||
) where
|
||||
|
||||
import Gyehoek.CPS.Syntax
|
||||
import Gyehoek.Scheme.Syntax qualified as Scm
|
||||
import Gyehoek.GenSym
|
||||
import Data.List.NonEmpty (NonEmpty((:|)))
|
||||
import Effectful
|
||||
import Control.Monad.Cont qualified as Cont
|
||||
import Effectful.Writer.Static.Local
|
||||
import Data.Text (Text)
|
||||
import Data.Vector.Strict (Vector)
|
||||
import Control.Lens
|
||||
import Data.Foldable
|
||||
|
||||
|
||||
type Emit = Writer (Vector Text)
|
||||
|
||||
runEmit :: Eff (Emit : es) a -> Eff es (a, Text)
|
||||
runEmit = (mapped . _2 %~ fold) . runWriter
|
||||
|
||||
lower :: Exp -> Eff _ _
|
||||
lower = _
|
||||
Reference in New Issue
Block a user