Zulip Chat Archive
Stream: mathlib4
Topic: pp_extended_field_notation
Kyle Miller (May 10 2023 at 09:47):
"Extended field notation" is the name for when you use x.f notation to mean Foo.f x, supposing you have x : Foo ... and some function Foo.f defined. Lean 4 recognizes extended field notation, but it does not pretty print using it.
There is now a command in the Mathlib.Tactic.ProjectionNotation module called pp_extended_field_notation to configure a function to be pretty printed using dot notation. Right now the syntax is simply pp_extended_field_notation Foo.f (and depending on namespaces you can often do pp_extended_field_notation f).
Rules:
- It should only be used on functions whose first explicit argument receives the object of the dot notation.
- It should not be used on functions of the form
toFoo(anything that looks like a projection to a parent structure) since at the moment it might confuse otherpp_extended_field_notationpretty printers. - It may be used on true projections, which is useful if the projection can take additional arguments (for example, docs4#Prefunctor.obj takes both the
Prefunctorand an additional value). The built-in Lean 4 dot notation pretty printer skips using dot notation in this case.
Kyle Miller (May 10 2023 at 09:47):
Another thing that might be useful is that by just importing Mathlib.Tactic.ProjectionNotation you get a special pretty printer that collapses parent projections, so rather than x.toC.toB.toA.f it comes out as x.f. You can turn this off using set_option pp.collapseStructureProjections false.
Eric Wieser (May 10 2023 at 09:53):
I assume you mean first explicit argument
Kyle Miller (May 10 2023 at 09:54):
Sure, it should only be used for cases of extended field notation where the first explicit argument is the receiver of the dot notation object.
Kyle Miller (May 10 2023 at 09:56):
Lean 4's dot notation passes the object to the first matching argument (explicit or not), and pp_extended_field_notation shouldn't be used in the non-explicit case.
Peter Nelson (Jun 30 2023 at 15:08):
It seems like this needs to be done in every new file for which the pretty-printed dot is wanted. Is there a way to enable it globally at the point where the declaration is made?
Kyle Miller (Jun 30 2023 at 15:10):
If you put it right after the corresponding declaration, it should be global
Kyle Miller (Jun 30 2023 at 15:15):
(Or more generally, if you import a file that uses pp_extended_field_notation on a declaration then you should see it work in the current module)
Kyle Miller (Jun 30 2023 at 18:15):
I just got around to making a more convenient way to apply pp_extended_field_notation: #5632
With this, instead you use the @[pp_dot] attribute. (RFC: Is this a fine name for the attribute?)
Last updated: May 02 2025 at 03:31 UTC