www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Design by Introspection - Looking for examples

reply Tony A <tonyaa outlook.com> writes:
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.
Jan 14
parent reply Petar Kirov [ZombineDev] <petar.p.kirov gmail.com> writes:
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.
Jan 14
next sibling parent Tony A <tonyaa outlook.com> writes:
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
Jan 15
prev sibling parent Tony A <tonyaa outlook.com> writes:
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.
Jan 15