proposal: a new string litteral to embed variables in a string

Daniel Davidson nospam at spam.com
Wed Nov 6 13:50:35 PST 2013


On Wednesday, 6 November 2013 at 21:37:14 UTC, Dmitry Olshansky 
wrote:
> 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?

That is cool, but it is not DRY. Interpolation is well 
established and clearly adds value - else why would almost every 
language provide it?

You should not have to pass (age, fieldName, address) into it - 
since it already has it in the string. That is the real 
challenge, get those variables and interpolate them. Maybe I am 
missing something, but the format approach advocated by you and 
dicebot means breaking up strings (ugly and potentially error 
prone) and/or repeating yourself.

Thanks
Dan


More information about the Digitalmars-d mailing list