mirror of
https://github.com/golang/go
synced 2024-11-21 20:34:40 -07:00
fixes to spec. mostly minor but several of significance.
- carriage return is white space - "" strings cannot span newlines - f(g()) is ok if g is multivalue and matches f's args R=rsc, gri CC=go-dev http://go/go-review/1024017
This commit is contained in:
parent
642caacfa3
commit
4fe4192ac9
@ -137,7 +137,9 @@ through the character sequence <code>*/</code>. Comments do not nest.
|
|||||||
Tokens form the vocabulary of the Go language.
|
Tokens form the vocabulary of the Go language.
|
||||||
There are four classes: identifiers, keywords, operators
|
There are four classes: identifiers, keywords, operators
|
||||||
and delimiters, and literals. <i>White space</i>, formed from
|
and delimiters, and literals. <i>White space</i>, formed from
|
||||||
blanks, tabs, and newlines, is ignored except as it separates tokens
|
spaces (U+0020), horizontal tabs (U+0009),
|
||||||
|
carriage returns (U+000D), and newlines (U+000A),
|
||||||
|
is ignored except as it separates tokens
|
||||||
that would otherwise combine into a single token. Comments
|
that would otherwise combine into a single token. Comments
|
||||||
behave as white space. While breaking the input into tokens,
|
behave as white space. While breaking the input into tokens,
|
||||||
the next token is the longest sequence of characters that form a
|
the next token is the longest sequence of characters that form a
|
||||||
@ -295,7 +297,7 @@ After a backslash, certain single-character escapes represent special values:
|
|||||||
\" U+0022 double quote (valid escape only within string literals)
|
\" U+0022 double quote (valid escape only within string literals)
|
||||||
</pre>
|
</pre>
|
||||||
<p>
|
<p>
|
||||||
All other sequences are illegal inside character literals.
|
All other sequences starting with a backslash are illegal inside character literals.
|
||||||
</p>
|
</p>
|
||||||
<pre class="ebnf">
|
<pre class="ebnf">
|
||||||
char_lit = "'" ( unicode_value | byte_value ) "'" .
|
char_lit = "'" ( unicode_value | byte_value ) "'" .
|
||||||
@ -341,7 +343,8 @@ span multiple lines.
|
|||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
Interpreted string literals are character sequences between double
|
Interpreted string literals are character sequences between double
|
||||||
quotes <code>""</code>. The text between the quotes forms the
|
quotes <code>""</code>. The text between the quotes,
|
||||||
|
which may not span multiple lines, forms the
|
||||||
value of the literal, with backslash escapes interpreted as they
|
value of the literal, with backslash escapes interpreted as they
|
||||||
are in character literals (except that <code>\'</code> is illegal and
|
are in character literals (except that <code>\'</code> is illegal and
|
||||||
<code>\"</code> is legal). The three-digit octal (<code>\000</code>)
|
<code>\"</code> is legal). The three-digit octal (<code>\000</code>)
|
||||||
@ -445,9 +448,9 @@ operand in an <a href="#Expressions">expression</a>.
|
|||||||
It is an error if the constant value
|
It is an error if the constant value
|
||||||
cannot be accurately represented as a value of the respective type.
|
cannot be accurately represented as a value of the respective type.
|
||||||
For instance, <code>3.0</code> can be given any integer type but also any
|
For instance, <code>3.0</code> can be given any integer type but also any
|
||||||
floating-point type, while <code>-1e12</code> can be given the types
|
floating-point type, while <code>2147483648.0</code> (equal to <code>1<<31</code>)
|
||||||
<code>float32</code>, <code>float64</code>, or even <code>int64</code> but
|
can be given the types <code>float32</code>, <code>float64</code>, or <code>uint32</code> but
|
||||||
not <code>uint64</code> or <code>string</code>.
|
not <code>int32</code> or <code>string</code>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
@ -832,7 +835,7 @@ must either all be present or all be absent. If present, each name
|
|||||||
stands for one item (parameter or result) of the specified type; if absent, each
|
stands for one item (parameter or result) of the specified type; if absent, each
|
||||||
type stands for one item of that type. Parameter and result
|
type stands for one item of that type. Parameter and result
|
||||||
lists are always parenthesized except that if there is exactly
|
lists are always parenthesized except that if there is exactly
|
||||||
one unnamed result that is not a function type it may writen as an unparenthesized type.
|
one unnamed result that is not a function type it may written as an unparenthesized type.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
For the last parameter only, instead of a type one may write
|
For the last parameter only, instead of a type one may write
|
||||||
@ -1176,7 +1179,7 @@ they have different field names.
|
|||||||
|
|
||||||
<p>
|
<p>
|
||||||
A value <code>v</code> of static type <code>V</code> is <i>assignment compatible</i>
|
A value <code>v</code> of static type <code>V</code> is <i>assignment compatible</i>
|
||||||
with a type <code>T</code> if one of the following conditions applies:
|
with a type <code>T</code> if one or more of the following conditions applies:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
@ -1249,7 +1252,7 @@ value <code>nil</code>, if it is uninitialized, or if it has
|
|||||||
been assigned another slice value equal to <code>nil</code>·
|
been assigned another slice value equal to <code>nil</code>·
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
Similarly, an interface value is equal to <code>nil</code> if it has
|
An interface value is equal to <code>nil</code> if it has
|
||||||
been assigned the explicit value <code>nil</code>, if it is uninitialized,
|
been assigned the explicit value <code>nil</code>, if it is uninitialized,
|
||||||
or if it has been assigned another interface value equal to <code>nil</code>.
|
or if it has been assigned another interface value equal to <code>nil</code>.
|
||||||
</li>
|
</li>
|
||||||
@ -1607,8 +1610,8 @@ func (m *Mutex) Unlock() { /* Unlock implementation */ }
|
|||||||
// NewMutex has the same composition as Mutex but its method set is empty.
|
// NewMutex has the same composition as Mutex but its method set is empty.
|
||||||
type NewMutex Mutex
|
type NewMutex Mutex
|
||||||
|
|
||||||
// PrintableMutex has no methods bound to it, but the method set contains
|
// PrintableMutex's method set contains the methods
|
||||||
// the methods Lock and Unlock bound to its anonymous field Mutex.
|
// Lock and Unlock bound to its anonymous field Mutex.
|
||||||
type PrintableMutex struct {
|
type PrintableMutex struct {
|
||||||
Mutex;
|
Mutex;
|
||||||
}
|
}
|
||||||
@ -1664,7 +1667,7 @@ var _, found = entries[name]; // map lookup; only interested in "found"
|
|||||||
If a list of expressions is given, the variables are initialized
|
If a list of expressions is given, the variables are initialized
|
||||||
by assigning the expressions to the variables (§<a href="#Assignments">Assignments</a>)
|
by assigning the expressions to the variables (§<a href="#Assignments">Assignments</a>)
|
||||||
in order; all expressions must be consumed and all variables initialized from them.
|
in order; all expressions must be consumed and all variables initialized from them.
|
||||||
Otherwise, each variable is initialized to its <a href="#The_zero_value"><i>zero value</i></a>.
|
Otherwise, each variable is initialized to its <a href="#The_zero_value">zero value</a>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
@ -1770,8 +1773,8 @@ A method declaration binds an identifier to a method,
|
|||||||
which is a function with a <i>receiver</i>.
|
which is a function with a <i>receiver</i>.
|
||||||
</p>
|
</p>
|
||||||
<pre class="ebnf">
|
<pre class="ebnf">
|
||||||
MethodDecl = "func" Receiver MethodName Signature [ Body ] .
|
MethodDecl = "func" Receiver MethodName Signature [ Body ] .
|
||||||
Receiver = "(" [ identifier ] [ "*" ] BaseTypeName ")" .
|
Receiver = "(" [ identifier ] [ "*" ] BaseTypeName ")" .
|
||||||
BaseTypeName = identifier .
|
BaseTypeName = identifier .
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
@ -2420,7 +2423,7 @@ f(a1, a2, ... an)
|
|||||||
|
|
||||||
<p>
|
<p>
|
||||||
calls <code>f</code> with arguments <code>a1, a2, ... an</code>.
|
calls <code>f</code> with arguments <code>a1, a2, ... an</code>.
|
||||||
The arguments must be single-valued expressions
|
Except for one special case, arguments must be single-valued expressions
|
||||||
<a href="#Assignment_compatibility">assignment compatible</a> with the parameter types of
|
<a href="#Assignment_compatibility">assignment compatible</a> with the parameter types of
|
||||||
<code>F</code> and are evaluated before the function is called.
|
<code>F</code> and are evaluated before the function is called.
|
||||||
The type of the expression is the result type
|
The type of the expression is the result type
|
||||||
@ -2436,6 +2439,33 @@ var pt *Point;
|
|||||||
pt.Scale(3.5) // method call with receiver pt
|
pt.Scale(3.5) // method call with receiver pt
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
As a special case, if the return parameters of a function or method
|
||||||
|
<code>g</code> are equal in number and individually assignment
|
||||||
|
compatible with the parameters of another function or method
|
||||||
|
<code>f</code>, then the call <code>f(g(<i>parameters_of_g</i>))</code>
|
||||||
|
will invoke <code>f</code> after binding the return values of
|
||||||
|
<code>g</code> to the parameters of <code>f</code> in order. The call
|
||||||
|
of <code>f</code> must contain no parameters other than the call of <code>g</code>.
|
||||||
|
If <code>f</code> has a final <code>...</code> parameter, it is
|
||||||
|
assigned the return values of <code>g</code> that remain after
|
||||||
|
assignment of regular parameters.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
func Split(s string, pos int) (string, string) {
|
||||||
|
return s[0:pos], s[pos:len(s)]
|
||||||
|
}
|
||||||
|
|
||||||
|
func Join(s, t string) string {
|
||||||
|
return s + t
|
||||||
|
}
|
||||||
|
|
||||||
|
if Join(Split(value, len(value)/2)) != value {
|
||||||
|
log.Fatal("test fails")
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
A method call <code>x.m()</code> is valid if the method set of
|
A method call <code>x.m()</code> is valid if the method set of
|
||||||
(the type of) <code>x</code> contains <code>m</code> and the
|
(the type of) <code>x</code> contains <code>m</code> and the
|
||||||
@ -3179,14 +3209,6 @@ communication operations are evaluated in lexical left-to-right
|
|||||||
order.
|
order.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
|
||||||
Floating-point operations within a single expression are evaluated according to
|
|
||||||
the associativity of the operators. Explicit parentheses affect the evaluation
|
|
||||||
by overriding the default associativity.
|
|
||||||
In the expression <code>x + (y + z)</code> the addition <code>y + z</code>
|
|
||||||
is performed before adding <code>x</code>.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
For example, in the assignment
|
For example, in the assignment
|
||||||
</p>
|
</p>
|
||||||
@ -3202,6 +3224,14 @@ and indexing of <code>x</code> and the evaluation
|
|||||||
of <code>y</code> is not specified.
|
of <code>y</code> is not specified.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Floating-point operations within a single expression are evaluated according to
|
||||||
|
the associativity of the operators. Explicit parentheses affect the evaluation
|
||||||
|
by overriding the default associativity.
|
||||||
|
In the expression <code>x + (y + z)</code> the addition <code>y + z</code>
|
||||||
|
is performed before adding <code>x</code>.
|
||||||
|
</p>
|
||||||
|
|
||||||
<h2 id="Statements">Statements</h2>
|
<h2 id="Statements">Statements</h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
@ -3316,7 +3346,7 @@ assign_op = [ add_op | mul_op ] "=" .
|
|||||||
|
|
||||||
<p>
|
<p>
|
||||||
Each left-hand side operand must be <a href="#Address_operators">addressable</a>,
|
Each left-hand side operand must be <a href="#Address_operators">addressable</a>,
|
||||||
a map index expresssion,
|
a map index expression,
|
||||||
or the <a href="#Blank_identifier">blank identifier</a>.
|
or the <a href="#Blank_identifier">blank identifier</a>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
@ -3331,7 +3361,7 @@ k = <-ch
|
|||||||
An <i>assignment operation</i> <code>x</code> <i>op</i><code>=</code>
|
An <i>assignment operation</i> <code>x</code> <i>op</i><code>=</code>
|
||||||
<code>y</code> where <i>op</i> is a binary arithmetic operation is equivalent
|
<code>y</code> where <i>op</i> is a binary arithmetic operation is equivalent
|
||||||
to <code>x</code> <code>=</code> <code>x</code> <i>op</i>
|
to <code>x</code> <code>=</code> <code>x</code> <i>op</i>
|
||||||
<code>y</code> but evalutates <code>x</code>
|
<code>y</code> but evaluates <code>x</code>
|
||||||
only once. The <i>op</i><code>=</code> construct is a single token.
|
only once. The <i>op</i><code>=</code> construct is a single token.
|
||||||
In assignment operations, both the left- and right-hand expression lists
|
In assignment operations, both the left- and right-hand expression lists
|
||||||
must contain exactly one single-valued expression.
|
must contain exactly one single-valued expression.
|
||||||
@ -3727,7 +3757,7 @@ for i, s := range a {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var key string;
|
var key string;
|
||||||
var val interface {}; // value type of m is assignment compatible to val
|
var val interface {}; // value type of m is assignment compatible with val
|
||||||
for key, val = range m {
|
for key, val = range m {
|
||||||
h(key, val)
|
h(key, val)
|
||||||
}
|
}
|
||||||
@ -4397,10 +4427,11 @@ package-level function with the name and signature of
|
|||||||
func init()
|
func init()
|
||||||
</pre>
|
</pre>
|
||||||
<p>
|
<p>
|
||||||
defined in its source. Since a package may contain more
|
defined in its source.
|
||||||
than one source file, there may be more than one
|
A package may contain multiple
|
||||||
<code>init()</code> function in a package, but
|
<code>init()</code> functions, even
|
||||||
only one per source file.
|
within a single source file; they execute
|
||||||
|
in unspecified order.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
Within a package, package-level variables are initialized,
|
Within a package, package-level variables are initialized,
|
||||||
@ -4459,7 +4490,8 @@ Program execution begins by initializing the <code>main</code> package and then
|
|||||||
invoking <code>main.main()</code>.
|
invoking <code>main.main()</code>.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
When <code>main.main()</code> returns, the program exits.
|
When <code>main.main()</code> returns, the program exits. It does not wait for
|
||||||
|
other (non-<code>main</code>) goroutines to complete.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
Implementation restriction: The compiler assumes package <code>main</code>
|
Implementation restriction: The compiler assumes package <code>main</code>
|
||||||
@ -4583,4 +4615,5 @@ The following minimal alignment properties are guaranteed:
|
|||||||
<ul>
|
<ul>
|
||||||
<li><span class="alert">Implementation does not honor the restriction on goto statements and targets (no intervening declarations).</span></li>
|
<li><span class="alert">Implementation does not honor the restriction on goto statements and targets (no intervening declarations).</span></li>
|
||||||
<li><span class="alert">Method expressions are not implemented.</span></li>
|
<li><span class="alert">Method expressions are not implemented.</span></li>
|
||||||
|
<li><span class="alert">Gccgo allows only one init() function per source file.</span></li>
|
||||||
</ul>
|
</ul>
|
||||||
|
Loading…
Reference in New Issue
Block a user