ref: e6dafb6d2e0a9bc2989932b571a4c1c8c1bc1073
parent: edbeb23f2c58b041b16367fde2b47bd73e0f3699
author: Lennart Augustsson <lennart.augustsson@epicgames.com>
date: Mon Sep 18 15:51:52 EDT 2023
Avoid <|> in favor of <|<
--- a/TODO
+++ b/TODO
@@ -10,7 +10,6 @@
- Add SHA checksumming to the C code
- Use filename as the cache lookup key and SHA for validation
* make an interactive version
- - implement a simple readline
- implement catch (and maybe throw) using setjmp & longjmp
- make the runtime system catch ^C and stop execution
* use pointer stack during GC instead of recursion.
--- a/src/MicroHs/Parse.hs
+++ b/src/MicroHs/Parse.hs
@@ -65,7 +65,7 @@
pUIdent :: P Ident
pUIdent =
pUIdentA
- <|> pUIdentSpecial
+ <|< pUIdentSpecial
pUIdentSym :: P Ident
pUIdentSym = pUIdent <|< pParens pUSymOper
@@ -78,8 +78,8 @@
mk = mkIdentLoc fn loc
(mk . map (const ',') <$> (pSpec '(' *> esome (pSpec ',') <* pSpec ')'))- <|> (mk "()" <$ (pSpec '(' *> pSpec ')')) -- Allow () as a constructor name- <|> (mk "[]" <$ (pSpec '[' *> pSpec ']')) -- Allow [] as a constructor name
+ <|< (mk "()" <$ (pSpec '(' *> pSpec ')')) -- Allow () as a constructor name+ <|< (mk "[]" <$ (pSpec '[' *> pSpec ']')) -- Allow [] as a constructor name
pUQIdentA :: P Ident
pUQIdentA = P.do
@@ -92,7 +92,7 @@
pUQIdent :: P Ident
pUQIdent =
pUQIdentA
- <|> pUIdentSpecial
+ <|< pUIdentSpecial
pLIdent :: P Ident
pLIdent = P.do
@@ -209,9 +209,9 @@
pExportSpec :: P ExportSpec
pExportSpec =
ExpModule <$> (pKeyword "module" *> pUQIdent)
- <|> ExpTypeCon <$> (pUQIdentSym <* pSpec '(' <* pSymbol ".." <* pSpec ')')- <|> ExpType <$> pUQIdentSym
- <|> ExpValue <$> pLQIdentSym
+ <|< ExpTypeCon <$> (pUQIdentSym <* pSpec '(' <* pSymbol ".." <* pSpec ')')+ <|< ExpType <$> pUQIdentSym
+ <|< ExpValue <$> pLQIdentSym
pKeyword :: String -> P ()
pKeyword kw = () <$ satisfy kw is
@@ -229,23 +229,23 @@
pDef :: P EDef
pDef =
- Data <$> (pKeyword "data" *> pLHS) <*> ((pSymbol "=" *> esepBy1 (pair <$> pUIdentSym <*> many pAType) (pSymbol "|"))
+ Data <$> (pKeyword "data" *> pLHS) <*> ((pSymbol "=" *> esepBy1 (pair <$> pUIdentSym <*> emany pAType) (pSymbol "|"))
<|< P.pure [])
- <|> Newtype <$> (pKeyword "newtype" *> pLHS) <*> (pSymbol "=" *> pUIdent) <*> pAType
- <|> Type <$> (pKeyword "type" *> pLHS) <*> (pSymbol "=" *> pType)
- <|> uncurry Fcn <$> pEqns
- <|> Sign <$> (pLIdentSym <* pSymbol "::") <*> pTypeScheme
- <|> Import <$> (pKeyword "import" *> pImportSpec)
- <|> ForImp <$> (pKeyword "foreign" *> pKeyword "import" *> pKeyword "ccall" *> pString) <*> pLIdent <*> (pSymbol "::" *> pType)
- <|> Infix <$> (pair <$> pAssoc <*> pPrec) <*> esepBy1 pTypeOper (pSpec ',')
+ <|< Newtype <$> (pKeyword "newtype" *> pLHS) <*> (pSymbol "=" *> pUIdent) <*> pAType
+ <|< Type <$> (pKeyword "type" *> pLHS) <*> (pSymbol "=" *> pType)
+ <|< uncurry Fcn <$> pEqns
+ <|< Sign <$> (pLIdentSym <* pSymbol "::") <*> pTypeScheme
+ <|< Import <$> (pKeyword "import" *> pImportSpec)
+ <|< ForImp <$> (pKeyword "foreign" *> pKeyword "import" *> pKeyword "ccall" *> pString) <*> pLIdent <*> (pSymbol "::" *> pType)
+ <|< Infix <$> (pair <$> pAssoc <*> pPrec) <*> esepBy1 pTypeOper (pSpec ',')
where
- pAssoc = (AssocLeft <$ pKeyword "infixl") <|> (AssocRight <$ pKeyword "infixr") <|> (AssocNone <$ pKeyword "infix")
+ pAssoc = (AssocLeft <$ pKeyword "infixl") <|< (AssocRight <$ pKeyword "infixr") <|< (AssocNone <$ pKeyword "infix")
dig (TInt _ i) | -1 <= i && i <= 9 = Just i
dig _ = Nothing
pPrec = satisfyM "digit" dig
pLHS :: P LHS
-pLHS = pair <$> pUIdentSym <*> many pIdKind
+pLHS = pair <$> pUIdentSym <*> emany pIdKind
pImportSpec :: P ImportSpec
pImportSpec =
@@ -259,7 +259,7 @@
pIdKind :: P IdKind
pIdKind =
((\ i -> IdKind i kType) <$> pLIdentSym)
- <|> pParens (IdKind <$> pLIdentSym <*> (pSymbol "::" *> pKind))
+ <|< pParens (IdKind <$> pLIdentSym <*> (pSymbol "::" *> pKind))
pKind :: P EKind
pKind = pType
@@ -281,7 +281,7 @@
pTypeOp = pOperators pTypeOper pTypeArg
pTypeOper :: P Ident
-pTypeOper = pOper <|> (mkIdent "->" <$ pSymbol "->")
+pTypeOper = pOper <|< (mkIdent "->" <$ pSymbol "->")
pTypeArg :: P EType
pTypeArg = pTypeApp
@@ -298,10 +298,10 @@
pAType :: P Expr
pAType =
(EVar <$> pLQIdentSym)
- <|> (EVar <$> pUQIdentSym)
- <|> pLit
- <|> (eTuple <$> (pSpec '(' *> esepBy1 pType (pSpec ',') <* pSpec ')'))- <|> (EListish . LList . (:[]) <$> (pSpec '[' *> pType <* pSpec ']')) -- Unlike expressions, only allow a single element.
+ <|< (EVar <$> pUQIdentSym)
+ <|< pLit
+ <|< (eTuple <$> (pSpec '(' *> esepBy1 pType (pSpec ',') <* pSpec ')'))+ <|< (EListish . LList . (:[]) <$> (pSpec '[' *> pType <* pSpec ']')) -- Unlike expressions, only allow a single element.
-------------
-- Patterns
@@ -313,12 +313,14 @@
-- is separate.
pAPat :: P EPat
pAPat =
- (EVar <$> pLIdentSym)
- <|> (EVar <$> pUQIdentSym)
- <|> pLit
- <|> (eTuple <$> (pSpec '(' *> esepBy1 pPat (pSpec ',') <* pSpec ')'))- <|> (EListish . LList <$> (pSpec '[' *> esepBy1 pPat (pSpec ',') <* pSpec ']'))
- <|> (EAt <$> (pLIdentSym <* pSymbol "@") <*> pAPat)
+ (P.do
+ i <- pLIdentSym
+ (EAt i <$> (pSymbol "@" *> pAPat)) <|< pure (EVar i)
+ )
+ <|< (EVar <$> pUQIdentSym)
+ <|< pLit
+ <|< (eTuple <$> (pSpec '(' *> esepBy1 pPat (pSpec ',') <* pSpec ')'))+ <|< (EListish . LList <$> (pSpec '[' *> esepBy1 pPat (pSpec ',') <* pSpec ']'))
pPat :: P EPat
pPat = pPatOp
@@ -380,8 +382,8 @@
pStmt :: P EStmt
pStmt =
(SBind <$> (pPat <* pSymbol "<-") <*> pExpr)
- <|> (SLet <$> (pKeyword "let" *> pBlock pBind))
- <|> (SThen <$> pExpr)
+ <|< (SLet <$> (pKeyword "let" *> pBlock pBind))
+ <|< (SThen <$> pExpr)
-------------
-- Expressions
@@ -390,7 +392,7 @@
pExpr = pExprOp
pExprArg :: P Expr
-pExprArg = pExprApp <|> pLam <|> pCase <|> pLet <|> pIf <|> pDo
+pExprArg = pExprApp <|< pLam <|< pCase <|< pLet <|< pIf <|< pDo
pExprApp :: P Expr
pExprApp = P.do
@@ -430,13 +432,13 @@
pAExpr :: P Expr
pAExpr = (
(EVar <$> pLQIdentSym)
- <|> (EVar <$> pUQIdentSym)
- <|> pLit
- <|> (eTuple <$> (pSpec '(' *> esepBy1 pExpr (pSpec ',') <* pSpec ')'))- <|> EListish <$> (pSpec '[' *> pListish <* pSpec ']')
- <|> (ESectL <$> (pSpec '(' *> pExprArg) <*> (pOper <* pSpec ')'))- <|> (ESectR <$> (pSpec '(' *> pOper) <*> (pExprArg <* pSpec ')'))- <|> (ELit noSLoc . LPrim <$> (pKeyword "primitive" *> pString))
+ <|< (EVar <$> pUQIdentSym)
+ <|< pLit
+ <|< (eTuple <$> (pSpec '(' *> esepBy1 pExpr (pSpec ',') <* pSpec ')'))+ <|< EListish <$> (pSpec '[' *> pListish <* pSpec ']')
+ <|< (ESectL <$> (pSpec '(' *> pExprArg) <*> (pOper <* pSpec ')'))+ <|< (ESectR <$> (pSpec '(' *> pOper) <*> (pExprArg <* pSpec ')'))+ <|< (ELit noSLoc . LPrim <$> (pKeyword "primitive" *> pString))
)
-- This weirdly slows down parsing
-- <?> "aexpr"
@@ -471,7 +473,7 @@
pBind :: P EBind
pBind =
uncurry BFcn <$> pEqns
- <|> BPat <$> (pPatNotVar <* pSymbol "=") <*> pExpr
+ <|< BPat <$> (pPatNotVar <* pSymbol "=") <*> pExpr
-------------
--
⑨