Bolts 0.4 meta programming library

John Colvin john.loughran.colvin at gmail.com
Thu Aug 2 08:40:55 UTC 2018


On Thursday, 2 August 2018 at 07:47:19 UTC, aliak wrote:
> Hi, just a release of a meta programming library 
> (https://bolts.dub.pm) that has utilities that I use in 
> personal projects, and that I find in phobos, and or in the 
> forums. A notable difference is that functions here try to 
> operate on any compile time entities if they can be resolved.
>
> I.e.:
>
> int i;
> void g0(int) {}
> struct S { void g1(int) {} }
> alias g2 = (int a) => a;
> static assert(isFunctionOver!(g0, int));
> static assert(isFunctionOver!(S.g1, 3));
> static assert(isFunctionOver!(g2, i));
>
> And there's a "doth" super template that tries to contain most 
> things under what I feel is a nicer api ("is" was taken, so i 
> looked to Shakespearian gibberish :p) and also allows for 
> easier use with meta functions:
>
> E.g.:
>
> int *pi = null;
> static assert( doth!3.of!int);
> static assert(!doth!pi.nullable);
> static assert( doth!((a, b, c, d) => a).functionOver!(int, int, 
> int, int));
>
> int i;
> import std.meta: allSatisfy;
> static assert(allSatisfy!(doth!int.of, 3, 4, int, i));
>
> Here's an example of a gem adapted from inside the forms/phobos 
> sources as well:
>
> alias a = AliasPack!(1, 2, 3);
> alias b = AliasPack!(4, 5, 6);
> alias c = AliasPack!(7, 8, 9);
>
> alias d = staticZip!(a, b, c);
>
> static assert(d.length == 3);
>
> static assert(d.Unpack[0].equals!(1, 4, 7));
> static assert(d.Unpack[1].equals!(2, 5, 8));
> static assert(d.Unpack[2].equals!(3, 6, 9))
>
> static assert(AliasPack!(d.UnpackDeep).equals!(1, 4, 7, 2, 5, 
> 8, 3, 6, 9));
>
> Cheers,
> - Ali

This looks cool. Lots of things that lots of people have 
reimplemented lots of times over the years, but all in one place 
and documented.

2 points:

1) Are you aware of this: 
https://github.com/dlang/phobos/blob/master/std/meta.d ? I think 
if a bunch of good motivating examples are given, making this 
public would be possible. Then everyone would be using the same 
one and your library would truly just be utilities.


More information about the Digitalmars-d-announce mailing list