I gave you a simple problem, don't over think it. A Set data structure with a simple api that can work out-of-the-box - just as slices and maps with the builtins. I kept the requirements minimal. I'd like to see your solution. On Monday, June 5, 2017 at 12:52:47 AM UTC-4, Egon wrote: > > > > On Monday, 5 June 2017 06:59:46 UTC+3, utyug...@mail.com wrote: >> >> >> >> On Sunday, June 4, 2017 at 12:25:17 PM UTC-4, Egon wrote: >>> >>> I think you are missing the point of my comment. >>> >>> I'm all for generics, but I also can survive without them without much >>> of a problem. (I'm even maintaining >>> https://docs.google.com/document/d/1vrAy9gMpMoS3uaVphB32uVXX4pi-HnNjkMEgyAHX4N4 >>> >>> to understand the problem better) >>> >> >> create a custom container type that I can use with any type >> out-of-the-box. >> >> for example: iset := make(Set[int],9); sset := make(Set[string],9); pset >> := make(Set[Person]); >> >> right now, my solution is to rewrite the source with go generate calling >> a tool i wrote which grew out from a great talk from robert griesemer. The >> video: https://www.youtube.com/watch?v=vLxX3yZmw5Q >> >> This solution has nearly twice the performance increase over maps with >> almost every type used so far. Now I could have just written the 500 lines >> of code over and over again for every type needed until the end of time(or >> copy and paste and edit until the end of time), or I could use empty >> interfaces which throws type safety out the window, but I chose to write a >> tool, and when go generate came to be I chose to use that tool like a >> simple script executed within a '//go:generate go run..' tag. >> >> >> Over time golang(I do this now to annoy the zealots) provided the >> tools(reflection, /go packages, go generate) that made creating custom >> generic type safe containers easier. These things weren't always this easy, >> and these things could be easier. >> >> And I am serious about create a custom container type that I can use with >> any type out-of-the-box. Please indulge me, how would you solve this >> problem. Provide a solution for a simple type-safe container type Set that >> takes any type, with a simple api of >> insert,remove,contain,union,difference,intersection, >> complement,superset,subset. >> > > I would use copy-paste. That action to specialize and clean-up API is > pretty trivial, it might take me 3min (probably less), but it isn't a > problem. I often spend more time on tweaking CSS or figuring out what the > customer needs. Copy-pasteing code is annoying, but it's trivial low-effort > work... so it's not a problem. *There of course are probably domains > where this 3min might be a problem*. Then you might use a > reflect/interface based solution and create a type-safe wrapper. Or use > code-generation. > > 3min writing code, isn't a problem for me. > > There's also a subtle problem here, I consider > "insert,remove,contain,union,difference,intersection,complement,superset,subset" > > API somewhat unclear... it loses domain knowledge and may provide more > functions than strictyl necessary... this of course it depends on the > context. > > Also, where will this set be used? Set data-structures have a ton of > different trade-offs. I really don't know how to write a really good > general purpose Set. (see > https://github.com/golang/go/wiki/HowToAsk#the-story-of-a-bad-question) > > I've seen you provide solutions in the past, so I would like to see your >> solution to this not-much-of-a-problem. >> > >> >>> >>> The issue I was trying to highlight was that you are proposing solutions >>> to a problem, but other people don't know what your exact problem is. Hence >>> my 3 lines version are equivalent in their result and value, because the >>> problem is missing. >>> >>> Similarly, when we don't have a concrete problem we could over-engineer >>> the generics or alternatively solve the wrong problems. >>> >>> For example, when the solution you propose only solves 5% of the >>> problems that generics needs to solve... or vice-versa... a generics >>> solution 100x simpler would solve 99% of the cases... then what is the >>> value of the proposed solution? >>> >>> So, which of the 147 different generics approaches/implementations works >>> better for Go and why? (I'm also counting the ones that aren't known yet :D) >>> >>> When you would use a real-world example and problem, it would be >>> possible to argue that one approach is better than the other... without >>> one, this discussion doesn't lead to anywhere. >>> >>> + Egon >>> >>> On Sunday, 4 June 2017 19:09:17 UTC+3, mhh...@gmail.com wrote: >>>> >>>> given the fact that actually everybody disagrees on that idea, >>>> or even something similar according to some feedback. >>>> >>>> I want to put the question differently. >>>> >>>> My mean is to say that golang is a basis to build upon in general that >>>> is better >>>> than other existing solutions. >>>> >>>> imho, golang is governed by its compatibility requirement, >>>> and, an extremely vertical approach, >>>> which blocks every possible update to the dogma: >>>> is it go 1.0 compatible ? >>>> >>>> And because its vertical, is it to my taste ? >>>> >>>> The go 1.0 compatibility requirement makes everybody very happy. >>>> >>>> Still, I dont believe the language is considered as finalized by a >>>> majority of users. >>>> Some will say it misses generics, some other (..) will try different >>>> approach. >>>> >>>> Why should it be that much of frictions ? >>>> >>>> Why can t we evaluate a solution where multiple vision co exists ? >>>> Handle the change. >>>> >>>> Aint there existing case of such kind of symbiosis which benefits each >>>> other on the long term ? >>>> >>>> A solution where the go 1.0 requirement is kept valuable, >>>> and a new language target where this requirement has been removed. >>>> A transpiler to go 1.0 compatible code ? >>>> So both can exist ? >>>> >>>> my 2 cents, >>>> that close and negative answer i got, >>>> is not helpful nor inclusive, >>>> its like take or leave attitude, >>>> >>>> it d just be more inclusive to say that >>>> it is ok to make a transpiler/or whatever it should be/ implementing >>>> your idea, >>>> check that resource for further implementation come back here for >>>> questions. >>>> >>>> Other consideration, >>>> the idea that golang 1.0 is used to build a different language target >>>> that compiles back to go1.0, >>>> looks cool. >>>> >>>> On Saturday, June 3, 2017 at 6:24:31 PM UTC+2, mhh...@gmail.com wrote: >>>>> >>>>> for the fun, with early return, >>>>> >>>>> https://play.golang.org/p/I9AORKOYQm >>>>> >>>>> On Saturday, June 3, 2017 at 12:34:15 PM UTC+2, mhh...@gmail.com >>>>> wrote: >>>>>> >>>>>> > Generics enable more than just replacing loops. For example, they >>>>>> can enable libraries of generic algorithms to be used with any type of >>>>>> array. Here's an example: >>>>>> >>>>>> in my demonstration every type got this kind of method, >>>>>> the problem become how do you jump from Type A to type B. >>>>>> in []A to []B or A -> B >>>>>> >>>>>> indeed it works on the item level, no more on the collections. >>>>>> >>>>>> This question is solved in two ways, >>>>>> - interface definitions (not interface value) >>>>>> - static conversion, which always resumes to >>>>>> func(in-type) out-type >>>>>> >>>>>> and some alternatives for convenience (producer/consumer) >>>>>> func (func(in-type) out-type >>>>>> func (in-type) func() out-type >>>>>> func (func(in-type) func() out-type >>>>>> // this is unfinished explanation it should include error management >>>>>> to be handled more completely. see please previous conv() fn introduced >>>>>> earlier to statically re decorate a func signature. >>>>>> >>>>>> So far the sum/reduce things operation, >>>>>> i left them as exercise to the stream declarer >>>>>> and did not consider them as core. >>>>>> Take become => filter (func(10 elements)) >>>>>> Map is map >>>>>> Sort is All(fn sorter) []out >>>>>> Reduce is a map operation, preceded by a conv if it reduces to a >>>>>> different type. >>>>>> >>>>>> >>>>>> On Friday, June 2, 2017 at 2:59:41 PM UTC+2, >>>>>> gary.wi...@victoriaplumb.com wrote: >>>>>>> >>>>>>> Generics enable more than just replacing loops. For example, they >>>>>>> can enable libraries of generic algorithms to be used with any type of >>>>>>> array. Here's an example: >>>>>>> >>>>>>> foo := GetArray() >>>>>>> result := foo.Take(10).map(...).Sort(...).Reduce(...) >>>>>>> >>>>>>> That is simple to understand and in one line of code. Imagine the >>>>>>> acrobatics (and lines of code) needed to do this using Go's loops! >>>>>>> >>>>>>> You can read my full article on why Go needs generics here: >>>>>>> http://nomad.so/2015/03/why-gos-design-is-a-disservice-to-intelligent-programmers/ >>>>>>> >>>>>>> On Friday, 2 June 2017 09:17:54 UTC+1, Florin Pățan wrote: >>>>>>>> >>>>>>>> Since everyone thinks it but nobody bothers to reply to it: this >>>>>>>> whole thing you propose can be currently done with a for loop, which >>>>>>>> not >>>>>>>> only is explicit about what it doing, but it also lets you control if >>>>>>>> you >>>>>>>> want to exit early from it and so on. Complicating the whole language >>>>>>>> because something is cool (yet looks like a really complex thing that >>>>>>>> you >>>>>>>> need to think about while reading the code) is in no one's benefit. >>>>>>>> Stop >>>>>>>> trying to avoid a couple of extra rows of for {} (where the third row >>>>>>>> is >>>>>>>> literally just an "}") and start embracing the fact that you can >>>>>>>> understand the code by looking at it and not apply any complex mental >>>>>>>> acrobatics to figure out what those three lines of code are doing. >>>>>>>> Your >>>>>>>> future self/person after you will thank you for that. >>>>>>> >>>>>>>
-- 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.