[4] Another early description of the principle of extensibility occurs in Brooker and Morris's 1960 paper on the compiler-compiler.
A program then consisted of metalanguage modifications and code in the modified base language.
A 1978 history of programming abstraction from the invention of the computer until then, made no mention of macros, and gave no hint that the extensible languages movement had ever occurred.
[10] In the modern sense, a system that supports extensible programming will provide all of the features described below[citation needed].
Languages which allow the addition of constructs with user defined syntax include Coq,[11] Racket, Camlp4, OpenC++, Seed7,[12] Red, Rebol, and Felix.
The compiler itself must be extensible to the point that it is really a collection of plugins that assist with the translation of source language input into anything.
As with extensible syntax, it is acceptable for there to be some (smallish) set of fundamental or intrinsic operations that are immutable.
It is unacceptable for the only uses of source language input to be editing, viewing and translation to machine code.
The debugger, or more correctly 'program inspector', must permit the display of runtime data in forms suitable to the source language.