Re: Traits with Auxiliary Types
[Thread Prev] | [Thread Next]
- Subject: Re: Traits with Auxiliary Types
- From: Ori Bernstein <ori@xxxxxxxxxxxxxx>
- Date: Wed, 16 Dec 2015 00:28:42 -0800
- To: Ori Bernstein <ori@xxxxxxxxxxxxxx>
- Cc: myrddin-dev@xxxxxxxxxxxxxx
I should also note, I'm not currently a fan of the syntax. Toying with replacements, but for now it compiles and runs; The semantics are the important bit here. On Wed, 16 Dec 2015 00:24:08 -0800, Ori Bernstein <ori@xxxxxxxxxxxxxx> wrote: > Traits with auxiliary types have landed, allowing a trait to be keyed off of > one type, but parameterized off of multiple types. This is a step towards > allowing iterators to work with the builtin foreach loop. > > In general, the syntax is: > > trait foo @primary -> @list, @of, @secondary > > And the impl follows the same pattern. They are still used as > > @a::foo > > Proper documentation forthcoming. Another design, where all type parameters > were equal participants in the type, was considered, but it screws with > inference since there is no way to figure out which of the possible infinite > sea of return types is meant in cases like: > > for x in std.bychars(str) > > I may revisit this, though, if I can find a not-too-nasty solution to that > problem. For now, though, this is the sort of thing that has been enabled: > > use std > > trait iter @a -> @b = > next : (x : @a# -> std.option(@b)) > ;; > > impl iter byte[:] -> char = > next = {s > var c > > if s#.len == 0 > -> `std.None > else > (c, s#) = std.striter(s#) > -> `std.Some c > ;; > } > ;; > > impl iter int -> int= > next = {i > if i# > 100 > -> `std.None > else > -> `std.Some i#++ > ;; > } > ;; > > const main = { > var str = "foobar" > var int : int = 73 > > while true > match next(&str) > | `std.Some c: std.put("c={}\n", c) > | `std.None: break > ;; > ;; > > while true > match next(&int) > | `std.Some i: std.put("i={}\n", i) > | `std.None: break > ;; > ;; > } > > Adding the built in trait comes next. I'm debating on the signature, > but currently leaning towards: > > trait iterable @a -> @b = > next : (x : @a#, outret : @b# -> bool) > ;; > > since this removes a dependency on the standard library, without > requiring the user to come up with a bullshit value to return at the > end of iteration, in the way that the tuple option might. > > -- > Ori Bernstein > -- Ori Bernstein
Traits with Auxiliary Types | Ori Bernstein <ori@xxxxxxxxxxxxxx> |
- Prev by Date: Traits with Auxiliary Types
- Next by Date: Void is a value.
- Previous by thread: Traits with Auxiliary Types
- Next by thread: Void is a value.
- Index(es):