on master help sign in
Allowed multiple bindings in dependent pairs

One can now write (a1 : t1 ** ... ** an : tn ** t) instead of (a1 : t1 ** (... ** (an : tn ** t))) and similarly with values (a1 ** .. ** an). This makes the dependent pair syntax mimic the normal pair syntax. Rewrote test015 with new syntax, in order to not break the change in the future. Updated CHANGELOG.

commit894f664b39e7a8b07825c2dddd3fd549ff131464 authorAhmad Salim Al-Sibahi <asal@itu.dk> dateSat 19 Sep 2015, 16:45 (11 years ago) parentaba225c
3 files changed+32−14
CHANGELOG+3 src/Idris/ParseExpr.hs+26−11 test/proof003/test015.idr+3−3
CHANGELOG+3
@@ -9,6 +9,9 @@ Language updates
99 for defining new names. `{n} still quotes n to an existing name in scope.
1010* A new primitive operator prim__strSubstr for more efficient extraction of
1111 substrings. External code generators should implement this.
12+* Dependent pairs now can be specified using a telescope-style syntax, without
13+requirement of nesting, e.g. it is possible to now write (a : Type ** n : Nat
14+** Vect n a).
1215
1316Library updates
1417---------------
src/Idris/ParseExpr.hs+26−11
@@ -452,14 +452,19 @@ bracketed' open syn =
452452 do (FC f start (l, c)) <- getFC
453453 lchar ')'
454454 return $ PTrue (spanFC open (FC f start (l, c+1))) TypeOrTerm
455− <|> try (do (ln, lnfc) <- name
456− colonFC <- lcharFC ':'
457− lty <- expr syn
458− starsFC <- reservedOpFC "**"
455+ <|> try (do (ln, lnfc, colonFC, lty, starsFC):bnds <- some $ do
456+ (ln, lnfc, colonFC) <- try $ do
457+ (ln, lnfc) <- name
458+ colonFC <- lcharFC ':'
459+ return (ln, lnfc, colonFC)
460+ lty <- expr syn
461+ starsFC <- reservedOpFC "**"
462+ return (ln, lnfc, colonFC, lty, starsFC)
459463 fc <- getFC
460464 r <- expr syn
461465 close <- lcharFC ')'
462− return (PDPair fc [open, colonFC, starsFC, close] TypeOrTerm (PRef lnfc [] ln) lty r))
466+ return (PDPair fc ([open, colonFC, starsFC, close] ++ (=<<) (\(_,_,cfc,_,sfc) -> [cfc, sfc]) bnds)
467+ TypeOrTerm (PRef lnfc [] ln) lty (mergePDPairs starsFC bnds r)))
463468 <|> try (do fc <- getFC; o <- operator; e <- expr syn; lchar ')'
464469 -- No prefix operators! (bit of a hack here...)
465470 if (o == "-" || o == "!")
@@ -470,7 +475,7 @@ bracketed' open syn =
470475 <|> try (do l <- simpleExpr syn
471476 op <- option Nothing (do o <- operator
472477 lchar ')'
473− return (Just o))
478+ return (Just o))
474479 fc0 <- getFC
475480 case op of
476481 Nothing -> bracketedExpr syn open l
@@ -479,25 +484,35 @@ bracketed' open syn =
479484 pexp (PRef fc0 [] (sMN 1000 "ARG"))]))
480485 <|> do l <- expr syn
481486 bracketedExpr syn open l
482−
487+ where mergePDPairs :: FC -> [(Name, FC, FC, PTerm, FC)] -> PTerm -> PTerm
488+ mergePDPairs starsFC' [] r = r
489+ mergePDPairs starsFC' ((ln, lnfc, colonFC, lty, starsFC):bnds) r =
490+ PDPair starsFC' [] TypeOrTerm (PRef lnfc [] ln) lty (mergePDPairs starsFC bnds r)
491+
483492-- | Parse the contents of parentheses, after an expression has been parsed.
484493bracketedExpr :: SyntaxInfo -> FC -> PTerm -> IdrisParser PTerm
485494bracketedExpr syn openParenFC e =
486495 do lchar ')'; return e
487− <|> do exprs <- many (do comma <- lcharFC ','
496+ <|> do exprs <- some (do comma <- lcharFC ','
488497 r <- expr syn
489498 return (r, comma))
490499 closeParenFC <- lcharFC ')'
491500 let hilite = [openParenFC, closeParenFC] ++ map snd exprs
492501 return $ PPair openParenFC hilite TypeOrTerm e (mergePairs exprs)
493− <|> do starsFC <- reservedOpFC "**"
494− r <- expr syn
502+ <|> do exprs <- some $ do
503+ starsFC <- reservedOpFC "**"
504+ r <- expr syn
505+ return (r, starsFC)
495506 closeParenFC <- lcharFC ')'
496− return (PDPair starsFC [openParenFC, starsFC, closeParenFC] TypeOrTerm e Placeholder r)
507+ let hilite = [openParenFC, closeParenFC] ++ map snd exprs
508+ return (PDPair openParenFC hilite TypeOrTerm e Placeholder (mergePDPairs exprs))
497509 <?> "end of bracketed expression"
498510 where mergePairs :: [(PTerm, FC)] -> PTerm
499511 mergePairs [(t, fc)] = t
500512 mergePairs ((t, fc):rs) = PPair fc [] TypeOrTerm t (mergePairs rs)
513+ mergePDPairs :: [(PTerm, FC)] -> PTerm
514+ mergePDPairs [(t, fc)] = t
515+ mergePDPairs ((t, fc):rs) = PDPair fc [] TypeOrTerm t Placeholder (mergePDPairs rs)
501516
502517-- bit of a hack here. If the integer doesn't fit in an Int, treat it as a
503518-- big integer, otherwise try fromInteger and the constants as alternatives.
test/proof003/test015.idr+3−3
@@ -44,11 +44,11 @@ natToBin (S w) (S k) with (parity k)
4444testBin : Maybe (Binary 8 42)
4545testBin = natToBin _ _
4646
47−pattern syntax bitpair [x] [y] = (_ ** (_ ** (x, y, _)))
48−term syntax bitpair [x] [y] = (_ ** (_ ** (x, y, Refl)))
47+pattern syntax bitpair [x] [y] = (_ ** _ ** (x, y, _))
48+term syntax bitpair [x] [y] = (_ ** _ ** (x, y, Refl))
4949
5050addBit : Bit x -> Bit y -> Bit c ->
51− (bX ** (bY ** (Bit bX, Bit bY, c + x + y = bY + 2 * bX)))
51+ (bX ** bY ** (Bit bX, Bit bY, c + x + y = bY + 2 * bX))
5252addBit b0 b0 b0 = bitpair b0 b0
5353addBit b0 b0 b1 = bitpair b0 b1
5454addBit b0 b1 b0 = bitpair b0 b1