Doesn't look like omission of a name to me.
That's not asserting that non-use can be ignored at the
point declaration of the variable either. Both of the
things you've been positive about are not being demonstrated
That is the spot where declarations go in that language: a special
(declare ...) expression which is the first thing that is enclosed
in the binding construct. (Though possibly preceded by a docstring,
in the case of a function or method definition.)
It's vaguely analogous to old style C:
int func(x, y)
The "int y" is the point of declaration of the variable, together
with the enclosure of y in the (x, y) list.
It gets complex because of type semantics though. In a family of
Given that, already:
void foo(const int);
are exactly the same function type, in spite of const being a
real type qualifier, I don't see a problem.
function pointers, what if some of the parameters are ignored for
some of the functions - are they the same type?
Of course they are the same type; this has nothing to do with type.
Not every attribute which is syntactically a qualifier has to actually
be a semantic type qualifier.
It could be, syntactically, a storage class keyword also, since declarations
like "ignorable int * ignorable p" do not make sense.
Again, your view of "need" isn't shared universally.
Omitting the name works well in C++, which has a large community of users.
share it with the compiler, but sometimes redundancy is good
for humans to aid understanding.
What C++ giveth, C++ taketh away: the complete definition of a hello world
class with a non-inlined constructor and destructor requires the class name to
be written a whopping seven times.