>
> Every name that represents a type and does not stand for a type alias
> is a defined, formerly named type. The essence is in the existence of
> the name for the type. If it's declared in user code of magically by
> the compiler does not matter.


Can you tell me where the spec says any of this? This thread isn't "please
help me understand how the language works", it's "does the spec accurately
and unambiguously define how the language works". So what you say may very
well be true, but unless you can show how it arises from the spec, I don't
really see what it's contributing.

And, FTR, the essence is certainly not the existence of the name -
otherwise you wouldn't have to explicitly exclude type aliases. Just to
show that waving hands at the question isn't really useful.

 I suspect what has happened here is that it formerly said "named type" in
> which case it would have been much clearer.

 […]

 Again, when it said "named types", that problem would not have existed:
> it's clear that the type "int" has the name "int".


To re-iterate: Before type-aliases, this was true. But today, the current
discussion is created by an ambiguity between "a defined type" and "a type
which has a definition" and replacing that with the ambiguity between "a
named type" and "a type which has a name" isn't clearer - a type alias is a
name for a type.

I don't think that implies there is a specific class of type which is a
> "predeclared type",


The spec does have the specific notion of a predeclared identifier
<https://golang.org/ref/spec#Predeclared_identifiers>, and `error` is one
of them. This doesn't contradict anything you say, I just wanted to point
out that I don't think the use of "the predeclared type" is ambiguous in
its meaning here - "predeclared" as an adjective has a language-level
meaning. "defined" as an adjective has 1. a colloquial meaning and 2. a
language-level meaning, but only when preceding "type".

Therefore, I don't think this contradicts the earlier definition of
> "defined type", and by that definition, I conclude that "error" is a
> "defined type".


I don't understand this argument. The question is if it *matches* a
definition, not if it specifically contradicts it. If you want to know if ℤ
is a Ring, you don't say "nothing about the definition of ℤ says it's not a
Ring, therefore I conclude it is a Ring" - you look up the definition for
being a Ring and prove that ℤ matches it.

I suppose it could instead say "The predefined type error...", but that
> would also be confusing because it's not the fact that it's a "defined
> type" that matters, it's the fact that it has been declared and is
> available in all scopes.


No, it is specifically not. What matters is if it is a "defined type" -
which is a specific term in the spec used to ascribe special behavior to
some types but not others. That's also why it wouldn't help if it said
"predefined type" - this is not the term used in the spec to determine (for
example) type identity and assignability.

To take a page out of Hilbert's book: We should be able to say "Chair"
instead of "type-definition" and "Bierseidel" instead of "defined type" and
still get a perfectly consistent spec. It's just a name. That would then
remove any ambiguity when using the word "define" in a sentence and it
would prevent any confusion of semantic overlap with "predeclared". And for
the most part, you *can* do this replacement. You can then ask if error was
a Bierseidel under this replacement. It can be argued it would be, at the
end of the day, because the section would read "The predeclared type error
is defined as `type error interface { Error() string }`" - so its
definition would still be a Chair, which definitionally creates
Bierseidels. I still feel it might be cleaner, to not rely on this argument
and just explicitly add "`error` is a Bierseidel" as well.

Of course, the last paragraph reads ridiculously - at the end of the day,
names matter, so we absolutely should use speaking names with intuitive
understanding such as "defined type" and "type-definition". But once you
*can* do the replacement without loss of information, you have at least
avoided all confusion between the colloquial verb "define" and the specific
language-level construct of a "defined type".

In my opinion, clarity is not helped by having overlapping terms type
> definitions and type declarations.


Personally, given that any type definition is a type declaration - and
given that both are syntactical constructs and thus unambiguously defined
by the grammar - I don't find this super problematic.

On Sat, May 9, 2020 at 11:35 AM Brian Candler <b.cand...@pobox.com> wrote:

> From a language user's point of view, the following understanding seems to
> work:
>
> - A named ("defined") type has one or more names ("identifiers")
> - A type definition creates a new named type, distinct from all others
> - An alias declaration adds a new name to an existing type
>
> This does beg the question:
>
> type Foo int
> type Bar = Foo
>
> var a Bar
>
> What is the type of 'a'?  Is it "Bar", or is it
> "the-type-known-as-Foo-or-Bar"?  What type should error messages show?
>
> Testing shows that the type of a "Foo":
> https://play.golang.org/p/fVpDaEN0OVG
>
> So my simple understanding seems sufficient, at least in this simple
> case.  Error messages just show the first of the (perhaps many) names that
> the type has.
>
> --
> You received this message because you are subscribed to the Google Groups
> "golang-nuts" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to golang-nuts+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/golang-nuts/21dc75e9-ffbd-481c-ae1b-8d8662937d2a%40googlegroups.com
> <https://groups.google.com/d/msgid/golang-nuts/21dc75e9-ffbd-481c-ae1b-8d8662937d2a%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/CAEkBMfGWnm7djVB7oVmo13sEpQPkJ%3D0H5hQxSocBfDMNhZunLg%40mail.gmail.com.

Reply via email to