I am sure it has been discussed, but why the aversion to using < > in type declarations? I guess I just don’t understand using bracketing notations that are already used for something else.
When I see [] I can immediately see - ah, slice/map reference. When I see () I can immediately see - ah function (or expression grouping which is similar) Since generics will be optional (I assume), I think it should have a notation that is not used frequently, so the generic aspects stand out. > On Oct 22, 2018, at 2:41 PM, Ian Denhardt <i...@zenhack.net> wrote: > > Observation: this discussion is very close to the debate around operator > overloading. In fact, if we add generics to the language, we could > define interfaces (I will use Alan Fox's square bracket syntax, as I > think it improves readability): > > type Iterator[type Elem] interface { > Next() bool > Current() Elem > } > > type Iterable[type Elem] interface { > Iter() Iterator[Elem] > } > > Then, generic iterator code could look like: > > for it := collection.Iter(); it.Next(); { > cur := it.Current() > // ... > } > > In this case, allowing range to be used with user-defined collections is > more-or-less a special case of operator overloading. > > I'm not making a value judgement here, just an observation. The > arguments for and against I think are almost 1-to-1. > > Quoting 'Axel Wagner' via golang-nuts (2018-10-22 15:20:37) >> There's also the additional objection that this doesn't play well with >> break/return - if the iterator needs to do some cleanup (say, closing a >> file or something). IMO, these days, just use bufio.Scanner-like >> iterators or just a channel+context, if syntax is that important to >> you. But personally I don't see the point of introducing a custom >> iterator concept just to *occasionally* save one or two lines of code. >> >> On Mon, Oct 22, 2018 at 7:16 PM Eric S. Raymond <[1]e...@thyrsus.com> >> wrote: >> >> David Anderson <[2]d...@natulte.net>: >>> [3]https://github.com/golang/go/issues/13027 is a past proposal to >> allow the >>> `range` operation to work on arbitrary types (although it was >> originally >>> proposed as a narrow enhancement on container/list only). Didn't >> get very >>> far, but sprinkled in the bug are some of the objections a new >> proposal >>> would want to address. >> Read it.� Not thought through very well, alas. Rightly rejected. >>> The big one for me personally is the argument for readability: >> currently, >>> Go code doesn't contain surprising execution: if there's not a >> function >>> call, you can reasonably expect that there's no hidden computation >>> happening. Python-style iterators and generators specifically go >> against >>> that, in that a simple looking range statement might run >> arbitrarily >>> complex code between loop iterations, rather than just increment a >> pointer. >> That is a reasonable objection.� But there is potentially a *much* >> simpler way to specify an iterator that actually *uses* a function >> call, properly cluing the reader in that something >> function-call-like >> is going on.� And doesn't require a special iterator construct tied >> to classes, meeting Griesemer's objection. >> In my real-world case, I want an iterator so I can walk through a >> list >> of hundreds of thousands of items selecting those of interest >> without >> having to construct the entire list of selectees.� I'm mulling over >> a >> couple of alternative variations, but the core idea is to give range >> new semantics when it's passed an expression of *function* type >> Suppose you see this: >> for i, commit:= range IteratorFactory(MyStupidlyLongEventList, >> "commits") { >> � � � � DoStuffWith(commit) >> } >> The concept is that the first thing the loop does is call >> IteratorFactory(), >> which returns not a list but a *closure*.� The loop then evaluates >> the closure >> repeatedly, binding its return value to commit and running the loop >> body, until >> the closure return tells the loop to terminate, >> This meets the discoverability objection. The function call is your >> clue that to understand he loop you need to look at the return value >> of >> IteractorFactory, which could have been a list or map or channel >> before >> my proposal and could after it be a closure. >> (I think it's a little oversimplifying to claim that the current >> semantics >> is as simple as a pointer bump, especially with respect to >> channels.) >> The detail in which the devil lurks is how the closure returns a >> stop value. >> There are a couple of different ways this could work; I'll write an >> RFE >> once I figure out which is the Right Thing. >> -- >> � � � � � � � � <a href="[4]http://www.catb.org/~esr/">Eric >> S. Raymond</a> >> My work is funded by the Internet Civil Engineering Institute: >> [5]https://icei.org >> Please visit their site and donate: the civilization you save might >> be your own. >> -- >> 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 [6]golang-nuts+unsubscr...@googlegroups.com. >> For more options, visit [7]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 [8]golang-nuts+unsubscr...@googlegroups.com. >> For more options, visit [9]https://groups.google.com/d/optout. >> >> Verweise >> >> 1. mailto:e...@thyrsus.com >> 2. mailto:d...@natulte.net >> 3. https://github.com/golang/go/issues/13027 >> 4. http://www.catb.org/~esr/ >> 5. https://icei.org/ >> 6. mailto:golang-nuts%2bunsubscr...@googlegroups.com >> 7. https://groups.google.com/d/optout >> 8. mailto:golang-nuts+unsubscr...@googlegroups.com >> 9. 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. -- 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.