I occasionally have programming-language ideas that I'd like to play around with, like "what if there were a lighweight monadic call syntax" or "what if my program could save its state to disk on what looks like a normal function call and resume on a different node". I have some idea of how I'd do these things, given a language I'm working from; I might transform ys = f(*xs) to ys = xs.map(f), for example, defining a function call with a star parameter as special in my custom language.
The thing I'm missing is a base language to start from. Every time I have an idea like this, I wind up building an interpreter from scratch, but then I get hung up on problems like "how do parser generators work again" or "what is operator precedence" when I really want to be trying out more interesting ideas.
Is there a basic straightforward language out there, with a basic straightforward interpreter, that's amenable to this sort of hacking? I'd envision a basic-but-complete expression syntax with a parser, an AST, and an interpreter or compiler of some sort. I'm fairly agnostic to the language that the language interpreter is built in.