> Simon says: > Warren makes an excellent point, though he doesn't highlight it: > > unlifted tuples are INCOMPATIBLE with seq > > The reason for this is that we can't implement unlifted tuples directly at > all. Instead, we simulate them by making pattern matching lazy, so that > _|_ behaves identically to (_|_,_|_), even though the two may have different > runtime representations. The seq function exposes the trick! In a private conversation with Arvind some days ago I pointed out that, contrary to his earlier message, there is a situation where Id, too, distinguishes lifted from unlifted tuples. It turns out to correspond exactly to the situation that Warren and Simon cite. In Id we have a sequencing construct (called a ``barrier'') which behaves in the same way: { x = (e1,e2); ( y = x --- % this sequences the statements in parens z = y ) In z } This will return a tuple even if e1 and e2 diverge, whereas: { ( y = (e1,e2) --- % this sequences the statements in parens z = y ) In z } this will return a tuple only if e1 and e2 terminate. Nikhil