The simplest design I can think of (that does what you seem to want) is to add parameterized packages. Here's a stereotypical example:
======== package stack(T) // parameterized on stack element type import "fmt" type Type struct { rep []T func New() *Type { &T{} } func (stk *Type)Push(t T) { stk.rep = append(stk.rep, t) } func (stk *Type)Pop()(T, error) { var t T ln := len(stk.rep) if ln = 0 { return t, fmt.Errorf("Empty stack") } t = stk.rep[ln-1] stk.rep = st.rep[:ln-2] return t, nil } ======== package foo import intstack "stack"(int) // stack of ints import intstackstack "stack"(intstack.Type) // stack of stack of ints var istk intstack.Type var istkstk intstackstack.Type ... istk.Push(5) x, err := istk.Pop() istkstk.Push(istk) ========= Note that - This adds only two syntax rules. 1. In the package header, its name can be followed by a parenthesized list of names. 2. A package import must provide a complete list of types, which are concrete or its own parameter types. And such instantiated package must be given a local name. - *All* we are doing is saving some typing. - Given this, this feature can be expanded out via a preprocessor. - Given this, no new semantics need be defined! - Only one instance of a given type of package need be generated and compiled. - The intstackstack example is to show composability. - This actually makes interface types more useful than now. The last point is worth elaborating on. Currently the "io" package defines a bunch of interface types such as Reader, Writer and so on. These interface types allow you to use objects of a variety of other types so as as they implement relevant functions. But "io" interface types are primarily for byte slices. If "io" was defined as a parameterized package, one can have similar choices for other slice types. Currently to provide similar set of useful interface types for other slice types you would have to replicate a whole bunch of packages. Avoiding duplication of code should not be taken lightly. Copies can diverge, bug fixes or peroformance improvements may not be made consistently across all copies, newer copies may not have as much testing, and as different copies may have different bugs (and written by different people) each has to be independently and thoroughly reviewed etc. Go may not impress lanuage designers but it is a practical language. IMHO the above has a similar feel for "generics" -- it is simple, very easy to teach, it is not turing complete or anything fancy but takes care of most of the common use cases. I had looked at previous formal proposals but none seemed as simple as this. Bakul On Sat, 25 Mar 2017 20:57:51 EDT David Collier-Brown <davecb...@gmail.com> wrote: > Hmmn, we may be thinking different things... I *think* I'm looking for a > way to say "an X of Y", and see composition as a possible approach. > I just don't know if it will be a, the, or not the answer (;-)) > > --dave > > > On 24/03/17 11:21 PM, Michael Jones wrote: > > I think I was saying that what I seem to want personally is the "simple, > > weak, slight" thing that you likely see as failure. > > > > The opposite end of that--where everything is a list and can be composed > > without special regard (lisp) or everything is an object that can > > receive any message (smalltalk) are comfortable for me, but just not > > what I find myself wanting very often. > > > > My own view is not important in the sense that a broad survey would be, > > but since it seems much less than what people seem to dream of, I wanted > > to share that maybe people could be happy with less than they seek. > > > > Or maybe that ultimate typeless generality is what others really need > > somehow. I would not know. > > > > On Fri, Mar 24, 2017 at 6:13 PM David Collier-Brown <davecb...@gmail.com > > <mailto:davecb...@gmail.com>> wrote: > > > > We still don't understand genrality: the current generics are > > unimpressive. The proposals for Go are typically "let's do something > > that has failed already, in hopes that trying it agin will have a > > different result". That, alas, is one of the definitions of insanity. > > > > Due caution is advised! -- 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.