Whenever you define a function or class, you are creating a new language. Knowing good language design is a path to good design.
The interpreter design pattern is:
... de-reifying entities close to the problem space
... possibly reifying simpler entities closer to the solution space
... in order to gain multiplicative advantage
SIGPLAN / interpreter design pattern