Small, but important, correction re #5: 5. Any contract could contain at most one 'union' or 'except' assertion *for each type parameter*.
Alan On Monday, September 17, 2018 at 11:07:26 AM UTC+1, alan...@gmail.com wrote: > > Jonathan, > > The problem with just 'OR'ing complex64 and complex128 together is that > the resulting contract wouldn't encompass any defined types with the same > underlying types. So 'mycomplex' wouldn't be included: > > type mycomplex complex64 > > However, I'm pleased you mentioned it as it's given me an idea. Maybe my > 'fuller' proposal was on the right lines after all, it just needed > simplifying :) > > Suppose (with the sole exception of Comparable) we get rid of the > built-ins altogether and instead add two new assertions to the four that > are already permitted within a contract body: > > union{...}(T) > except{...}(T) > > These would assert that a type parameter must represent a type within the > 'union' body but NOT represent a type within the 'except' body. The > following could go within the body: > > 1. Any non-generic type. > > 2. Any contract requiring exactly one type parameter (inferred to be T). > > Other rules would be: > > 3. There could be any number of constituent types/contracts with a minimum > of one. > > 4. Any type specified under #1 would be deemed to include any defined type > with the same underlying type (IMPORTANT POINT!). > > 5. Any contract could contain at most one 'union' or 'except' assertion. > > 6. 'union' and 'except' would only be keywords within this context. Other > uses would be unaffected and so the proposal would still be backwards > compatible with Go 1. > > Incidentally, I'm NOT suggesting that we should add union types to the > language itself; these constructs would only apply within a contract body. > > It would now be a simple matter to build up a standard contracts package > ("ct" say) which included those originally envisaged: Integer, Signed, > Unsigned, Float, Complex, Boolean, String, Real, Numeric, Ordered, Addable, > Bytes and Runes. For example: > > contract Signed(T) { > union{ int8, int16, int32, int64, int }(T) > } > > contract Unsigned(T) { > union{ uint8, uint16, uint32, uint64, uint, uintptr }(T) > } > > contract Float(T) { > union{ float32, float64 }(T) > } > > contract Complex(T) { > union{ complex64, complex128 }(T) > } > > contract Integer(T) { > union{ ct.Signed, ct.Unsigned }(T) > } > > contract Numeric(T) { > union{ ct.Integer, ct.Float, ct.Complex }(T) > } > > contract String(T) { > union{ string }(T) // includes any defined type based on string > } > > contract Bytes(T) { > union{ string, []byte }(T) // includes defined types based on string > or []byte > } > > The Add1K example could now by made to work properly with this contract > which disallows 8 bit integers: > > contract BiggerInts(T) { > ct.Integer(T) > except{ int8, uint8 }(T) > } > > Incidentally, any one who dislikes having to qualify stuff with "ct" could > get rid of it in the 'import' declaration as long as they were confident > they wouldn't reuse the names of the standard contracts in the current > source file: > > import . "ct" > > So what do you think of this idea? > > It's certainly more expressive than the simplified proposal as it stands > and (apart from stuff like a totally generic Min() function which would > require contract adaptors) I'm struggling to think of anything it couldn't > do that I'd want it to do. > > Alan > > On Sunday, September 16, 2018 at 11:22:35 PM UTC+1, Jonathan Amsterdam > wrote: >> >> >> >> On Friday, September 14, 2018 at 8:06:31 PM UTC-4, alanfo wrote: >>> >>> Thanks for your comments, Jonathan. >>> >>> I did in fact deal with all the cases you mention in my 'fuller' >>> proposal: >>> >>> https://gist.github.com/alanfo/5da5932c7b60fd130a928ebbace1f251 >>> >>> where I'd used a device to restrict the built-ins to just one following >>> criticism by Ian that an earlier proposal I'd made had too many of them (it >>> had 14). >>> >>> However, I decided instead to restrict the built-ins to a reasonable >>> number (6) in the simplified proposal which meant that many of them had to >>> go. >>> >> >> Your 'fuller' proposal says that you can "or" the builtins together. But >> if you have that, you can get rid of many of them. For instance, "complex" >> is just "complex64 or complex128". >> >>> >>> The example you mentioned was taken from the draft design paper and >>> didn't compile for int8 there either. >>> >> >> Sorry, I shouldn't have used the word "compile" because it's ambiguous. >> Neither your Add1K nor the draft design's can be instantiated for int8. >> However, the draft design Add1K is valid with respect to its contract. >> Yours isn't, because the contract admits int8 but the function doesn't. >> > -- 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.