]> Cypherpunks repositories - gostls13.git/commitdiff
- added language for range statement
authorRobert Griesemer <gri@golang.org>
Tue, 4 Mar 2008 07:08:28 +0000 (23:08 -0800)
committerRobert Griesemer <gri@golang.org>
Tue, 4 Mar 2008 07:08:28 +0000 (23:08 -0800)
SVN=111200

doc/go_spec

index fea5c45db027c8aadf3eed765a82ff029aefc2ac..56b4ca6781b4c5c390df50535f4d9f547ee55283 100644 (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: