There are many good ideas, but before delving into each of them, let me share the background. While developing gauche.generator and playing with it in my code, I noticed one essential thing about having a generator library---every generator should follow exactly the same protocol. With that guarantee, we can provide generic generator combiners that are agnostic to the actual generators passed in. And since a procedure call is generally very lightweight in Scheme, we can create complex generator network that runs pretty efficiently.
I considered and tested multi-value generators and out-of-bound channel (by throwing exception from a generator) but eventually dropped them since it got in way to provide generic generator combiners. Either we should limit its domain (e.g. "this combiner can only accept single-value generator") or need to add extra code that would drag performance (e.g. always receive generator output by "receive", or add guard around a generator call in case it tries to communicatewith side channel). Sure it is the same as the general procedures, but generators are essentially a special-purpose procedures to make things easier to a specific purpose.
1. Enhancing EOF valueThis works nicely with existing generator library. I think it's best to use auxiliary information carried in EOF sparingly; for example, what (gmerge < ga gb) should return at the end, if ga and/or gb returns enhanced EOF?