Re: Pretty-printing and auto-formatting Scheme code Lassi Kortela 14 Feb 2020 17:05 UTC
> I like the idea of a standard pretty-printer for Scheme code, but there > is at least one difficulty specific to Lisps and Schemes: since we can > extend the language with macros, we can add new forms to the language > for which the indentation isn't automatically clear. For example, > here's an expression for defining an HTML template in a DSL I wrote: > > (define-html-template (write-blog-navigation-links) > ((about (header-about-link)) > (rss (header-rss-link "/blog/rss"))) > ((div class "about") about) > rss) > > Note subexpression on the second and third lines. It's a block of > let-style bindings. That block is indented to make it clear that it's > different from the HTML expressions that follow. Under Emacs, I use > (put 'define-html-template 'scheme-indent-function 2) to automate that > indentation. A pretty-printer couldn't figure that setting out > automatically. I would solve that by putting (declare-file (indent (define-html-template 2))) at the top of every source file using `define-html-template`. But there isn't yet evidence that everyone else doesn't hate `declare-file` :p We could also have a per-project config file with the indentation settings but then the file is not as self-contained. Last year I talked about indentation to Racket folks and someone had the idea of adding a formatting pass to their toolchain. That approach is a bit too heavyweight for my taste because you need to indent using that particular tool. It'd nice if e.g. Emacs could load a standalone Scheme file, parse the `declare-file` and configure its indenter accordingly.