| |
| Posted by Petar Kirov [ZombineDev] in reply to Tony A | PermalinkReply |
|
Petar Kirov [ZombineDev]
Posted in reply to Tony A
| On Tuesday, 15 January 2019 at 00:42:37 UTC, Tony A wrote:
> Hi, I just watched the Andrei's talk about Design by Introspection and for what I see this is used in D.
>
> Could anyone point out some good Github examples that I can see this in action and the benefits?
>
> Thanks.
Basically, look for `static if`s in Phobos. A couple of rich modules/packages:
https://github.com/dlang/phobos/tree/master/std/algorithm
https://github.com/dlang/phobos/blob/master/std/range/package.d
https://github.com/dlang/phobos/blob/master/std/typecons.d
https://github.com/dlang/phobos/tree/master/std/experimental/allocator
https://github.com/dlang/phobos/blob/master/std/experimental/checkedint.d
In particular, (just from the top of my head) I think that `std.range.retro` is nice canonical example:
https://github.com/dlang/phobos/blob/23f600ac78591391f7009beb1367fb97bf65496c/std/range/package.d#L256
* The `retro` function takes a range argument and returns the elements of the range in reverse order. For example [1, 2, 3] would become [3, 2, 1].
* The main point of all range algorithms in `std.range` is that they're lazy, which means that when possible they will attempt to process elements one by one, instead of eagerly performing the whole algorithm at once. The way this is achieved is by wrapping the input in a struct that encapsulates the traversal and allows the caller to call the range primitives on the object returned by the range algorithm whenever they want.
* So almost all range functions return structs that have somewhat different capabilities. For example the range returned by `[1, 2, 3].map!(x => x * 2)` has random access (you can immediately access any element, without needing to evaluate `x => x * 2` for any previous element), while `someArray.filter!(x => x % 2) doesn't have random access as in general you don't know which elements of `someArray` satisfy the `x => x % 2` condition.
So the point of Design by Introspection in the `retro` example is that it allows to return a range that best matches the capabilities of the argument.
|