In concatenative languages, every nontrivial program is a DSL. The difficulty is that other people have to learn the base language and your DSL to read or modify your programs, on top of the stack-based nature of most concatenative languages hiding the dataflow between functions.