With my improved understanding of sigils, I think I can pinpoint more precisely why this behaviour bothers me. Currently — at least in the main evaluator — all the sigils except one serve some purpose relating to getting, setting or binding the word(s) they modify. This turns what would otherwise be a rather ad hoc matrix of datatypes into a powerful toolkit for manipulating variables and bindings.
The proposed (and former) behaviour goes against the grain of this. Making @word
evaluate to @word
has very little in common with the purpose of the other sigils. It’s simply a value which evaluates to itself. Even worse, it makes no sense when extended to other types: as I’ve complained before, THE-GROUP! and THE-BLOCK! become completely redundant types with this behaviour, having the same meaning as plain BLOCK!.
(Incidentally, this is also a problem with TYPE-* sigils, as you’ve mentioned — which is surely related to my expressed dislike of them. At least I’m consistent, I guess!)
Instead, I’ll make an alternative proposal: if we do go back to that behaviour, scrap @(groups)
, @[blocks]
and all the other useless types, and just make the single datatype @word
. That particular datatype fills a real usecase, in that it’s the word-level equivalent of blocks. It can be like #issue
— a type which is useful on its own, but where its sigil doesn’t need to be extended to other things.
Incidentally, in that case, I’d also prefer to keep the existing meaning of @
, and give this new type the syntax of $word
. I’m rather partial to using @word
for bound words, and would like to keep that syntax. Besides, if we want shell-like environment variables, I personally feel that fits the concept of ‘evaluates to itself’ much better than it fits ‘evaluates to a bound word’.