Differences Between ^x: and [^x]:

So as things have moved along it's now actually possible to do this (though it's not an example of "multiple sigils"... the colons come from CHAIN!, which is a separate aggregate type now.)

And I've realized that the two are semantically different in the case where you have an unstable antiform on the right hand side.

^x: will store the meta of unstable antiforms

...though the assignment expression passes through the antiform as-is:

>> ^x: pack [10 null 20]
== ~['10 ~null~ '20 ]~  ; antiform (pack)

>> x
== ~['10 ~null~ '20 ]~

It accepts everything on the right-hand side--including ERROR!, VOID!, NONE....

But in the case of ERROR!, it still passes it through as an unstable antiform as the result of the assignment. So by default you'll still get escalation to a panic if you don't put some kind of TRY or otherwise on the expression (though the assignment will have already been performed by that point.)

[^x]: will unpack a pack, meta'ing the first item

...and ignoring any further ones:

>> [^x]: pack [10 null 20]
== ~['10 ~null~ '20 ]~  ; antiform (pack)

>> x
== '10

It won't accept ERROR! or VOID! on the right (or NONE...which is just an empty PACK!...if there's more than 0 items in the SET-BLOCK)

If the right hand side is not a pack, then they will be identical.

>> ^x: [a b c]
== [a b c]

>> x
== '[a b c]

>> [^x]: [a b c]
== [a b c]

>> x
== '[a b c]

Should ([...]: ...) require a PACK! on the right?

:thinking:

Allowing non-packs allows you to basically say "decay the right" implicitly...

So [^x]: acts as a shorthand for:

^x: decay (...)

That's a useful thing to have a shorthand for.

I'd have to think of a pretty big bad consequence to disallow it.