On Friday, October 21, 2016 at 11:26:46 PM UTC+8, T L wrote: > > > > On Friday, October 21, 2016 at 4:31:51 AM UTC+8, gri wrote: >> >> To answer the subject line question: No, short variable declarations are >> not technically necessary. We could have chosen not to have them. But there >> are good reasons for them. It was a deliberate design decision. >> >> Let me throw in a bit of historical perspective: >> >> Rob's invention of ":=" in one of his prior languages, and later, our >> shared experience with ":=" in Sawzall ( >> https://en.wikipedia.org/wiki/Sawzall_(programming_language)) led to the >> desire of wanting ":=" in Go. Variable declaration and initialization is >> among the most common statements written in an imperative programming >> language (next to simple assignment), and ":=" worked beautifully and >> succinctly for this purpose in the past, and it fit well into the overall >> design of Go. >> >> The key here is that providing an initialization expression is mandatory >> with ":=" (in contrast to "just" a variable declaration), and because it's >> mandatory, we can omit the type of the variable (assuming we're ok with the >> type of the initialization expression). >> >> At the same time we wouldn't simple give up ordinary variable >> declarations, using the "var" keyword. For one, at the package level, a >> free-standing (i.e., w/o introductory keyword) "v := x" would cause parsing >> difficulties and be somewhat irregular compared to all other declarations. >> >> Thus, originally, "x := y" was simply very convenient syntactic sugar for >> "var x = y" and both could be used interchangeably, in most places. Go has >> little syntactic sugar, and where it has, it's because there's a lot of >> "bang for the buck" - and that's certainly the case for ":=". >> >> The fact that "var x = y" is not permitted as a "for" loop initialization >> statement was simply a design decision. Ian Taylor suggested that it's >> "ugly". Aesthetics plaid a role here; and different people find different >> things attractive. There's no hard technical reason why it couldn't be >> permitted, it just isn't. >> >> Finally, the special rule permitting "redeclarations" with ":=" only came >> in later. It gave short variable declarations different powers over regular >> keyword-based variable declarations. While it was considered a very useful >> new rule, it definitively distracted from the simple syntactic sugar >> regularity. >> >> It is no secret that many people (including us) think that there may be >> too many different yet similar ways of declaring and initializing variables >> in Go; and it would be nice if a future Go could streamline and simplify >> this. But we should also keep in mind that variable declaration and >> initialization, next to simple assignment, are the most common statements >> in program (it's one of the few things hardware can actually do directly, >> which is moving data from a to b), so it does not seem unreasonable to have >> various ways to express that, fine-tuned for each (relatively common) use >> case. >> >> - gri >> >> > Thanks, gri, this is almost the answer I want. > > I still have two small questions about the short form. > 1. would it be good to allow all identifiers in a short form are old ones > (assume there is only one code block)? > 2. would it be good/better to let identifiers in a short form not shadow > outer block identifiers? > I know the second one will break compatibility. It is not a feature > request. It is just a plain question. >
how about adding a ::= operator to satisfy above two rules? > > >> >> On Thu, Oct 20, 2016 at 12:19 AM, T L <tapi...@gmail.com> wrote: >> >>> >>> >>> On Thursday, October 20, 2016 at 3:25:18 AM UTC+8, Ian Lance Taylor >>> wrote: >>>> >>>> On Wed, Oct 19, 2016 at 11:38 AM, Michael Jones <michae...@gmail.com> >>>> wrote: >>>> > As in a number of previous questions, this one was asked poorly and >>>> the answers dance all around the intention. I had decided never to enter >>>> the fray of these oddly-put assertion/half questions, but since this is >>>> lingering, may I suggest that this is his real question: >>>> > >>>> > “can we have var-style declarations in the places where the shorthand >>>> syntax is allowed?” >>>> > >>>> > elaborating… >>>> > >>>> > for i := 0; i < 10; i++ {…} >>>> > >>>> > might also allow >>>> > >>>> > for var i int; i < 10; i++ {…} >>>> > >>>> > and likewise in other short-variable-permitting contexts. >>>> > >>>> > Personally, it seems that the simplest argument in favor would be >>>> orthogonality and the best argument in favor would be the natural creation >>>> of multiple scope local variables. This “best” is not very strong, though, >>>> since it is unclear to me how you could introduce variables of multiple >>>> types. >>>> > >>>> > Not taking sides here…just feeling that the core issue was not >>>> addressed. Nor was the much better question that was not asked, “why was >>>> the decision made in Go not to allow non-short variable declarations in >>>> these contexts?” >>>> >>>> Thanks for trying to clarify. >>>> >>>> I'm not sure I buy the orthogonality argument here. I mean, why not >>>> permit any statement in the first clause of a for statement? Why >>>> restrict it to just variable declarations? But if we accept that it >>>> is restricted, I think it seems reasonable to restrict only to short >>>> variable declarations, since `for var i int` seems to me to be ugly. >>>> >>>> You can create multiple local variables in the for scope by writing, >>>> for example >>>> for a, b := 0, 10; a < b; a++ { >>>> (That would work with var, too). >>>> >>>> Ian >>>> >>> >>> I think the short form should be used as a supplement for the normal var >>> form, >>> Specifically, short form should be used in the situation new variable >>> identifiers and old variable identifiers are hybrid, >>> or the situation only new variable identifiers exist. >>> >>> But now, the short form in an inner block will shadow variables in outer >>> block. >>> If we really want to shadow variables in outer block, then we can just >>> use the normal var form. >>> Now the design makes the short form compete with the normal var form. >>> >>> >>> >>> -- >>> You received this message because you are subscribed to the Google >>> Groups "golang-nuts" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to golang-nuts...@googlegroups.com. >>> For more options, visit https://groups.google.com/d/optout. >>> >> >> -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.