-
Notifications
You must be signed in to change notification settings - Fork 534
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: have #print
show precise fields of structures
#6096
Conversation
This PR improves the `#print` command for structures to show all fields and which parents they were inherited from, hiding internal details like which parents are represented as subobjects. This information is still present in the construtor if needed. Example output for `#print Monad`: ``` class Monad.{u, v} (m : Type u → Type v) : Type (max (u + 1) v) number of parameters: 1 parents: Monad.toApplicative : Applicative m Monad.toBind : Bind m fields: Functor.map : {α β : Type u} → (α → β) → m α → m β Functor.mapConst : {α β : Type u} → α → m β → m α Pure.pure : {α : Type u} → α → m α Seq.seq : {α β : Type u} → m (α → β) → (Unit → m α) → m β SeqLeft.seqLeft : {α β : Type u} → m α → (Unit → m β) → m α SeqRight.seqRight : {α β : Type u} → m α → (Unit → m β) → m β Bind.bind : {α β : Type u} → m α → (α → m β) → m β constructor: Monad.mk : {m : Type u → Type v} → [toApplicative : Applicative m] → [toBind : Bind m] → Monad m resolution order: Monad, Applicative, Bind, Functor, Pure, Seq, SeqLeft, SeqRight ``` Suggested by Floris van Doorn [on Zulip](https://leanprover.zulipchat.com/#narrow/channel/287929-mathlib4/topic/doc-gen.20ClosureOperator.20issue/near/482503637).
Mathlib CI status (docs):
|
src/Lean/Elab/Print.lean
Outdated
@@ -116,7 +116,7 @@ private def printStructure (id : Name) (levelParams : List Name) (numParams : Na | |||
m := m ++ indentD (m!"{modifier}{.ofConstName proj (fullNames := true)}" ++ " : " ++ ftype) | |||
-- Constructor | |||
let cinfo := getStructureCtor (← getEnv) id | |||
m := m ++ Format.line ++ "constructor:" ++ indentD (m!"{cinfo.name} : {cinfo.type}") | |||
m := m ++ Format.line ++ "constructor:" ++ indentD (.signature cinfo.name) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you apply this change to inductive
too? I find it very annoying that #print Lean.Expr
doesn't tell me what any of the constructor arguments are supposed to mean!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I agree, but that will wait for another PR!
Is the order of fields lexicographic in indices? |
@fgdorais It should be — it's using |
This PR improves the `#print` command for structures to show all fields and which parents the fields were inherited from, hiding internal details such as which parents are represented as subobjects. This information is still present in the constructor if needed. The pretty printer for private constants is also improved, and it now handles private names from the current module like any other name; private names from other modules are made hygienic. Example output for `#print Monad`: ``` class Monad.{u, v} (m : Type u → Type v) : Type (max (u + 1) v) number of parameters: 1 parents: Monad.toApplicative : Applicative m Monad.toBind : Bind m fields: Functor.map : {α β : Type u} → (α → β) → m α → m β Functor.mapConst : {α β : Type u} → α → m β → m α Pure.pure : {α : Type u} → α → m α Seq.seq : {α β : Type u} → m (α → β) → (Unit → m α) → m β SeqLeft.seqLeft : {α β : Type u} → m α → (Unit → m β) → m α SeqRight.seqRight : {α β : Type u} → m α → (Unit → m β) → m β Bind.bind : {α β : Type u} → m α → (α → m β) → m β constructor: Monad.mk.{u, v} {m : Type u → Type v} [toApplicative : Applicative m] [toBind : Bind m] : Monad m resolution order: Monad, Applicative, Bind, Functor, Pure, Seq, SeqLeft, SeqRight ``` Suggested by Floris van Doorn [on Zulip](https://leanprover.zulipchat.com/#narrow/channel/270676-lean4/topic/.23print.20command.20for.20structures/near/482503637).
This PR improves the
#print
command for structures to show all fields and which parents the fields were inherited from, hiding internal details such as which parents are represented as subobjects. This information is still present in the constructor if needed. The pretty printer for private constants is also improved, and it now handles private names from the current module like any other name; private names from other modules are made hygienic.Example output for
#print Monad
:Suggested by Floris van Doorn on Zulip.