One technique that makes for a powerful dynamic or meta-language is blurring the distinction between what are "primitives" (built-in operations) and libraries (add-on-able functions, classes, and APIs). LispLanguage and SmalltalkLanguage are known for this more or less. Some questions: * What other languages fall into this category, fully or partially? ** ''ForthLanguage is perhaps the quintessential example of this concept, where all Forth operations (aka "words") are library operators and vice versa.'' ** HaskellLanguage allows you to define your own operators, and some operators are defined in the Prelude (which is the standard base library). ** RubyLanguage is known for nearly arbitrary manipulation of objects, be they built-ins, standard library, or user-defined. * How far can this concept be taken? * Are there "social" problems with being too flexible? (LispIsTooPowerful) ** ''Possibly. Whether or not the cost for a developer to learn and maintain (or define) what is essentially a sublanguage defined by library-defined constructs is greater or less than that for an "ordinary" function/class library -- and to what degree this is a general principle, or library-specific or language-specific or developer-specific -- is a matter of debate and/or research.'' ---- If the distinction is blurred (LibraryAndPrimitivesBlurring) this gives developers less chance to specialize - and in a recognizable way so. Forces: * A human can only learn a master only so much. * A known and well-defined set of domains (each of a size that can be mastered) allows for coordination of experts. AntiPattern: TooPowerfulForItsOwnGood So a clear separation between library and primitive is one means to ensure defined domains. There may be other differentiations. This seems to be an instance of AlternateHardAndSoftLayers. ---- CategoryMetaprogramming