Metalinguistic abstraction. In computer science, metalinguistic abstraction is the process of solving complex problems by creating a new language or vocabulary to better understand the problem space. More generally, it also encompasses the ability or skill of a programmer to think outside of the pre-conceived notions of a specific language in order to exploratorily investigate a problem space in search of the kind of solutions which are most natural or cognitively ergonomic to it. It is a recurring theme in the seminal MIT textbook Structure and Interpretation of Computer Programs, which uses Scheme, a dialect of Lisp, as a framework for constructing new languages.

Explanation
For example, consider modelling an airport inside a computer. The airport has elements like passengers, bookings, employees, budgets, planes, luggage, arrivals and departures, and transit services.

A procedural (e.g. C) programmer might create data structures to represent these elements of an airport and procedures or routines to operate on those data structures and update them, modelling the airport as a series of processes undergone by its various elements. E.g., bookings is a database used to keep passengers and planes synchronised via updates logged as arrivals and departures, budgets are similar but for money: airports  are a lot of things that need to get done in the right order to see that passengers get where they're going.

An object-oriented (e.g. Java) programmer might create objects to represent the elements of the airport with methods which represent their behaviors, modelling the airport as a collection of possibly related things which characteristically interact with each other. E.g., passengers, employees, and planes possess location attributes which can be modified via applicable transit methods: transit services have methods to bring employees and passengers to and from airports, planes have methods to bring passengers along with themselves between different airports: airports are a grouping of things working together as intended.

A functional (e.g. Scheme) programmer might create higher-order functions representing both the elements and behaviors or processes of the airport, modelling the airport as a map of relations between elements in its various domains and those in their assorted codomains. E.g., airports map budgets to bookings schedules, each of which is itself a map of elements to elements: balances of income and expenditure, and balances of arrivals and departures, each of which is, recursively, its own mapping of elements and their own mappings in kind, collectively comprising a set of morphisms: airports are, transitively, the evaluative transformation of a certain spacetime economy.

Finally, a metalinguistic programmer might abstract the problem by creating new domain-specific languages for modelling airports, with peculiar primitives and types for doing so. The new language could encompass any or all of the above approaches where most suitable, potentially enabling the programmer to retain both the abstract generality of the functional model, the intuitive sensibility of the object model, and the detail-driven pragmatism of the procedural model.

Because the creation of functional metalinguistic abstractions in non-functional languages can be cumbersome while the reverse is usually trivial (e.g. it is generally much easier to take a side-effect-free programming abstraction and simply add effects to it than it is to take a stateful abstraction and work around or encapsulate its propagation of state), and because of the syntactic flexibility and referential safety of functional macros, metalinguistic programming is mostly idiomatic of functional programming languages.

See also

References

Programming paradigms