Programming Bottom-Up
Last modified on September 30, 2021
http://www.paulgraham.com/progbot.html
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 /* (zero-or-more (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.