- added language for range statement

SVN=111200
This commit is contained in:
Robert Griesemer 2008-03-03 23:08:28 -08:00
parent 328df636c5
commit 266b9d49bf

View file

@ -1,18 +1,13 @@
The Go Annotated Specification
This document supersedes all previous Go spec attempts. The intent is
to make this a reference for syntax and semantics. It is annotated
This document supersedes all previous Go spec attempts. The intent
is to make this a reference for syntax and semantics. It is annotated
with additional information not strictly belonging into a language
spec.
Open questions
- how to do map iteration? should be symmetric to array iteration
for k in m { ... }
for k:v in m { ... }
for :v in m { ... }
- how to delete from a map
- how to test for map membership (we may want an 'atomic install'? m[i] ?= x; )
@ -710,6 +705,7 @@ PointerType = '*' Type.
- We do not allow pointer arithmetic of any kind.
Interface types
- TBD: This needs to be much more precise. For now we understand what it means.
@ -1013,9 +1009,10 @@ func (p *T) foo (a, b int, z float) bool;
Statements
Statement = EmptyStat | Assignment | CompoundStat | Declaration |
ExpressionStat | IncDecStat | IfStat | WhileStat | ForStat |
ReturnStat .
Statement =
EmptyStat | Assignment | CompoundStat | Declaration |
ExpressionStat | IncDecStat | IfStat | WhileStat | ForStat |
RangeStat | ReturnStat .
Empty statements
@ -1094,6 +1091,31 @@ ForStat = 'for' ...
Range statements
Range statements denote iteration over the contents of arrays and maps.
RangeStat = 'range' IdentifierList ':=' RangeExpression Block .
RangeExpression = Expression .
A range expression must evaluate to an array, map or string. The identifier list must contain
either one or two identifiers. If the range expression is a map, a single identifier is declared
to range over the keys of the map; two identifiers range over the keys and corresponding
values. For arrays and strings, the behavior is analogous for integer indices (the keys) and array
elements (the values).
a := [ 1, 2, 3];
m := [ "fo" : 2, "foo" : 3, "fooo" : 4 ]
range i := a {
f(a[i]);
}
range k, v := m {
assert(len(k) == v);
}
Return statements
ReturnStat = 'return' [ ExpressionList ] .
@ -1154,7 +1176,7 @@ Precedence Operator
2 &&
3 == != < <= > >=
4 + - | ^
5 * / % << >> &
5 * / % << >> &
For integer values, / and % satisfy the following relationship: