Comment by pb82

6 years ago

You can accomplish something similar in C++: single argument constructors let you skip the parentheses but that single argument can be an initializer_list, for example 'Tag(std::initializer_list<Tag> children)'. Now create subclasses of Tag for actual tags and you end up with a DSL that looks just like the one in the article. There is of course a bit more to it, but it can be done.

Skip the parentheses? Do you mean like

    H1 x = "Topics";

Or is this an aspect of C++ I don't know about?

  • Yes exactly. And now if the constructor of your element, let's say a div, doesn't take a string but a std::initializer_list you can write it like this:

      auto doc = Div {
        H1("Topics")
      };

    • Those look like parentheses though. Also braces, but the Lua version has those too.

How would you do attributes?

  • You could use the builder pattern:

    Div { H1("Title") }.Attr("class", "footer")

    • Then you dont really end up with a DSL that looks just like the one in the article, though – this is noticeably less nice :)

      The best I could think off were designated initializers like:

          Div{{.class = "footer"}, B{"some text"}}
      

      But making tags, attributes and plain text work nearly as nicely as in the lua table example seems not super straightforward to me.