As a result of the confluence of these features, Lisp is extraordinarily flexible, even to such an extent that the language implementation itself may be completely rewritten during runtime (i.e. reflective metaprogramming), which can result in Lisp systems becoming "muddy" over time due to the fluidity and ease with which they may be extended and evolve through simple use. Metalinguistic abstraction, a prominent characteristic of Lisp, also allows programmers to develop entirely new and idiosyncratic conceptual vocabularies to describe the processes and functions their programs go through in tackling a problem domain, and can, if combined with poor software documentation, result in Lisp systems that work quite well and are indeed quite well-structured from a design perspective, but are only comprehensible to the original coders, or to anyone else willing to invest the time to sift through layers of highly recursive code.