case unrolling
This commit is contained in:
3
.ghci
3
.ghci
@@ -22,6 +22,3 @@ _reload_and_make _ = do
|
|||||||
|
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
-- import rlpc quasiquoters
|
|
||||||
:m + Core.TH Rlp.TH
|
|
||||||
|
|
||||||
|
|||||||
@@ -84,6 +84,7 @@ library
|
|||||||
OverloadedStrings
|
OverloadedStrings
|
||||||
TypeFamilies
|
TypeFamilies
|
||||||
LambdaCase
|
LambdaCase
|
||||||
|
ViewPatterns
|
||||||
|
|
||||||
executable rlpc
|
executable rlpc
|
||||||
import: warnings
|
import: warnings
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 ->
|
||||||
|
|||||||
@@ -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'
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user