1
0
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:
Rob Pike 2009-11-07 22:00:59 -08:00
parent 642caacfa3
commit 4fe4192ac9

View File

@ -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>&quot;&quot;</code>. The text between the quotes forms the quotes <code>&quot;&quot;</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&lt;&lt;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 = &lt;-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>