I would have expected this to print as integer!, since that’s how we refer to it in discussions. But no, it prints with an ampersand. I’m sure there’s some good reason for this, but the apparent inconsistency is jarring.
Historical Redbol has the same problem here as with not having a good representation for true and false, where it just kind of lies and makes DATATYPE! conflate with words:
There were proposals to say that if a spelling ends in exclamation point that means it's lexically considered a datatype, e.g.
>> type? first [integer!]
== datatype!
This would have created a lot of trouble for renamings like the PAREN! => GROUP!, because there'd be no lookup step for the word, as datatype literals would presumably just evaluate to themselves.
Ren-C made TYPE-WORD! (and TYPE-BLOCK!, TYPE-GROUP!, etc.) so you have some more parts. If you're making a dialect and want to use Æ as an HTML entity you can.
This means exclamation point doesn't have any special lexical meaning, and is an ordinary word character.
I suppose that makes sense… except this doesn’t actually seem to work when I try it in the console:
>> paren!
** Script Error: paren! word is attached to a context, but unassigned
** Where: console
** Near: [paren! **]
** Line: 1
So if there isn’t actually any compatibility layer, I don’t see the value in doing this rather than simply writing TYPE-WORD!s as literals with exclamation marks.
Additionally, Ren-C has to deal with type checks beyond fundamental types. There's no good answer for TYPE OF an isotope. So TYPE-BLOCK!s / TYPE-GROUP!s allow you to check these:
logic?!: &[logic?]
splice?!: &[splice?]
switch/type spread [a b c] [
logic?! [print "It's a logic"]
splice?! [print "It's a splice"]
]
More generally, taking away ! from words is a controversial idea.