Metaprogramming is powerful. Can we make it more practical so we can reduce or eliminate the chasm Cees writes about?
My basic starting point is architectural connectors as the basis for "metaprogramming".
So bake support for creating and adapting architectural connectors into the language, and then you can do most if not all the things you want with metaprogramming, while at least discouraging the things you don't want.
Key is to provide a set of adaptable connectors as a basis, so you guide good meta-design (and reduce its necessity) by providing good examples, rather than enforcing it.
Working on a language, tentatively called Objective-Smalltalk: http://objective.st/About/