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