mirror of
https://github.com/golang/go
synced 2024-11-05 18:36:08 +00:00
- Fixed bug in spec: PrimaryExpr is too restrictive in most places
(for instance *p was not allowed on the left side of "="). Changed to Expression everywhere (this is too liberal, UnaryExpr is probably good enough, but it seems funny, and we need to check semantically anyway). This matches 6g yacc. - Write expression syntac recursively to express evaluation order and precedence syntactically. - Organized open issues list, folded in stuff from todo.txt which is now obsolete. R=r DELTA=108 (41 added, 52 deleted, 15 changed) OCL=16903 CL=16910
This commit is contained in:
parent
41c462c0a1
commit
57b34617e0
1 changed files with 57 additions and 28 deletions
|
@ -4,7 +4,7 @@ The Go Programming Language Specification (DRAFT)
|
|||
Robert Griesemer, Rob Pike, Ken Thompson
|
||||
|
||||
----
|
||||
(October 9, 2008)
|
||||
(October 10, 2008)
|
||||
|
||||
|
||||
This document is a semi-formal specification of the Go systems
|
||||
|
@ -17,16 +17,38 @@ Any part may change substantially as design progresses.
|
|||
|
||||
|
||||
<!--
|
||||
Open issues according to gri:
|
||||
Timeline (9/5/08):
|
||||
- threads: 1 month
|
||||
- reflection code: 2 months
|
||||
- proto buf support: 3 months
|
||||
- GC: 6 months
|
||||
- debugger
|
||||
- Jan 1, 2009: enough support to write interesting programs
|
||||
|
||||
|
||||
Missing:
|
||||
[ ] partial export of structs, methods
|
||||
[ ] syntax for var args
|
||||
[ ] range statement: to be defined more reasonably
|
||||
[ ] reflection support
|
||||
[ ] packages of multiple files
|
||||
[ ] Helper syntax for composite types: allow names/indices for maps/arrays,
|
||||
remove need for type in elements of composites
|
||||
|
||||
|
||||
Todo's:
|
||||
[ ] clarification on interface types, rules
|
||||
[ ] clarify slice rules
|
||||
[ ] clarify tuples
|
||||
[ ] need to talk about precise int/floats clearly
|
||||
[ ] iant suggests to use abstract/precise int for len(), cap() - good idea
|
||||
(issue: what happens in len() + const - what is the type?)
|
||||
|
||||
|
||||
Open issues:
|
||||
[ ] convert should not be used for composite literals anymore,
|
||||
in fact, convert() should go away
|
||||
[ ] syntax for var args
|
||||
[ ] reflection support in the language
|
||||
[ ] partial export of structs, methods
|
||||
[ ] if statement: else syntax must be fixed
|
||||
[ ] range statement: to be defined more reasonably
|
||||
[ ] packages of multiple files: dealing with it is convoluted
|
||||
[ ] should we have a shorter list of alias types? (byte, int, uint, float)
|
||||
[ ] old-style export decls (still needed, but ideally should go away)
|
||||
[ ] new(arraytype, n1, n2): spec only talks about length, not capacity
|
||||
|
@ -35,15 +57,9 @@ Open issues according to gri:
|
|||
[ ] comparison operators: can we compare interfaces?
|
||||
[ ] like to have assert() in the language, w/ option to disable code gen for it
|
||||
[ ] composite types should uniformly create an instance instead of a pointer
|
||||
[ ] clarify slice rules
|
||||
[ ] something on tuples?
|
||||
[ ] semantics of statements
|
||||
[ ] need for type switch? (or use type guard with ok in tuple assignment?)
|
||||
[ ] can we add methods to types defined in another package?
|
||||
[ ] do we need anything on package vs file names?
|
||||
[ ] need to talk about precise int/floats clearly
|
||||
[ ] iant suggests to use abstract/precise int for len(), cap() - good idea
|
||||
(issue: what happens in len() + const - what is the type?)
|
||||
[ ] 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
|
||||
[ ] type switch or some form of type test needed
|
||||
|
@ -67,7 +83,9 @@ Open issues according to gri:
|
|||
Decisions in need of integration into the doc:
|
||||
[ ] pair assignment is required to get map, and receive ok.
|
||||
|
||||
Closed issues:
|
||||
|
||||
Closed:
|
||||
[x] can we add methods to types defined in another package? (probably not)
|
||||
[x] optional semicolons: too complicated and unclear
|
||||
[x] anonymous types are written using a type name, which can be a qualified identifier.
|
||||
this might be a problem when referring to such a field using the type name.
|
||||
|
@ -197,7 +215,7 @@ The syntax of PEBNF can be expressed in itself:
|
|||
Parameters = "<" production_name { "," production_name } ">" .
|
||||
Expression = Alternative { "|" Alternative } .
|
||||
Alternative = Term { Term } .
|
||||
Term = production_name [ Arguments ] | token | Group | Option | Repetition .
|
||||
Term = production_name [ Arguments ] | token [ "..." token ] | Group | Option | Repetition .
|
||||
Arguments = "<" Expression { "," Expression } ">" .
|
||||
Group = "(" Expression ")" .
|
||||
Option = "[" Expression ")" .
|
||||
|
@ -222,6 +240,9 @@ The parameterized production for such lists is:
|
|||
|
||||
In this case, P stands for the actual list element.
|
||||
|
||||
Where possible, recursive productions are used to express evaluation order
|
||||
and operator precedence syntactically (for instance for expressions).
|
||||
|
||||
A production may be referenced from various places in this document
|
||||
but is usually defined close to its first use. Productions and code
|
||||
examples are indented.
|
||||
|
@ -1503,7 +1524,14 @@ function literal.
|
|||
Primary expressions
|
||||
----
|
||||
|
||||
PrimaryExpr = Operand { Selector | Index | Slice | TypeGuard | Call } .
|
||||
PrimaryExpr =
|
||||
Operand |
|
||||
PrimaryExpr Selector |
|
||||
PrimaryExpr Index |
|
||||
PrimaryExpr Slice |
|
||||
PrimaryExpr TypeGuard |
|
||||
PrimaryExpr Call .
|
||||
|
||||
Selector = "." identifier .
|
||||
Index = "[" Expression "]" .
|
||||
Slice = "[" Expression ":" Expression "]" .
|
||||
|
@ -1657,9 +1685,9 @@ Operators
|
|||
|
||||
Operators combine operands into expressions.
|
||||
|
||||
Expression = UnaryExpr { binary_op Expression } .
|
||||
UnaryExpr = unary_op UnaryExpr | PrimaryExpr .
|
||||
|
||||
Expression = UnaryExpr | Expression binaryOp UnaryExpr .
|
||||
UnaryExpr = PrimaryExpr | unary_op UnaryExpr .
|
||||
|
||||
binary_op = log_op | com_op | rel_op | add_op | mul_op .
|
||||
log_op = "||" | "&&" .
|
||||
com_op = "<-" .
|
||||
|
@ -1680,7 +1708,9 @@ The operand types in binary operations must be equal, with the following excepti
|
|||
- If both operands are ideal numbers, the conversion is to ideal floats
|
||||
if one of the operands is an ideal float (relevant for "/" and "%").
|
||||
|
||||
Unary operators have the highest precedence.
|
||||
Unary operators have the highest precedence. They are evaluated from
|
||||
right to left.
|
||||
|
||||
There are six precedence levels for binary operators:
|
||||
multiplication operators bind strongest, followed by addition
|
||||
operators, comparison operators, communication operators,
|
||||
|
@ -1695,7 +1725,7 @@ lowest precedence:
|
|||
2 &&
|
||||
1 ||
|
||||
|
||||
Operators of the same precedence associate from left to right.
|
||||
Binary operators of the same precedence associate from left to right.
|
||||
For instance, "x / y / z" stands for "(x / y) / z".
|
||||
|
||||
Examples
|
||||
|
@ -2017,7 +2047,7 @@ The empty statement does nothing.
|
|||
Expression statements
|
||||
----
|
||||
|
||||
ExpressionStat = PrimaryExpr .
|
||||
ExpressionStat = Expression .
|
||||
|
||||
f(x+y)
|
||||
|
||||
|
@ -2030,7 +2060,7 @@ IncDec statements
|
|||
The "++" and "--" statements increment or decrement their operands
|
||||
by the (ideal) constant value 1.
|
||||
|
||||
IncDecStat = PrimaryExpr ( "++" | "--" ) .
|
||||
IncDecStat = Expression ( "++" | "--" ) .
|
||||
|
||||
The following assignment statements (§Assignments) are semantically
|
||||
equivalent:
|
||||
|
@ -2048,8 +2078,7 @@ For instance, "x++" cannot be used as an operand in an expression.
|
|||
Assignments
|
||||
----
|
||||
|
||||
Assignment = PrimaryExprList assign_op ExpressionList .
|
||||
PrimaryExprList = PrimaryExpr { "," PrimaryExpr } .
|
||||
Assignment = ExpressionList assign_op ExpressionList .
|
||||
|
||||
assign_op = [ add_op | mul_op ] "=" .
|
||||
|
||||
|
@ -2272,10 +2301,10 @@ Go statements
|
|||
----
|
||||
|
||||
A go statement starts the execution of a function as an independent
|
||||
concurrent thread of control within the same address space. PrimaryExpr
|
||||
concurrent thread of control within the same address space. The expression
|
||||
must evaluate into a function call.
|
||||
|
||||
GoStat = "go" PrimaryExpr .
|
||||
GoStat = "go" Expression .
|
||||
|
||||
Unlike with a regular function call, program execution does not wait
|
||||
for the invoked function to complete.
|
||||
|
@ -2295,7 +2324,7 @@ cases all referring to communication operations.
|
|||
CommClause = CommCase [ StatementList ] .
|
||||
CommCase = ( "default" | ( "case" ( SendExpr | RecvExpr) ) ) ":" .
|
||||
SendExpr = Expression "<-" Expression .
|
||||
RecvExpr = [ PrimaryExpr ( "=" | ":=" ) ] "<-" Expression .
|
||||
RecvExpr = [ Expression ( "=" | ":=" ) ] "<-" Expression .
|
||||
|
||||
Each communication clause acts as a block for the purpose of scoping
|
||||
(§Declarations and scope rules).
|
||||
|
|
Loading…
Reference in a new issue