- Added section on type equivalence

- Changed signature syntax: parameter names are always mandatory
- Minor white-space cosmetic changes

SVN=117240
This commit is contained in:
Robert Griesemer 2008-04-29 16:27:11 -07:00
parent c1aba41194
commit 50cea7038b

View file

@ -1,6 +1,6 @@
The Go Programming Language
----
(April 18, 2008)
(April 29, 2008)
This document is an informal specification/proposal for a new systems programming
language.
@ -365,6 +365,7 @@ point value that is constrained only upon assignment.
-44
+3.24e-7
The string type
----
@ -501,6 +502,7 @@ an error if placed in a character literal (it is not a single code
point), and will appear as two code points if placed in a string
literal.
More about types
----
@ -601,6 +603,7 @@ structure.
f func();
}
Compound Literals
----
@ -623,6 +626,7 @@ be of the same type, which is the element type of the resulting array.
Unresolved issues: Are elements converted? What about length?
Map Literals
----
@ -641,6 +645,7 @@ All keys must have the same type; all values must have the same type.
Unresolved issues: Are elements converted?
Colon for a separator or comma?
Struct literals
----
@ -712,7 +717,7 @@ Functions can return multiple values simultaneously.
Receiver = "(" identifier Type ")" .
Parameters = "(" [ ParameterList ] ")" .
ParameterList = ParameterSection { "," ParameterSection } .
ParameterSection = [ IdentifierList ] Type .
ParameterSection = IdentifierList Type .
Result = Type | "(" ParameterList ")" .
// Function types
@ -758,6 +763,7 @@ variables, and variables declared within the function literal.
Unresolved issues: Are there method literals? How do you use them?
Methods
----
@ -874,6 +880,45 @@ can match any type at all, including basic types, arrays, etc.
TODO: details about reflection
Equivalence of types
---
Types are structurally equivalent: Two types are equivalent ('equal') if they
are constructed the same way from equivalent types.
For instance, all variables declared as "*int" have equivalent type,
as do all variables declared as "map [string] chan int".
More precisely, two struct types are equivalent if they have exactly the same fields
in the same order, with equal field names and types. For all other composite types,
the types of the components must be equivalent. Additionally, for equivalent arrays,
the lengths must be equal (or absent), and for channel types the mode must be equal
(">", "<", or none). The names of receivers, parameters, or result values of functions
are ignored for the purpose of type equivalence.
For instance, the struct type
struct {
a int;
b int;
f *func (m *[32] float, x int, y int) bool
}
is equivalent to
struct {
a, b int;
f *F
}
where "F" is declared as "func (a *[30 + 2] float, b, c int) (ok bool)".
Finally, two interface types are equivalent if they both declare the same set of
methods: For each method in the first interface type there is a method in the
second interface type with the same method name and equivalent signature, and
vice versa. Note that the declaration order of the methods is not relevant.
Literals
----
@ -1036,6 +1081,7 @@ the following holds:
t.f == 0.0
t.next == nil
Export declarations
----
@ -1184,6 +1230,7 @@ TODO: how does this definition jibe with using nil to specify
conversion failure if the result is not of pointer type, such
as an any variable holding an int?
Allocation
----
@ -1243,6 +1290,7 @@ TODO: are there parameters to any conversions? go.y has oexpr_list as the
contents of a TypeName() conversion; i expected expr instead and that's what
the others have.
The constant generator 'iota'
----
@ -1762,6 +1810,7 @@ followed by a series of declarations.
Program = PackageClause { ImportDecl } { Declaration } .
TODO
----