I think the problem with the implicit binding alternative is dealing with branches with moves:
|a1| { // `a1: !Copy`
drop(a1)
if flip_a_coin() {
yield x; // actually means `let (a1,) = yield x;` via implicit magic or whatever
// `a1` is valid here
}
// `a1` is not valid here
}
There are probably solutions to this, but apriori they seem incongruous normal rust syntax, or at least less teachable.