feat: add helper class ReprAtom

This commit is contained in:
Leonardo de Moura 2020-12-18 14:14:46 -08:00
parent 230a5aca7e
commit 793ffa2f11
4 changed files with 94 additions and 15 deletions

View file

@ -69,7 +69,13 @@ instance floatDecLe (a b : Float) : Decidable (a ≤ b) := Float.decLe a b
@[extern "lean_float_to_string"] constant Float.toString : Float → String
instance : ToString Float := ⟨Float.toString⟩
instance : ToString Float where
toString := Float.toString
instance : Repr Float where
reprPrec n _ := Float.toString n
instance : ReprAtom Float := ⟨⟩
abbrev Nat.toFloat (n : Nat) : Float :=
Float.ofNat n

View file

@ -27,6 +27,10 @@ abbrev reprStr [Repr α] (a : α) : String :=
abbrev reprArg [Repr α] (a : α) : Format :=
reprPrec a maxPrec!
/- Auxiliary class for marking types that should be considered atomic by `Repr` methods.
We use it at `Repr (List α)` to decide whether `bracketFill` should be used or not. -/
class ReprAtom (α : Type u)
-- This instance is needed because `id` is not reducible
instance [Repr α] : Repr (id α) :=
inferInstanceAs (Repr α)
@ -50,11 +54,6 @@ instance : Repr (Decidable p) where
| Decidable.isTrue _, prec => Repr.addAppParen "isTrue _" prec
| Decidable.isFalse _, prec => Repr.addAppParen "isFalse _" prec
instance [Repr α] : Repr (List α) where
reprPrec
| [], _ => "[]"
| as, _ => Format.bracketFill "[" (@Format.joinSep _ ⟨repr⟩ as ("," ++ Format.line)) "]"
instance : Repr PUnit.{u+1} where
reprPrec _ _ := "PUnit.unit"
@ -88,7 +87,7 @@ instance [Repr α] [ReprTuple β] : ReprTuple (α × β) where
instance [Repr α] [ReprTuple β] : Repr (α × β) where
reprPrec | (a, b), _ =>
Format.bracketFill "(" (Format.joinSep (reprTuple b [repr a]).reverse ("," ++ Format.line)) ")"
Format.bracket "(" (Format.joinSep (reprTuple b [repr a]).reverse ("," ++ Format.line)) ")"
instance {β : α → Type v} [Repr α] [s : (x : α) → Repr (β x)] : Repr (Sigma β) where
reprPrec | ⟨a, b⟩, _ => Format.bracket "⟨" (repr a ++ ", " ++ repr b) "⟩"
@ -192,6 +191,9 @@ def Char.quote (c : Char) : String :=
instance : Repr Char where
reprPrec c _ := c.quote
protected def Char.repr (c : Char) : String :=
c.quote
def String.quote (s : String) : String :=
if s.isEmpty = true then "\"\""
else s.foldl (fun s c => s ++ c.quoteCore) "\"" ++ "\""
@ -224,5 +226,23 @@ instance : Repr UInt64 where
instance : Repr USize where
reprPrec n _ := repr n.toNat
protected def Char.repr (c : Char) : String :=
c.quote
instance [Repr α] : Repr (List α) where
reprPrec
| [], _ => "[]"
| as, _ => Format.bracket "[" (@Format.joinSep _ ⟨repr⟩ as ("," ++ Format.line)) "]"
instance [Repr α] [ReprAtom α] : Repr (List α) where
reprPrec
| [], _ => "[]"
| as, _ => Format.bracketFill "[" (@Format.joinSep _ ⟨repr⟩ as ("," ++ Format.line)) "]"
instance : ReprAtom Bool := ⟨⟩
instance : ReprAtom Nat := ⟨⟩
instance : ReprAtom Int := ⟨⟩
instance : ReprAtom Char := ⟨⟩
instance : ReprAtom String := ⟨⟩
instance : ReprAtom UInt8 := ⟨⟩
instance : ReprAtom UInt16 := ⟨⟩
instance : ReprAtom UInt32 := ⟨⟩
instance : ReprAtom UInt64 := ⟨⟩
instance : ReprAtom USize := ⟨⟩

View file

@ -7,3 +7,7 @@
#eval repr ("hello", 1, true, false, 'a', "testing tuples", "another string", "another string", "testing bigger tuples that should not fit in a single line", 20)
#eval List.iota 50 |>.toArray
#eval List.iota 20 |>.map fun i => if i % 2 == 0 then Except.ok (some i) else Except.error "no even"
instance : ReprAtom (Except String (Option Nat)) := ⟨⟩
#eval List.iota 20 |>.map fun i => if i % 2 == 0 then Except.ok (some i) else Except.error "no even"

View file

@ -1,13 +1,62 @@
(1, 2, 3)
(some 1, some (some true))
[some (some 10), some (some 9), some (some 8), some (some 7), some (some 6), some (some 5), some (some 4),
some (some 3), some (some 2), some (some 1)]
[(15, some 15), (14, some 14), (13, some 13), (12, some 12), (11, some 11), (10, some 10), (9, some 9), (8, some 8),
(7, some 7), (6, some 6), (5, some 5), (4, some 4), (3, some 3), (2, some 2), (1, some 1)]
("hello", 1, true, false, 'a', "testing tuples", "another string", "another string",
"testing bigger tuples that should not fit in a single line", 20)
[some (some 10),
some (some 9),
some (some 8),
some (some 7),
some (some 6),
some (some 5),
some (some 4),
some (some 3),
some (some 2),
some (some 1)]
[(15, some 15),
(14, some 14),
(13, some 13),
(12, some 12),
(11, some 11),
(10, some 10),
(9, some 9),
(8, some 8),
(7, some 7),
(6, some 6),
(5, some 5),
(4, some 4),
(3, some 3),
(2, some 2),
(1, some 1)]
("hello",
1,
true,
false,
'a',
"testing tuples",
"another string",
"another string",
"testing bigger tuples that should not fit in a single line",
20)
#[50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22,
21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
[Except.ok (some 20),
Except.error "no even",
Except.ok (some 18),
Except.error "no even",
Except.ok (some 16),
Except.error "no even",
Except.ok (some 14),
Except.error "no even",
Except.ok (some 12),
Except.error "no even",
Except.ok (some 10),
Except.error "no even",
Except.ok (some 8),
Except.error "no even",
Except.ok (some 6),
Except.error "no even",
Except.ok (some 4),
Except.error "no even",
Except.ok (some 2),
Except.error "no even"]
[Except.ok (some 20), Except.error "no even", Except.ok (some 18), Except.error "no even", Except.ok (some 16),
Except.error "no even", Except.ok (some 14), Except.error "no even", Except.ok (some 12), Except.error "no even",
Except.ok (some 10), Except.error "no even", Except.ok (some 8), Except.error "no even", Except.ok (some 6),