mirror of
https://github.com/golang/go
synced 2024-11-05 18:36:08 +00:00
spec: terminating statements for functions
The only functional change is the new section on terminating statements. There is a minor syntax rewrite (not change) of function declarations to make it easier to refer to the notion of a function from all places where it is used (function decls, method decls, and function literals). Includes some minor fixes/additions of missing links. Based closely on Russ' proposal. Fixes #65. R=rsc, r, iant, ken, bradfitz CC=golang-dev https://golang.org/cl/7415050
This commit is contained in:
parent
4be38dde84
commit
9905cec0dc
1 changed files with 105 additions and 17 deletions
122
doc/go_spec.html
122
doc/go_spec.html
|
@ -1469,12 +1469,13 @@ Any value may be assigned to the <a href="#Blank_identifier">blank identifier</a
|
|||
<h2 id="Blocks">Blocks</h2>
|
||||
|
||||
<p>
|
||||
A <i>block</i> is a sequence of declarations and statements within matching
|
||||
brace brackets.
|
||||
A <i>block</i> is a possibly empty sequence of declarations and statements
|
||||
within matching brace brackets.
|
||||
</p>
|
||||
|
||||
<pre class="ebnf">
|
||||
Block = "{" { Statement ";" } "}" .
|
||||
Block = "{" StatementList "}" .
|
||||
StatementList = { Statement ";" } .
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
|
@ -1490,10 +1491,13 @@ In addition to explicit blocks in the source code, there are implicit blocks:
|
|||
<li>Each file has a <i>file block</i> containing all Go source text
|
||||
in that file.</li>
|
||||
|
||||
<li>Each <code>if</code>, <code>for</code>, and <code>switch</code>
|
||||
<li>Each <a href="#If_statements">"if"</a>,
|
||||
<a href="#For_statements">"for"</a>, and
|
||||
<a href="#Switch_statements">"switch"</a>
|
||||
statement is considered to be in its own implicit block.</li>
|
||||
|
||||
<li>Each clause in a <code>switch</code> or <code>select</code> statement
|
||||
<li>Each clause in a <a href="#Switch_statements">"switch"</a>
|
||||
or <a href="#Select_statements">"select"</a> statement
|
||||
acts as an implicit block.</li>
|
||||
</ol>
|
||||
|
||||
|
@ -1948,11 +1952,18 @@ to a function.
|
|||
</p>
|
||||
|
||||
<pre class="ebnf">
|
||||
FunctionDecl = "func" FunctionName Signature [ Body ] .
|
||||
FunctionDecl = "func" FunctionName ( Function | Signature ) .
|
||||
FunctionName = identifier .
|
||||
Body = Block .
|
||||
Function = Signature FunctionBody .
|
||||
FunctionBody = Block .
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
If the function's <a href="#Function_types">signature</a> declares
|
||||
result parameters, the function body's statement list must end in
|
||||
a <a href="#Terminating_statements">terminating statement</a>.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
A function declaration may omit the body. Such a declaration provides the
|
||||
signature for a function implemented outside Go, such as an assembly routine.
|
||||
|
@ -1972,13 +1983,13 @@ func flushICache(begin, end uintptr) // implemented externally
|
|||
<h3 id="Method_declarations">Method declarations</h3>
|
||||
|
||||
<p>
|
||||
A method is a function with a <i>receiver</i>.
|
||||
A method declaration binds an identifier, the <i>method name</i>, to a method.
|
||||
It also associates the method with the receiver's <i>base type</i>.
|
||||
A method is a <a href="#Function_declarations">function</a> with a <i>receiver</i>.
|
||||
A method declaration binds an identifier, the <i>method name</i>, to a method,
|
||||
and associates the method with the receiver's <i>base type</i>.
|
||||
</p>
|
||||
|
||||
<pre class="ebnf">
|
||||
MethodDecl = "func" Receiver MethodName Signature [ Body ] .
|
||||
MethodDecl = "func" Receiver MethodName ( Function | Signature ) .
|
||||
Receiver = "(" [ identifier ] [ "*" ] BaseTypeName ")" .
|
||||
BaseTypeName = identifier .
|
||||
</pre>
|
||||
|
@ -2284,12 +2295,11 @@ noteFrequency := map[string]float32{
|
|||
<h3 id="Function_literals">Function literals</h3>
|
||||
|
||||
<p>
|
||||
A function literal represents an anonymous function.
|
||||
It consists of a specification of the function type and a function body.
|
||||
A function literal represents an anonymous <a href="#Function_declarations">function</a>.
|
||||
</p>
|
||||
|
||||
<pre class="ebnf">
|
||||
FunctionLit = FunctionType Body .
|
||||
FunctionLit = "func" Function .
|
||||
</pre>
|
||||
|
||||
<pre>
|
||||
|
@ -3843,6 +3853,84 @@ Statement =
|
|||
SimpleStmt = EmptyStmt | ExpressionStmt | SendStmt | IncDecStmt | Assignment | ShortVarDecl .
|
||||
</pre>
|
||||
|
||||
<h3 id="Terminating_statements">Terminating statements</h3>
|
||||
|
||||
<p>
|
||||
A terminating statement is one of the following:
|
||||
</p>
|
||||
|
||||
<ol>
|
||||
<li>
|
||||
A <a href="#Return_statements">"return"</a> or
|
||||
<a href="#Goto_statements">"goto"</a> statement.
|
||||
<!-- ul below only for regular layout -->
|
||||
<ul> </ul>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
A call to the built-in function
|
||||
<a href="#Handling_panics"><code>panic</code></a>.
|
||||
<!-- ul below only for regular layout -->
|
||||
<ul> </ul>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
A <a href="#Blocks">block</a> in which the statement list ends in a terminating statement.
|
||||
<!-- ul below only for regular layout -->
|
||||
<ul> </ul>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
An <a href="#If_statements">"if" statement</a> in which:
|
||||
<ul>
|
||||
<li>the "else" branch is present, and</li>
|
||||
<li>both branches are terminating statements.</li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
A <a href="#For_statements">"for" statement</a> in which:
|
||||
<ul>
|
||||
<li>there are no "break" statements referring to the "for" statement, and</li>
|
||||
<li>the loop condition is absent.</li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
A <a href="#Switch_statements">"switch" statement</a> in which:
|
||||
<ul>
|
||||
<li>there are no "break" statements referring to the "switch" statement,</li>
|
||||
<li>there is a default case, and</li>
|
||||
<li>the statement lists in each case, including the default, end in a terminating
|
||||
statement, or a possibly labeled <a href="#Fallthrough_statements">"fallthrough"
|
||||
statement</a>.</li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
A <a href="#Select_statements">"select" statement</a> in which:
|
||||
<ul>
|
||||
<li>there are no "break" statements referring to the "select" statement, and</li>
|
||||
<li>the statement lists in each case, including the default if present,
|
||||
end in a terminating statement.</li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
A <a href="#Labeled_statements">labeled statement</a> labeling
|
||||
a terminating statement.
|
||||
</li>
|
||||
</ol>
|
||||
|
||||
<p>
|
||||
All other statements are not terminating.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
A <a href="#Blocks">statement list</a> ends in a terminating statement if the list
|
||||
is not empty and its final statement is terminating.
|
||||
</p>
|
||||
|
||||
|
||||
<h3 id="Empty_statements">Empty statements</h3>
|
||||
|
||||
|
@ -4149,7 +4237,7 @@ the expression <code>true</code>.
|
|||
|
||||
<pre class="ebnf">
|
||||
ExprSwitchStmt = "switch" [ SimpleStmt ";" ] [ Expression ] "{" { ExprCaseClause } "}" .
|
||||
ExprCaseClause = ExprSwitchCase ":" { Statement ";" } .
|
||||
ExprCaseClause = ExprSwitchCase ":" StatementList .
|
||||
ExprSwitchCase = "case" ExpressionList | "default" .
|
||||
</pre>
|
||||
|
||||
|
@ -4213,7 +4301,7 @@ expression <code>x</code>. As with type assertions, <code>x</code> must be of
|
|||
<pre class="ebnf">
|
||||
TypeSwitchStmt = "switch" [ SimpleStmt ";" ] TypeSwitchGuard "{" { TypeCaseClause } "}" .
|
||||
TypeSwitchGuard = [ identifier ":=" ] PrimaryExpr "." "(" "type" ")" .
|
||||
TypeCaseClause = TypeSwitchCase ":" { Statement ";" } .
|
||||
TypeCaseClause = TypeSwitchCase ":" StatementList .
|
||||
TypeSwitchCase = "case" TypeList | "default" .
|
||||
TypeList = Type { "," Type } .
|
||||
</pre>
|
||||
|
@ -4536,7 +4624,7 @@ cases all referring to communication operations.
|
|||
|
||||
<pre class="ebnf">
|
||||
SelectStmt = "select" "{" { CommClause } "}" .
|
||||
CommClause = CommCase ":" { Statement ";" } .
|
||||
CommClause = CommCase ":" StatementList .
|
||||
CommCase = "case" ( SendStmt | RecvStmt ) | "default" .
|
||||
RecvStmt = [ ExpressionList "=" | IdentifierList ":=" ] RecvExpr .
|
||||
RecvExpr = Expression .
|
||||
|
|
Loading…
Reference in a new issue