I also find the following incredibly disturbing:
>perl6 -e "$x = 'cat'|'dog'; say $x;" dog cat
That would be disturbing if that's what happened. C<say @what> is just a shorthand for C<print @what, "\n">. So saying a junction is the same as printing it, which is a run-time error.
Can a junction hold values of completely different types, or just different values of the same type?
Junctions are values. They don't "hold" anything. Can a junction have values of different types? Yes.
If evaluation of one value of a junction causes an error, is $! now a junction as well?
See Larry's response. My response it that, by default, if:
foo(2)
and
foo(3)
each throw an exception, then:
foo(1|2|3);
throws an (single, non-junctive) exception. Which exception gets thrown is indeterminate, since the ordering of a junction, and hence of the autothreading of a junction, is indeterminate.
Damian