I've actually wondered this for a while: Why is it that send~ and receive~ objects require special treatment instead of being treated the same as any other edge in the graph? I understand that in the current implementation using s~ / r~ pairs is the only way to create a graph with cycles (or fake the effect of one, anyways), but it doesn't seem obvious to me that that is the only valid way to go about it.
If they were just "invisible wires" then cycles would require other treatment, obviously, but it seems like cycles could be "broken" and turned into leaf nodes in the graph automatically, or by requiring the user to put a 1-block delay in explicitly, instead of letting the s~/r~ pair do double-duty and add the possibility for ambiguity as described above.
if send~/receive~ pairs were `invisible' wires, they would turn up as true dependencies in the ugen (tilde object) graph. you would need to make sure, that they don't introduce cycles, which is possible, but you would need to decide, where to break cycles:
|r~ a| | |s~ b|
|r~ b| | |s~ c|
|r~ c| | |s~ a|
where do you introduce the delay? in bus a, b, or c? this gets even trickier, if you want to set the bus dynamically.
tim