Inspired by Paul Graham and his book The Hacker and the Painter, I wanted to experience what it feels like to design a system in a language built for abstraction rather than convention.
Instead of relying on a large framework, I combined small libraries and built a minimal internal structure myself.
rrepo•1h ago
In many ecosystems, frameworks define architecture for you. In Lisp, you define your own abstractions. The biggest difference was macros. Rather than repeating patterns such as JSON parsing,Error normalization, API response formatting and Exception mapping. I abstracted them into macros that standardized the flow across the entire backend. This allowed controllers to focus purely on business logic. For example, API responses are wrapped automatically (defmacro with-api-response (result) `(let ((res ,result)) (cond ((null res) `(200 (:content-type "application/json") (,(jonathan:to-json '(:status "success" :data ())))))
Instead of writing error handling and serialization logic repeatedly, I could define the contract once.