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.