the key point in this is conceptual closedness,
designing things to fit into each other, leaving room for your solution to fill in the blanks.
arc/scheme (and, to a degree, common lisp) code shows this much clearer than other languages. abelson and sussman followed that route in SICP, too, but you need to read between the lines.