Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

too complicated gems/template-meta-programming #366

Closed
wilzbach opened this issue Jun 24, 2016 · 5 comments
Closed

too complicated gems/template-meta-programming #366

wilzbach opened this issue Jun 24, 2016 · 5 comments

Comments

@wilzbach
Copy link
Member

for a ruby/java guy this looks complicated :

(reported by @claudiug)

@wilzbach wilzbach changed the title on http://tour.dlang.io/tour/en/gems/template-meta-programming too complicated gems/template-meta-programming Jun 24, 2016
@stonemaster
Copy link
Collaborator

Yes this is a complex template but it will be difficult to really dive into details in form a tour gem. This gem is in my eyes more directed to people who already this technique from languages like e.g. C++. And for those interested there are far better (and longer articles) that explain this complicated topic in more detail.
Unfortunately I don't see anything how we could make things easier without writing a whole book on this topic. IMO it's still useful for C++ and or other advanced D-newbies..

@wilzbach
Copy link
Member Author

Yes this is a complex template but it will be difficult to really dive into details in form a tour gem

I think the main problem here is that the example is too complicated (it has 65 lines). We should try to get it to half of the size. At the moment I don't have concrete ideas though.

his gem is in my eyes more directed to people who already this technique from languages like e.g. C++. And for those interested there are far better (and longer articles) that explain this complicated topic in more detail.

I agree ;-)

@PetarKirov
Copy link
Member

Here's a simpler and more powerful version of the example:

import std.algorithm.searching : countUntil;
import std.meta : Repeat;

struct VecDef(T, names...)
{
    enum N = names.length;
    T[N] _elements;

    this (Repeat!(N, T) elems)
    {
        _elements = [elems];
    }

    ref inout(T) opDispatch(string field)() inout
    {
        enum size_t idx = [ names ].countUntil(field);
        return _elements[idx];
    }
}

unittest
{
    alias Size = VecDef!(uint, `width`, `height`);
    auto s = Size(2, 3);
    s.width++;
    s.height++;
    assert (s.width + s.height == 7);

    alias Color = VecDef!(ubyte, `r`, `g`, `b`, `a`);
    Color c = Color(15, 17, 19, 3);
    assert (c.r == 15);
    assert (c.g == 17);
    assert (c.b == 19);
    assert (c.a == 3);

    alias vec3f = VecDef!(float, `x`, `y`, `z`);
    auto speed = vec3f(0.25, 0.5, 0.125);
    assert (speed.x == 0.25);
    assert (speed.y == 0.5);
    assert (speed.z == 0.125);

}

But, btw this is not template metaprogramming, but typecons. std.meta + std.traits is what I would call pure metaprogramming

@PetarKirov
Copy link
Member

PetarKirov commented Jun 26, 2016

If you want to show is, I would suggest implementing a JSON <-> struct | struct[] | struct[key] serialization / deserialization. AFAIR, last time I did it, it was less than 60 lines. If you want, I can dig up my code.

If you want to show more general introspection, use DbI (e.g. implenting a range that offers all possible primitives depending on the input) or UDAs (e.g. defining a REST interface, or something along the lines of Robert's talk at DConf http://dconf.org/2016/talks/schadek.html)

@wilzbach
Copy link
Member Author

This issue was moved to dlang-tour/english#34

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants