Referents have been one of distinguishing features of OmniMark from its very beginnings.
Unfortunately, this feature of OmniMark did not age well. For one thing, referents cannot cross the coroutine boundaries until they are resolved. In other words, any coroutine in a stream-processing pipeline that uses referents will have to buffer its entire output while its nested-referents
scope is open.
Another, even bigger constraint on referents is the fact that the only data type which a referent can contain, and the only type that can be written into a sink with referents-allowed, is a string
. That means that no markup source function
can output referents. And that's a shame, because markup streams bring huge improvements in developer productivity.
Must we really choose between using referents and using markup streams? Only if we're talking about the traditional referents built into the language. However, the general-purpose side of OmniMark has now grown enough to allow us to implement the referent-resolving mechanism within the language.