4 ms·
The left-to-right reading is the main advantage. In C, of the 3 type operators you compose to declare the type (arrays, functions, pointers), 2 are postfix (ar
by Peaker 12y ago
The left-to-right reading is the main advantage.
In C, of the 3 type operators you compose to declare the type (arrays, functions, pointers), 2 are postfix (arrays and functions) and one is prefix (pointers). This causes a mixture of directions when you read the type. Here in go they fixed this by making arrays and functions prefix like pointers, so you get a unidirectional read and you don't need parenthesis for precedence (except maybe for associativity).
- curun1r 12y agoThe problem is that functions, in C, are neither prefix nor postfix. A postfix function would look like: int (int argc, char*[] argv)main prefix is: main(argc int, argv []*char) int The C version: int main(int argc, char *argv[]) Is a horrible jumbling of both styles, with some confusion around type and name thrown in for fun. The main benefit of the Go approach, beyond whether prefix or postfix works better, is consistency. Compare to Go's: main(argc int, argv []*char) int Once you learn to read it, it's much better, though perhaps not like English. In English, we preface the noun with the adjective, "the red car," whereas other languages say the equivalent of, "the car red." When people object to the Go syntax, they're almost always native English speakers.
- Peaker 12y agoWell, in C, the type operators are: Ptr(Type) -- deref type Array(Count, Type) -- elem type Func(ParamList, Type) -- return type Since the "Type" param is always there. C declaration syntax is like a linear composition of operators where the Type flows through all the operators to form the final type. The base type on the left of the declaration is the initial parameter that goes through the composition. So C type operator grammars (in the right-hand side of the declaration, excluding the base type) are actually: Ptr *rest_of_type Array rest_of_type[count] Func rest_of_type(params) That is why I say ptrs are prefix and array/func are postfix. All 3 have the extra implicit type argument that comes from the wrapping type-expression and the base type - so I wouldn't include it and say they're both prefix and postfix.