HACKER Q&A
📣 jonathanstrange

Is there an easy example of a Lisp pretty-printer?


I'm working on a pretty printer for my own (toy) Lisp and it's harder than I thought. I've been looking for easy to understand example code, a pretty printer in Scheme or Lisp that I could adapt and extend but so far have only found academic overview papers from the 80s. It doesn't help that most of the stuff is for CommonLisp and uses format. I don't have any special string formatting directives and my Lisp is rather different from CL, more akin to XLisp.

Do any gray-bearded Lisp programmers remember some old Lisp or Scheme example code that I could study?


  👤 luizfelberti Accepted Answer ✓
Pretty printing is a hard problem. Read Philip Wadler's paper on implementing Haskell's pretty printer [0], and then maybe study the Rust library called `pretty` [1] which is an implementation of it for tree like structures.

[0] https://homepages.inf.ed.ac.uk/wadler/papers/prettier/pretti...

[1] https://github.com/Marwes/pretty.rs


👤 mhcolburn
Here is a paper on pretty printing: https://dspace.mit.edu/bitstream/handle/1721.1/6503/AIM-1102...

Here is an article on a pretty printer written in Pico Lisp: https://picolisp.com/wiki/?prettyPrint


👤 freemint
The PicoLisp pretty printer function printing itself looks like this: https://pastebin.com/K99n5pCC

I attempted to also include all the helper functions which are not standard lisp manually.

print and println put a space between arguments when printing prin and prinl do not. The ones with an l do line breaks, the others not.

pretty prints it's first argument and the second number is an optional argument what level of indentation to start with.


👤 presz
Maybe take a look at parinfer https://shaunlebron.github.io/parinfer/

👤 eatonphil
Pretty printing of what? Just s-expressions? Of functions and vectors and other sometimes builtin objects too?

👤 kwhitefoot
You could examine the Emacs Lisp mode indent functions.