Affiliation:
1. University of Washington, Seattle, USA
2. n.n., Cambridge, United States
Abstract
Pretty printers make trade-offs between the
expressiveness
of their pretty printing language, the
optimality
objective that they minimize when choosing between different ways to lay out a document, and the
performance
of their algorithm. This paper presents a new pretty printer, Π
e
, that is strictly more expressive than all pretty printers in the literature and provably minimizes an optimality objective. Furthermore, the time complexity of Π
e
is better than many existing pretty printers. When choosing among different ways to lay out a document, Π
e
consults a user-supplied
cost factory
, which determines the optimality objective, giving Π
e
a unique degree of flexibility. We use the Lean theorem prover to verify the correctness (validity and optimality) of Π
e
, and implement Π
e
concretely as a pretty printer that we call PrettyExpressive. To evaluate our pretty printer against others, we develop a formal framework for reasoning about the expressiveness of pretty printing languages, and survey pretty printers in the literature, comparing their expressiveness, optimality, worst-case time complexity, and practical running time. Our evaluation shows that PrettyExpressive is efficient and effective at producing optimal layouts. PrettyExpressive has also seen real-world adoption: it serves as a foundation of a code formatter for Racket.
Publisher
Association for Computing Machinery (ACM)
Subject
Safety, Risk, Reliability and Quality,Software
Reference29 articles.
1. Pablo R Azero Alcocer and S Doaitse Swierstra. 1998. Optimal pretty-printing combinators. https://web.archive.org/web/20040911044443/http://www.cs.uu.nl/groups/ST/Software/PP/pabloicfp.ps Pablo R Azero Alcocer and S Doaitse Swierstra. 1998. Optimal pretty-printing combinators. https://web.archive.org/web/20040911044443/http://www.cs.uu.nl/groups/ST/Software/PP/pabloicfp.ps
2. Jean-Philippe Bernardy. 2017. Disjunctionless. https://github.com/jyp/prettiest/pull/10 Jean-Philippe Bernardy. 2017. Disjunctionless. https://github.com/jyp/prettiest/pull/10
3. Jean-Philippe Bernardy. 2017. prettiest. https://github.com/jyp/prettiest/blob/5e7a12cf37bb01467485bbe1e9d8f272fa4f8cd5/Text/PrettyPrint/Compact/Core.hs Jean-Philippe Bernardy. 2017. prettiest. https://github.com/jyp/prettiest/blob/5e7a12cf37bb01467485bbe1e9d8f272fa4f8cd5/Text/PrettyPrint/Compact/Core.hs
4. A pretty but not greedy printer (functional pearl)
5. Pretty printing with lazy dequeues