on master help sign in
Merge pull request #4121 from eraserhd/prefix-sections
d6be621Ahmad Salim Al-Sibahi
src/Idris/Parser/Expr.hs+14−2
@@ -470,8 +470,8 @@ bracketed' open syn =
470 <|> try (dependentPair TypeOrTerm [] open syn)
470 <|> try (dependentPair TypeOrTerm [] open syn)
471 <|> try (do fc <- getFC
471 <|> try (do fc <- getFC
472 opName <- operatorName
472 opName <- operatorName
473− -- No prefix operators! (bit of a hack here...)
473+ guardNotPrefix opName
474− guard $ opName /= sUN "-" && opName /= sUN "!"
474+
475 e <- expr syn
475 e <- expr syn
476 lchar ')'
476 lchar ')'
477 return $ PLam fc (sMN 1000 "ARG") NoFC Placeholder
477 return $ PLam fc (sMN 1000 "ARG") NoFC Placeholder
@@ -492,6 +492,18 @@ bracketed' open syn =
492 operatorName = sUN <$> operator
492 operatorName = sUN <$> operator
493 <|> fst <$> between (lchar '`') (lchar '`') fnName
493 <|> fst <$> between (lchar '`') (lchar '`') fnName
494
494
495+ justPrefix :: FixDecl -> Maybe Name
496+ justPrefix (Fix (PrefixN _) opName) = Just (sUN opName)
497+ justPrefix _ = Nothing
498+
499+ guardNotPrefix :: Name -> IdrisParser ()
500+ guardNotPrefix opName = do
501+ guard $ opName /= sUN "-"
502+ guard $ opName /= sUN "!"
503+
504+ ops <- idris_infixes <$> get
505+ guard . not . (opName `elem`) . mapMaybe justPrefix $ ops
506+
495{-| Parses the rest of a dependent pair after '(' or '(Expr **' -}
507{-| Parses the rest of a dependent pair after '(' or '(Expr **' -}
496dependentPair :: PunInfo -> [(PTerm, Maybe (FC, PTerm), FC)] -> FC -> SyntaxInfo -> IdrisParser PTerm
508dependentPair :: PunInfo -> [(PTerm, Maybe (FC, PTerm), FC)] -> FC -> SyntaxInfo -> IdrisParser PTerm
497dependentPair pun prev openFC syn =
509dependentPair pun prev openFC syn =
test/basic023/expected+1
@@ -4,3 +4,4 @@ True
4True
4True
5True
5True
6True
6True
7+True
test/basic023/sections.idr+5−3
@@ -1,12 +1,13 @@
1−preInc : Nat -> Nat
2−preInc = (1 `plus`)
3−
4postInc : Nat -> Nat
1postInc : Nat -> Nat
5postInc = (`plus` 1)
2postInc = (`plus` 1)
6
3
7cons : Int -> List Int -> List Int
4cons : Int -> List Int -> List Int
8cons = (::)
5cons = (::)
9
6
7+prefix 1 :/
8+(:/) : Nat -> Nat
9+(:/) = (1 `plus`)
10+
10main : IO ()
11main : IO ()
11main = do
12main = do
12 printLn $ (1 `cons`) [2] == [1,2]
13 printLn $ (1 `cons`) [2] == [1,2]
@@ -17,3 +18,4 @@ main = do
17 printLn $ (- x) == -4 -- prefix, not section
18 printLn $ (- x) == -4 -- prefix, not section
18 let io : IO Integer = pure 9
19 let io : IO Integer = pure 9
19 printLn $ (! io) == 9 -- prefix, not section
20 printLn $ (! io) == 9 -- prefix, not section
21+ printLn $ (:/ 3) == 4 -- custom prefix operator (#2571)