something

This commit is contained in:
crumbtoo
2024-02-04 18:59:48 -07:00
parent 21d13ea73b
commit 0fc82f3fa8
3 changed files with 42 additions and 7 deletions

View File

@@ -11,6 +11,7 @@ module Rlp.Syntax
, progDecls , progDecls
, Decl(..), Decl', RlpExpr(..), RlpExpr' , Decl(..), Decl', RlpExpr(..), RlpExpr'
, Pat(..), Pat' , Pat(..), Pat'
, Alt(..)
, Assoc(..) , Assoc(..)
, Lit(..), Lit' , Lit(..), Lit'
, RlpType(..), RlpType' , RlpType(..), RlpType'
@@ -19,7 +20,7 @@ module Rlp.Syntax
-- * Trees That Grow boilerplate -- * Trees That Grow boilerplate
-- ** Extension points -- ** Extension points
, IdP, XRec, UnXRec(..), MapXRec(..) , IdP, IdP', XRec, UnXRec(..), MapXRec(..)
-- *** Decl -- *** Decl
, XFunD, XTySigD, XInfixD, XDataD, XXDeclD , XFunD, XTySigD, XInfixD, XDataD, XXDeclD
-- *** RlpExpr -- *** RlpExpr
@@ -36,6 +37,10 @@ module Rlp.Syntax
-- *** RlpType -- *** RlpType
, pattern FunConT'', pattern FunT'', pattern AppT'', pattern VarT'' , pattern FunConT'', pattern FunT'', pattern AppT'', pattern VarT''
, pattern ConT'' , pattern ConT''
-- *** Pat
, pattern VarP'', pattern LitP'', pattern ConP''
-- ** NoLocated
, NoLocated
) )
where where
---------------------------------------------------------------------------------- ----------------------------------------------------------------------------------
@@ -223,6 +228,8 @@ type family XRec p a = (r :: Type) | r -> p a
type family IdP p type family IdP p
type IdP' p = XRec p (IdP p)
type Where p = [Binding p] type Where p = [Binding p]
-- do we want guards? -- do we want guards?
@@ -242,6 +249,14 @@ data Pat p = VarP (IdP p)
| LitP (Lit' p) | LitP (Lit' p)
| ConP (IdP p) [Pat' p] | ConP (IdP p) [Pat' p]
pattern VarP'' :: (UnXRec p) => IdP p -> Pat' p
pattern LitP'' :: (UnXRec p) => Lit' p -> Pat' p
pattern ConP'' :: (UnXRec p) => IdP p -> [Pat' p] -> Pat' p
pattern VarP'' n <- (unXRec -> VarP n)
pattern LitP'' l <- (unXRec -> LitP l)
pattern ConP'' c as <- (unXRec -> ConP c as)
deriving instance (PhaseShow p) => Show (Pat p) deriving instance (PhaseShow p) => Show (Pat p)
type Pat' p = XRec p (Pat p) type Pat' p = XRec p (Pat p)
@@ -284,6 +299,10 @@ makeLenses ''RlpModule
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
-- stripLocation :: (UnXRec p) => XRec p a -> f NoLocated data NoLocated
-- stripLocation p = undefined
type instance XRec NoLocated a = Identity a
stripLocation :: (UnXRec p) => XRec p a -> f NoLocated
stripLocation p = undefined

6
src/Rlp/TH.hs Normal file
View File

@@ -0,0 +1,6 @@
module Rlp.TH
( rlpProg
, rlpExpr
)
where

View File

@@ -7,17 +7,20 @@ import Control.Monad
import Control.Monad.Writer.CPS import Control.Monad.Writer.CPS
import Control.Arrow import Control.Arrow
import Control.Applicative import Control.Applicative
import Lens.Micro import Control.Comonad
import Lens.Micro.Internal -- import Lens.Micro
-- import Lens.Micro.Internal
import Control.Lens
import Data.Text (Text) import Data.Text (Text)
import Data.Text qualified as T import Data.Text qualified as T
import Data.HashMap.Strict qualified as H import Data.HashMap.Strict qualified as H
import Data.Monoid (Endo(..)) import Data.Monoid (Endo(..))
import Data.Foldable import Data.Foldable
import Data.Functor.Bind
import Core.Syntax as Core import Core.Syntax as Core
import Rlp.Syntax as Rlp import Rlp.Syntax as Rlp
import Rlp.Parse.Types (RlpcPs) import Rlp.Parse.Types (RlpcPs, PsName)
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
-- the rl' program is desugared by desugaring each declaration as a separate -- the rl' program is desugared by desugaring each declaration as a separate
@@ -38,7 +41,14 @@ declToCore (DataD'' n as ds) = fold . getZipList $
-- arguments -- arguments
t' = foldl TyApp (TyCon n) (TyVar . dsNameToName <$> as) t' = foldl TyApp (TyCon n) (TyVar . dsNameToName <$> as)
declToCore (FunD'' n as e wh) = mempty & declToCore fd@(FunD'' n as e wh) = undefined
caseify :: IdP' RlpcPs -> RlpExpr' RlpcPs -> Pat' RlpcPs
-> (RlpExpr RlpcPs, Pat RlpcPs)
caseify x e p = (e', p') where
p' = VarP (extract x)
e' = CaseE (VarE <$> x) [(alt, [])]
alt = AltA p e
constructorToCore :: Type -> Tag -> ConAlt RlpcPs -> Program' constructorToCore :: Type -> Tag -> ConAlt RlpcPs -> Program'
constructorToCore t tag (ConAlt cn as) = constructorToCore t tag (ConAlt cn as) =