Skip to content

Commit 6405e11

Browse files
committed
feat: suggestions for some size/count/length confusions
1 parent 7219616 commit 6405e11

File tree

13 files changed

+25
-11
lines changed

13 files changed

+25
-11
lines changed

doc/std/naming.md

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,4 +257,13 @@ We make the following recommendations for variable names, but without insisting
257257
* `i`, `j`, `k` are preferred for numerical indices.
258258
Descriptive names such as `start`, `stop`, `lo`, and `hi` are encouraged when they increase readability.
259259
* `n`, `m` are preferred for sizes, e.g. in `Vector α n` or `xs.size = n`.
260-
* `w` is preferred for the width of a `BitVec`.
260+
* `w` is preferred for the width of a `BitVec`.
261+
262+
## Suggestions
263+
264+
When names are difficult to guess due to inconsistency between standard libraries from different languages (e.g. `List.all` in most programming languages is `List.every` in JavaScript) or are subtle within Lean's standard library (`Array.size` and `Slice.size` subtly indicate a constant-time operation, whereas `List.length` and `String.length` are linear-time operations), the `suggest_for` option can be used to clue users who guess the wrong name.
265+
266+
```lean
267+
@[suggest_for String.size]
268+
def String.length (b : @& String) : Nat := ...
269+
```

src/Init/Data/Array/Subarray.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ namespace Subarray
8080
/--
8181
Computes the size of the subarray.
8282
-/
83+
@[suggest_for Subarray.length]
8384
def size (s : Subarray α) : Nat :=
8485
s.stop - s.start
8586

src/Init/Data/FloatArray/Basic.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ instance : EmptyCollection FloatArray where
4242
def push : FloatArray → Float → FloatArray
4343
| ⟨ds⟩, b => ⟨ds.push b⟩
4444

45-
@[extern "lean_float_array_size", tagged_return]
45+
@[extern "lean_float_array_size", tagged_return, suggest_for FloatArray.length]
4646
def size : (@& FloatArray) → Nat
4747
| ⟨ds⟩ => ds.size
4848

src/Init/Data/Iterators/Consumers/Loop.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -636,7 +636,7 @@ Steps through the whole iterator, counting the number of outputs emitted.
636636
637637
This function's runtime is linear in the number of steps taken by the iterator.
638638
-/
639-
@[always_inline, inline, expose]
639+
@[always_inline, inline, expose, suggest_for Std.Iterators.Iter.length Std.Iterators.Iter.Partial.length]
640640
def Iter.count {α : Type w} {β : Type w} [Iterator α Id β] [IteratorLoop α Id Id]
641641
(it : Iter (α := α) β) : Nat :=
642642
it.toIterM.count.run.down

src/Init/Data/Iterators/Consumers/Monadic/Loop.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -900,7 +900,7 @@ Steps through the whole iterator, counting the number of outputs emitted.
900900
901901
This function's runtime is linear in the number of steps taken by the iterator.
902902
-/
903-
@[always_inline, inline]
903+
@[always_inline, inline, suggest_for Std.Iterators.IterM.length Std.Iterators.IterM.Partial.length]
904904
def IterM.count {α : Type w} {m : Type w → Type w'} {β : Type w} [Iterator α m β]
905905
[IteratorLoop α m m] [Monad m] (it : IterM (α := α) m β) : m (ULift Nat) :=
906906
it.fold (init := .up 0) fun acc _ => .up (acc.down + 1)

src/Init/Data/RArray.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ theorem RArray.get_eq_getImpl : @RArray.get = @RArray.getImpl := by
6565
instance : GetElem (RArray α) Nat α (fun _ _ => True) where
6666
getElem a n _ := a.get n
6767

68+
@[suggest_for Lean.RArray.length]
6869
def RArray.size : RArray α → Nat
6970
| leaf _ => 1
7071
| branch _ l r => l.size + r.size

src/Init/Data/Range/Basic.lean

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ namespace Range
2626
universe u v
2727

2828
/-- The number of elements in the range. -/
29-
@[simp, expose] def size (r : Range) : Nat := (r.stop - r.start + r.step - 1) / r.step
29+
@[simp, expose, suggest_for Std.Range.length]
30+
def size (r : Range) : Nat := (r.stop - r.start + r.step - 1) / r.step
3031

3132
@[inline] protected def forIn' [Monad m] (range : Range) (init : β)
3233
(f : (i : Nat) → i ∈ range → β → m (ForInStep β)) : m β :=

src/Init/Data/Slice/Operations.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ Returns the number of elements with distinct indices in the given slice.
5252
5353
Example: `#[1, 1, 1][0...2].size = 2`.
5454
-/
55-
@[always_inline, inline]
55+
@[always_inline, inline, suggest_for Std.Slice.length]
5656
def size (s : Slice γ) [SliceSize γ] :=
5757
SliceSize.size s
5858

src/Init/Data/String/Basic.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ Examples:
264264
* `"abc".length = 3`
265265
* `"L∃∀N".length = 4`
266266
-/
267-
@[extern "lean_string_length", expose, tagged_return]
267+
@[extern "lean_string_length", expose, tagged_return, suggest_for String.size]
268268
def String.length (b : @& String) : Nat :=
269269
b.toList.length
270270

src/Init/Data/String/Bootstrap.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ opaque offsetOfPos (s : String) (pos : Pos.Raw) : Nat
6464
@[extern "lean_string_utf8_extract"]
6565
opaque extract : (@& String) → (@& Pos.Raw) → (@& Pos.Raw) → String
6666

67-
@[extern "lean_string_length"]
67+
@[extern "lean_string_length", suggest_for String.Internal.size]
6868
opaque length : (@& String) → Nat
6969

7070
@[extern "lean_string_pushn"]

0 commit comments

Comments
 (0)