In case it's of interest, I've been playing around with an experiment about how Go generic code might be generated. In particular I wanted to see how it looked when code was shared between generic instances with types that share the same memory layout (with respect to internal pointers and alignment). I haven't written any of the front-end generation code, but I hand-generated this code trying to keep the correspondence with the original generic code as close as possible.
A working implementation of graph example from the draft proposal is here: https://github.com/rogpeppe/genericdemo/tree/master/graph The "source" code is in the *-generic.go files (guarded with a "+build ignore" qualifier), and the "generated" code is in the *-generated.go files. The basic idea is that every generic function and method gets a stub function which calls the underlying code, adding a pointer to an "instance" value which provides all the generic entry points needed by the function. Since we can't write Go identifiers like "ShortestPath(*Node, *Edge)", it uses numeric identifiers to identify type parameter tuples (e.g. ShortestPath__10). The typeids.go file holds the crib for the identifiers ( https://github.com/rogpeppe/genericdemo/blob/master/graph/typeids.go). It actually seems to work. :) On Thu, 1 Nov 2018 at 20:04, Jamie Clarkson <jnc7...@gmail.com> wrote: > > > On Thursday, November 1, 2018 at 6:19:58 PM UTC, Mandolyte wrote: >> >> Ah, I see. the albrow/fo package is the equivalent of just pasting the >> entire function into the contract. >> >> > Could you expand on this a little, I'm not sure I follow? Would it handle > the Graph contract? > > I agree, I had mixed feelings about contracts too at first. But I came to >> appreciate, in descending order: >> >> - It would be good documentation in godoc >> - It enables much better error messages (a problem with albrow/fo and >> is also stated in the proposal) >> - Robust enough to handle the "edge" cases (pun intended) >> >> I have seen some proposals that look interesting on operator overloading, >> but I could live without them. There are other ways to handle the cases >> where they would be nice to have. A good godoc goes a long way! >> >> > I'm still not totally convinced by the contracts in the draft but I think > with some tweaks they could be good. > > I agree on the operators, I really really don't want overloading which can > be abused and happily live without them but I reckon there will end up with > some form of restricted overloads. > > >> Cheers. >> >> On Thursday, November 1, 2018 at 10:04:08 AM UTC-4, Jamie Clarkson wrote: >>> >>> Thanks, that looks like a cool project - however I'd disagree that not >>> using contracts is relevant to the question. >>> >>> My interest was mainly in what would need to be implicitly generated by >>> the compiler in order to support contracts (such as the mutual recursive >>> types above), not specifically the generated code. In fact it would be >>> cool to see if the contract mechanism could be implemented on top of Fo >>> since that already provides the parametrics. >>> >>> The generated code is relevant too of course but it's fairly >>> mechanically obvious (ignoring tedious details :) ) how to translate basic >>> parametric polymorphism or basic adhoc. In the dictionaries approach above >>> this seems similar to how Haskell implements typeclasses but for implicitly >>> satisfied constraints (from the contract). >>> >>> Initially I didn't like the contracts proposal but the more I think of >>> it in the way of implicitly generating types (and esp. typeclass-like >>> constructs) the more I like it and the more it feels like Go where >>> interfaces are implicitly satisfied. >>> >>> Cheers, >>> >>> -- > 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.