If you want to design a programming language, and are okay with building off of an existing language, I suggest giving Racket a try. It can do more than just create DSLs and compile down to Racket code. I recently learned about sham* which allows interfacing with LLVM. I've linked some examples and references below
References 1. https://docs.racket-lang.org/guide/languages.html 2. https://docs.racket-lang.org/turnstile/
Examples 1. https://github.com/soegaard/urlang 2. https://github.com/rjnw/sham 3. https://github.com/ShawSumma/lure 4. https://github.com/racket/rhombus-prototype 5. https://github.com/lexi-lambda/hackett