String interpolation

Márcio Martins via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue Nov 10 04:40:06 PST 2015


On Tuesday, 10 November 2015 at 11:29:32 UTC, TheFlyingFiddle 
wrote:
> On Tuesday, 10 November 2015 at 10:41:52 UTC, tired_eyes wrote:
>> On Tuesday, 10 November 2015 at 10:33:30 UTC, Tobias Pankrath 
>> wrote:
>> Ruby:
>> a = 1
>> b = 4
>> puts "The number #{a} is less than #{b}"
>>
>> PHP:
>> $a = 1;
>> $b = 4;
>> echo "The number $a is less than $b";
>>
>> D:
>> ???
>
> int a = 1, b = 4;
> writefln("The number %s is less than %s", a, b);
>
> You can't do it the ruby / perl / php way in D. It could be 
> possible if we had AST macros in the language but as it stands 
> now it's not possible to do that.
>
> the closest you could get is something like this:
>
> string s = aliasFormat!("The number $a is less than $b", a, b);
>
> or
>
> aliasWrite!("The number $a is less than $b", a, b);
>
> Not really recommended though as these would end up creating 
> lots of template bloat.!

You could perhaps do it with a mixin instead of AST macros:

int a = 10;
int b = 20;
writeln(mixin(interp!"The number #{a} is less than #{b}"));


One thing that would make this a lot more elegant would be the 
ability to instantiate mixins in templates. For example:

template interp(X) {
   alias interp = mixin(interpGenCode!X);
}

writeln(interp!"The number #{a} is less than #{b}");

Quite pleasant syntax this way :)
Not sure if it's feasible to do this on the language side.


More information about the Digitalmars-d-learn mailing list