case unrolling

This commit is contained in:
crumbtoo
2024-02-06 13:39:01 -07:00
parent 15884336f1
commit 2895e3cb48
6 changed files with 36 additions and 12 deletions

3
.ghci
View File

@@ -22,6 +22,3 @@ _reload_and_make _ = do
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
-- import rlpc quasiquoters
:m + Core.TH Rlp.TH

View File

@@ -84,6 +84,7 @@ library
OverloadedStrings OverloadedStrings
TypeFamilies TypeFamilies
LambdaCase LambdaCase
ViewPatterns
executable rlpc executable rlpc
import: warnings import: warnings

View File

@@ -121,7 +121,7 @@ data Rec = Rec
data AltCon = AltData Name data AltCon = AltData Name
| AltTag Tag | AltTag Tag
| AltLit Lit | AltLit Lit
| Default | AltDefault
deriving (Show, Read, Eq, Lift) deriving (Show, Read, Eq, Lift)
newtype Lit = IntL Int newtype Lit = IntL Int

View File

@@ -154,11 +154,19 @@ Params : {- epsilon -} { [] }
| Params Pat1 { $1 `snoc` $2 } | Params Pat1 { $1 `snoc` $2 }
Pat :: { Pat' RlpcPs } Pat :: { Pat' RlpcPs }
: Pat1 { $1 } : Con Pat1s { $1 =>> \cn ->
ConP (extract $1) $2 }
| Pat1 { $1 }
Pat1s :: { [Pat' RlpcPs] }
: Pat1s Pat1 { $1 `snoc` $2 }
| Pat1 { [$1] }
Pat1 :: { Pat' RlpcPs } Pat1 :: { Pat' RlpcPs }
: Var { fmap VarP $1 } : Con { fmap (`ConP` []) $1 }
| Var { fmap VarP $1 }
| Lit { LitP <<= $1 } | Lit { LitP <<= $1 }
| '(' Pat ')' { $1 .> $2 <. $3 }
Expr :: { RlpExpr' RlpcPs } Expr :: { RlpExpr' RlpcPs }
: Expr1 InfixOp Expr { $2 =>> \o -> : Expr1 InfixOp Expr { $2 =>> \o ->

View File

@@ -11,7 +11,7 @@ module Rlp.Syntax
, progDecls , progDecls
, Decl(..), Decl', RlpExpr(..), RlpExpr' , Decl(..), Decl', RlpExpr(..), RlpExpr'
, Pat(..), Pat' , Pat(..), Pat'
, Alt(..) , Alt(..), Where
, Assoc(..) , Assoc(..)
, Lit(..), Lit' , Lit(..), Lit'
, RlpType(..), RlpType' , RlpType(..), RlpType'

View File

@@ -18,6 +18,7 @@ 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 Data.Functor.Bind
import Debug.Trace
import Core.Syntax as Core import Core.Syntax as Core
import Compiler.Types import Compiler.Types
@@ -63,7 +64,23 @@ exprToCore :: RlpExpr RlpcPs -> Expr'
exprToCore (VarE n) = Var (dsNameToName n) exprToCore (VarE n) = Var (dsNameToName n)
exprToCore (CaseE e as) = undefined exprToCore (CaseE (unXRec -> e) as) = Case (exprToCore e) (caseAltToCore <$> as)
-- TODO: where-binds
caseAltToCore :: (Alt RlpcPs, Where RlpcPs) -> Alter'
caseAltToCore (AltA (VarP'' x) e, wh) =
Alter AltDefault [] (exprToCore $ unXRec e)
caseAltToCore (AltA rootPat@(ConP'' cn as) e, wh) =
case firstNestedPat of
-- this case matches a nested pattern, which must be unrolled:
Just (c,p) -> undefined
-- no nested patterns! direct translation:
Nothing -> Alter (AltData cn) as' e'
where
as' = (\ (VarP'' x) -> dsNameToName x) <$> traceShowId as
e' = exprToCore (unXRec e)
where
firstNestedPat = expandableAlt "NAME" . unXRec $ rootPat
-- >>> pat1 = nolo $ ConP "C" [nolo $ ConP "P" []] -- >>> pat1 = nolo $ ConP "C" [nolo $ ConP "P" []]
-- >>> expandableAlt "name" (AltA pat1 (nolo $ VarE "e")) -- >>> expandableAlt "name" (AltA pat1 (nolo $ VarE "e"))
@@ -72,10 +89,10 @@ exprToCore (CaseE e as) = undefined
-- >>> pat2 = nolo $ ConP "C" [nolo $ VarP "p", nolo $ ConP "P" []] -- >>> pat2 = nolo $ ConP "C" [nolo $ VarP "p", nolo $ ConP "P" []]
-- >>> expandableAlt "name" (AltA pat2 (nolo $ VarE "e")) -- >>> expandableAlt "name" (AltA pat2 (nolo $ VarE "e"))
-- Just (ConP "C" [Located (SrcSpan 0 0 0 0) (VarP "p"),Located (SrcSpan 0 0 0 0) (VarP "name")],ConP "P" [],VarE' () "e") -- Just (ConP "C" [Located (SrcSpan 0 0 0 0) (VarP "p"),Located (SrcSpan 0 0 0 0) (VarP "name")],ConP "P" [],VarE' () "e")
expandableAlt :: IdP RlpcPs -> Alt RlpcPs expandableAlt :: IdP RlpcPs -> Pat RlpcPs
-> Maybe (Pat RlpcPs, Pat RlpcPs, RlpExpr RlpcPs) -> Maybe (Pat RlpcPs, Pat RlpcPs)
expandableAlt n (AltA c@(ConP'' cn as) e) = expandableAlt n c@(ConP cn as) =
nestedPat <&> (c', , extract e) nestedPat <&> (c',)
where where
l :: Lens' [Pat RlpcPs] (Maybe (Pat RlpcPs)) l :: Lens' [Pat RlpcPs] (Maybe (Pat RlpcPs))
l = atFound (has _ConP) l = atFound (has _ConP)
@@ -84,6 +101,7 @@ expandableAlt n (AltA c@(ConP'' cn as) e) =
nestedPat = (unXRec <$> as) ^. l nestedPat = (unXRec <$> as) ^. l
as' = (unXRec <$> as) & l ?~ VarP n as' = (unXRec <$> as) & l ?~ VarP n
& fmap nolo & fmap nolo
expandableAlt _ _ = Nothing
-- this is an illegal lens, and we're using it illegally. it's convenient :3 -- this is an illegal lens, and we're using it illegally. it's convenient :3
-- TODO: adhere to the holy laws of the Lens Herself -- TODO: adhere to the holy laws of the Lens Herself