07-Nov-2013 01:02, Timothee Cour пишет:
To those who don't see the use of this:

which code would you rather read & write? see pastebin:
http://dpaste.dzfl.pl/b9f65a39

Another advantage is that using an autoformatter won't mess up things
inside a r{..} literal.


Challenge accepted.
50 lines in current D2:

import std.algorithm, std.conv, std.array, std.uni, std.stdio;

auto embed(Vars...)(string tmpl)
{
    auto app = appender!string();
    alias Put = void delegate();
    Put[string] fns;
    foreach(i, v; Vars)
    {
        //strangely v.stringof is "v" - BUG/FEATURE ? :)
        //may do better then to!string
        fns[Vars[i].stringof] = (){ app.put(to!string(v)); };
    }

    auto slice = tmpl;
    while(!slice.empty)
    {
        auto anchor = find(slice, '@');
        app.put(slice[0..$-anchor.length]);
        if(anchor.empty)
            break;
        slice = find!(a => !isAlpha(a))(anchor[1..$]);
        auto name = anchor[1..$-slice.length];
        if(!slice.empty)
        {
            if(name in fns)
                fns[name]();
        }
    }
    return app.data;
}

void main(){
    int a = 2;
    float b = 3.14;
    string c = "hello";
    auto x = q{var=@a, second=@b, third=@c!}.embed!(a,b,c);
    writeln(x);
    int age = 45;
    string address = "Fleet st. 15";
    dstring fieldName = "my_field";
    auto y = q{
      "firstName": "@firstName",
      "age": @age,
      "address": {
        @fieldName: "@address",
      }
    }.embed!(age, fieldName, address);
    writeln(y);
}

Prints as expected:
var=2, second=3.14, third=hello!

      "firstName": "",
      "age": 45,
      "address": {
        my_field: "Fleet st. 15",
      }


Now isn't it already nice beyond proportions?

--
Dmitry Olshansky

Reply via email to