mirror of
https://github.com/idris-lang/Idris2.git
synced 2024-12-13 17:25:29 +03:00
89 lines
2.4 KiB
Idris
89 lines
2.4 KiB
Idris
module Main
|
|
|
|
record Point where
|
|
constructor MkPoint
|
|
x : Double
|
|
y : Double
|
|
|
|
-- a record creates two projections:
|
|
--
|
|
-- .x : Point -> Double
|
|
-- .y : Point -> Double
|
|
--
|
|
-- because %prefix_record_projections are on by default, we also get:
|
|
--
|
|
-- x : Point -> Double
|
|
-- y : Point -> Double
|
|
|
|
-- to prevent cluttering the ordinary name space with short identifiers
|
|
%prefix_record_projections off
|
|
|
|
record Rect where
|
|
constructor MkRect
|
|
topLeft : Point
|
|
bottomRight : Point
|
|
|
|
-- .topLeft : Rect -> Point
|
|
-- .bottomRight : Rect -> Point
|
|
--
|
|
-- For Rect, we don't get the prefix projections:
|
|
--
|
|
-- Main> :t topLeft
|
|
-- (interactive):1:4--1:11:Undefined name topLeft
|
|
-- Main> :t .topLeft
|
|
-- \{rec:0} => .topLeft rec : ?_ -> Point
|
|
|
|
|
|
pt : Point
|
|
pt = MkPoint 4.2 6.6
|
|
|
|
rect : Rect
|
|
rect =
|
|
MkRect
|
|
(MkPoint 1.1 2.5)
|
|
(MkPoint 4.3 6.3)
|
|
|
|
-- New lexical structure:
|
|
--
|
|
-- Foo.bar.baz with uppercase F is one lexeme: NSIdent ["baz", "bar", "Foo"]
|
|
-- foo.bar.baz with lowercase f is three lexemes: foo, .bar, .baz
|
|
-- .foo.bar.baz is three lexemes: .foo, .bar, .baz
|
|
--
|
|
-- If you want Constructor.field, you have to write (Constructor).field.
|
|
--
|
|
-- New syntax of simpleExpr:
|
|
--
|
|
-- Expressions binding tighter than application (simpleExpr),
|
|
-- such as variables or parenthesised expressions,
|
|
-- have been renamed to simplerExpr,
|
|
-- and an extra layer of syntax has been inserted.
|
|
--
|
|
-- simpleExpr ::= (.field)+ -- parses as PPostfixAppPartial
|
|
-- | simplerExpr (.field)+ -- parses as PPostfixApp
|
|
-- | simplerExpr -- (parses as whatever it used to)
|
|
--
|
|
-- (.foo) is a name, so you can use it to e.g. define a function called .foo (see .squared below)
|
|
-- (.foo.bar) is a parenthesised expression
|
|
--
|
|
-- New desugaring rules
|
|
--
|
|
-- (.field1 .field2 .field3) desugars to (\x => .field3 (.field2 (.field1 x)))
|
|
-- (simpleExpr .field1 .field2 .field3) desugars to ((.field .field2 .field3) simpleExpr).
|
|
--
|
|
-- There are more details such as namespacing; see below.
|
|
|
|
-- user-defined projections work, too (should they?)
|
|
(.squared) : Double -> Double
|
|
(.squared) x = x * x
|
|
|
|
|
|
-- #649: Forced patterns remain unaffected by postfix projections.
|
|
test649 : (x, y : Bool) -> x = y -> Bool
|
|
test649 .(x) x Refl = x
|
|
|
|
|
|
-- #441: Locals do not shadow record projections.
|
|
test441 : (Point -> Double) -> (Point -> Double) -> Point -> Double
|
|
test441 x y pt = pt.x + pt.y
|
|
-- no ambiguity errors: the locals "x" and "y" are not considered in pt.x and pt.y
|