I’ve done it, I’ve found a horrifying way to do sub-languages that’ll work with the emacs lisp reader and with other arbitrary readers:
(lang-quote brainfuck)
++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
(lang-unquote)
if a sublanguage-enabled reader returns a form starting with lang-quote, pass the stream contents at the current symbol and ending at (lang-unquote) to the reader for that language, and return that as the value for the original read
lang-quote and lang-unquote can be any symbols as long as they aren’t expected to be read in any other context. actually (lang-unquote) can just be an empty function, it doesn’t need to mean anything special
if a non-lisp language wants to do sublanguages its expander just needs to return (lang-quote language). I could have the end token be configurable actually, huh
this is a truly horrifying hack but I kind of love it