About the service
I am a Racket and Scheme developer and work in that corner of the Lisp world that ordinary backend engineers almost never visit: I make languages, not just use ready-made ones. When a task stubbornly turns your general-purpose code inside out, the honest answer often sounds like this — you need a small domain-specific language for the task itself. This is what I design and implement. I write careful, well-structured functional programs, hygienic macros, custom readers and evaluators, as well as the tooling that turns a raw idea into a working interpreter you can reason about.
My work usually breaks down into three forms. The first is DSLs and macro systems: I use Racket's language-oriented capabilities to give your team notation for a specific task, with syntax checks, clear error messages and a reader that feels native, not bolted on. The second is interpreters and small compilers: parsers, evaluators, tree walkers and bytecode backends for configuration formats, rule engines, scripting layers and experimental languages. The third is educational and research tools: I care about programs that explain themselves, so I make visualizers, step-by-step debuggers, exercise checkers and interactive materials for those learning functional programming and the lambda calculus underlying it.
Since I grew up from the Lisp family rather than mainstream backend or Clojure work, correctness and minimal core are especially important to me. I rely on contracts, property-based testing and small composable functions, document grammar and invariants so the next person doesn't have to pick your parser apart. If you have a half-working prototype, a pile of macros no one dares touch, or a fresh idea for a small language — I'll take it from sketch to reliable result.
— Domain languages and hygienic macros in Racket
— Interpreters, evaluators and small compilers in Scheme
— Parsers, custom readers and rule engines
— Educational tools: step-by-step debuggers, visualizers, exercise checking
— Functional refactoring, contracts and property-based tests
— Migration and modernization of old Scheme and Lisp code
My work usually breaks down into three forms. The first is DSLs and macro systems: I use Racket's language-oriented capabilities to give your team notation for a specific task, with syntax checks, clear error messages and a reader that feels native, not bolted on. The second is interpreters and small compilers: parsers, evaluators, tree walkers and bytecode backends for configuration formats, rule engines, scripting layers and experimental languages. The third is educational and research tools: I care about programs that explain themselves, so I make visualizers, step-by-step debuggers, exercise checkers and interactive materials for those learning functional programming and the lambda calculus underlying it.
Since I grew up from the Lisp family rather than mainstream backend or Clojure work, correctness and minimal core are especially important to me. I rely on contracts, property-based testing and small composable functions, document grammar and invariants so the next person doesn't have to pick your parser apart. If you have a half-working prototype, a pile of macros no one dares touch, or a fresh idea for a small language — I'll take it from sketch to reliable result.
— Domain languages and hygienic macros in Racket
— Interpreters, evaluators and small compilers in Scheme
— Parsers, custom readers and rule engines
— Educational tools: step-by-step debuggers, visualizers, exercise checking
— Functional refactoring, contracts and property-based tests
— Migration and modernization of old Scheme and Lisp code