Thread overview
Design by Introspection - Looking for examples
Jan 15, 2019
Tony A
Jan 15, 2019
Tony A
Jan 15, 2019
Tony A
January 15, 2019
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.
January 15, 2019
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.
January 15, 2019
On Tuesday, 15 January 2019 at 07:14:22 UTC, Petar Kirov [ZombineDev] wrote:
> Basically, look for `static if`s in Phobos. A couple of rich modules/packages:

Hi Petar

January 15, 2019
On Tuesday, 15 January 2019 at 07:14:22 UTC, Petar Kirov [ZombineDev] wrote:
> Basically, look for `static if`s in Phobos. A couple of rich modules/packages:
> ...

Hi Petar,

Thanks for the links, especially the checkint which was one example Andrei gave in the presentation.

Tony.