Programming Bottom-Up
Last modified on September 30, 2021

There are two ways of programming in Lisp – top-down, and bottom-up.

Top-down = the classic paradigm of divide-and conquer, decomposing the problem hierarchically into smaller problems.

Bottom-up = defining your own DSL in Lisp, and using those primitives to make something cool.

Most programming is done top-down, but with the powers of macros you can go bottom-up, creating "little universes" in Lisp…

Personally what comes to mind is the rx macro in emacs. It's like a nice little domain-specific language for writing regular expressions, embedded right into elisp.

Regexp matching a block comment in C:

(rx "/*"                          ; Initial /*
     (or (not (any "*"))          ;  Either non-*,
         (seq "*"                 ;  or * followed by
              (not (any "/")))))  ;  non-/
    (one-or-more "*")             ; At least one star,
    "/")                          ; and the final /

you redefine the language itself to have the primitives you want it to have, and then you can proceed to build something (perhaps in top-down fashion now.) It's like "meeting in the middle," so you don't have to build up super complex primitives, and you don't have to decompose down to a super fine-grained level.

I wonder what the connection between this bottom-up paradigm and Bret Victor - The Future of Programming is. I feel like maybe there's an idea that his visual programming playgrounds are like a domain-specific language (albeit not in Lisp.) They give the user a powerful set of primitives to manipulate digital objects, and the user can then build from there to make it come to life.

Also feel like emacs encourages bottom-up programming in some ways, well ofc because of Lisp, but also because of the interactivity of the environment. You write a snippet, and immediately you can evaluate that code and test out your snippet. You get a couple more snippets, try those out, and then it's like, ok cool, what else can I build with these snippets?

Links to "Programming Bottom-Up"

♏️ emacs (skills I am learning > lisp macros)

Really powerful feature that allows one to define domain-specific syntax within Emacs Lisp. Examples I really like include org-ql, rx notation, and so many more that enable someone to write expressive, parsimonious code in a bottom-up fashion.