Personally I think the C style casts are hard to visually parse, so for me 18/19/22/23 feel like very little progress. I never remember the correct precedence rules
"foo as i32" is getting some traction due to some new languages using it, but you almost always want to wrap that in ( ) anyway if you do a . invocation:
(foo as some_struct).a even if
foo as some_struct.a isn't ambiguous. Anything that can be chained easily is better, which would exclude 5, 6. The "type(variable)" cast is ok for built in types, but start to look weird for things like structs, not to mention pointers and functions. I'd eliminate 16 as well for that reason. 20, 21 uses the [ ] which at this point feels like the wrong syntax direction, just like < >
We can eliminate 1, 2 as too close for the current syntax. If I also remove the dupes that have "@" for prefix (that could be introduced later if we wanted to) I see the following alternatives as possible:
a.
cast(foo as i32)b.
cast(foo, i32)c.
foo->i32d.
(foo:i32) alt. cast(foo:i32)e.
(foo::i32) alt. cast(foo::i32)f.
foo.as(i32)g.
foo :> i32