mirror of
https://github.com/golang/go
synced 2024-11-25 12:17:56 -07:00
- exceptional conditions during expression evaluation are undefined
- "nil" for interfaces, comparison against "nil" R=r DELTA=38 (24 added, 5 deleted, 9 changed) OCL=16207 CL=16211
This commit is contained in:
parent
4d571c9093
commit
52a548034e
@ -47,11 +47,9 @@ Open issues according to gri:
|
|||||||
(issue: what happens in len() + const - what is the type?)
|
(issue: what happens in len() + const - what is the type?)
|
||||||
[ ] Do composite literals create a new literal each time (gri thinks yes)
|
[ ] Do composite literals create a new literal each time (gri thinks yes)
|
||||||
[ ] consider syntactic notation for composite literals to make them parseable w/o type information
|
[ ] consider syntactic notation for composite literals to make them parseable w/o type information
|
||||||
[ ] nil and interfaces - can we test for nil, what does it mean, etc.
|
|
||||||
[ ] type switch or some form of type test needed
|
[ ] type switch or some form of type test needed
|
||||||
[ ] what is the meaning of typeof()
|
[ ] what is the meaning of typeof()
|
||||||
[ ] at the moment: type T S; strips any methods of S. It probably shouldn't.
|
[ ] at the moment: type T S; strips any methods of S. It probably shouldn't.
|
||||||
[ ] talk about underflow/overflow of 2's complement numbers (defined vs not defined).
|
|
||||||
[ ] 6g allows: interface { f F } where F is a function type. fine, but then we should
|
[ ] 6g allows: interface { f F } where F is a function type. fine, but then we should
|
||||||
also allow: func f F {}, where F is a function type.
|
also allow: func f F {}, where F is a function type.
|
||||||
[ ] provide composite literal notation to address array indices: []int{ 0: x1, 1: x2, ... }
|
[ ] provide composite literal notation to address array indices: []int{ 0: x1, 1: x2, ... }
|
||||||
@ -60,6 +58,8 @@ Decisions in need of integration into the doc:
|
|||||||
[ ] pair assignment is required to get map, and receive ok.
|
[ ] pair assignment is required to get map, and receive ok.
|
||||||
|
|
||||||
Closed issues:
|
Closed issues:
|
||||||
|
[x] nil and interfaces - can we test for nil, what does it mean, etc.
|
||||||
|
[x] talk about underflow/overflow of 2's complement numbers (defined vs not defined).
|
||||||
[x] change wording on array composite literals: the types are always fixed arrays
|
[x] change wording on array composite literals: the types are always fixed arrays
|
||||||
for array composites
|
for array composites
|
||||||
[x] meaning of nil
|
[x] meaning of nil
|
||||||
@ -1249,6 +1249,11 @@ TODO(gri) This may be overly constraining. What about "len(a) + c" where
|
|||||||
c is an ideal number? Is len(a) of type int, or of an ideal number? Probably
|
c is an ideal number? Is len(a) of type int, or of an ideal number? Probably
|
||||||
should be ideal number, because for fixed arrays, it is a constant.
|
should be ideal number, because for fixed arrays, it is a constant.
|
||||||
|
|
||||||
|
If an exceptional condition occurs during the evaluation of an expression
|
||||||
|
(that is, if the result is not mathematically defined or not in the range
|
||||||
|
of representable values for its type), the behavior is undefined. For
|
||||||
|
instance, the behavior of integer under- or overflow is not defined.
|
||||||
|
|
||||||
|
|
||||||
Operands
|
Operands
|
||||||
----
|
----
|
||||||
@ -1511,9 +1516,6 @@ Operators combine operands into expressions.
|
|||||||
|
|
||||||
unary_op = "+" | "-" | "!" | "^" | "*" | "&" | "<-" .
|
unary_op = "+" | "-" | "!" | "^" | "*" | "&" | "<-" .
|
||||||
|
|
||||||
TODO: If we allow non-blocking sends only in the form "ok = ch <- x", it doesn't
|
|
||||||
make sense to give binary "<-" precedence 3. It should be at the lowest level. TBD.
|
|
||||||
|
|
||||||
The operand types in binary operations must be equal, with the following exceptions:
|
The operand types in binary operations must be equal, with the following exceptions:
|
||||||
|
|
||||||
- The right operand in a shift operation must be
|
- The right operand in a shift operation must be
|
||||||
@ -1625,7 +1627,8 @@ Comparison operators
|
|||||||
|
|
||||||
Comparison operators yield a boolean result. All comparison operators apply
|
Comparison operators yield a boolean result. All comparison operators apply
|
||||||
to strings and numeric types. The operators "==" and "!=" also apply to
|
to strings and numeric types. The operators "==" and "!=" also apply to
|
||||||
boolean values and to pointer types (including the value "nil").
|
boolean values and to pointer types (including the value "nil"). Finally,
|
||||||
|
"==" and "!=" can also be used to compare interface types against "nil".
|
||||||
|
|
||||||
== equal
|
== equal
|
||||||
!= not equal
|
!= not equal
|
||||||
@ -1634,7 +1637,12 @@ boolean values and to pointer types (including the value "nil").
|
|||||||
> greater
|
> greater
|
||||||
>= greater or equal
|
>= greater or equal
|
||||||
|
|
||||||
TODO: Can we/should we be able to compare interfaces?
|
Strings are compared byte-wise (lexically).
|
||||||
|
|
||||||
|
Interfaces can be tested against "nil" (§Interface types).
|
||||||
|
For a value "v" of interface type, "v == nil" is true only if the predeclared
|
||||||
|
constant "nil" is assigned explicitly to "v" (§Assignments), or "v" has not
|
||||||
|
been modified since creation (§Program initialization and execution).
|
||||||
|
|
||||||
|
|
||||||
Logical operators
|
Logical operators
|
||||||
@ -1845,11 +1853,22 @@ Expression statements
|
|||||||
IncDec statements
|
IncDec statements
|
||||||
----
|
----
|
||||||
|
|
||||||
|
The "++" and "--" statements increment or decrement their operands
|
||||||
|
by the (ideal) constant value 1.
|
||||||
|
|
||||||
IncDecStat = Expression ( "++" | "--" ) .
|
IncDecStat = Expression ( "++" | "--" ) .
|
||||||
|
|
||||||
a[i]++
|
The following assignment statements (§Assignments) are semantically
|
||||||
|
equivalent:
|
||||||
|
|
||||||
Note that ++ and -- are not operators for expressions.
|
IncDec statement Assignment
|
||||||
|
x++ x += 1
|
||||||
|
x-- x -= 1
|
||||||
|
|
||||||
|
Both operators apply to integer and floating point types only.
|
||||||
|
|
||||||
|
Note that increment and decrement are statements, not expressions.
|
||||||
|
For instance, "x++" cannot be used as an operand in an expression.
|
||||||
|
|
||||||
|
|
||||||
Assignments
|
Assignments
|
||||||
@ -2522,12 +2541,12 @@ Program initialization and execution
|
|||||||
----
|
----
|
||||||
|
|
||||||
When memory is allocated to store a value, either through a declaration
|
When memory is allocated to store a value, either through a declaration
|
||||||
or new(), and no explicit initialization is provided, the memory is
|
or "new()", and no explicit initialization is provided, the memory is
|
||||||
given a default initialization. Each element of such a value is
|
given a default initialization. Each element of such a value is
|
||||||
set to the ``zero'' for that type: "false" for booleans, "0" for integers,
|
set to the ``zero'' for that type: "false" for booleans, "0" for integers,
|
||||||
"0.0" for floats, '''' for strings, and nil for pointers. This intialization
|
"0.0" for floats, '''' for strings, and "nil" for pointers and interfaces.
|
||||||
is done recursively, so for instance each element of an array of integers will
|
This intialization is done recursively, so for instance each element of an
|
||||||
be set to 0 if no other value is specified.
|
array of integers will be set to 0 if no other value is specified.
|
||||||
|
|
||||||
These two simple declarations are equivalent:
|
These two simple declarations are equivalent:
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user