The simplest form of extensibility is for a user (or HLL compiler) to use Lisp primitives to define a new operator in terms of existing operators. The transpose operator is a (pre-defined) example of this; the operator is defined in Lisp to return a parallel group of appropriate streams.
A more substantive way to extend the language is also needed, however. Consider the following scenarios:
To handle this, COP allows users to provide operator implementations which can take effect under the appropriate circumstances. Such operators are simply written in C (or any other language with a compatible application binary interface), then dynamically linked by the COP compiler at compile-time and chosen for use in exactly the same way that pre-defined implementations are chosen.
It is also possible to define entirely new fundamental operators, but it requires modification of the compiler to characterize the new operator type appropriately. Having done so once, implementations of the operator can be written as needed.