The state of string interpolation

Jonathan Marler johnnymarler at gmail.com
Fri Dec 7 18:40:04 UTC 2018


On Friday, 7 December 2018 at 18:26:51 UTC, H. S. Teoh wrote:
> On Fri, Dec 07, 2018 at 05:11:35PM +0000, Atila Neves via 
> Digitalmars-d wrote: [...]
>> Every language change is a cost, and therefore should justify 
>> its inclusion.  I personally don't think that it is in this 
>> case just to make a niche use case slightly easier, and this 
>> coming from someone from that niche! From now on it's:
>> 
>> const code = mixin(interp!q{
>>     // stuff that I used to write with many %s and it was hard 
>> to match them
>> up
>> });
>
> One thing I like about format() that string interpolation 
> doesn't (easily) give, is the ability to specify additional 
> formatting parameters, e.g., %6.2f, or %04X. You'd have to 
> basically "uglify" string interpolation in much the same ways 
> in order to get equivalent functionality, e.g., (hypothetical 
> syntax) "Price is ${6.2:price}.".
>
> The one thing missing from format(), as you point out above, is 
> the lack of named arguments for long format strings.  This 
> could be fixed by extending format() with named placeholders, 
> so that you can do something like:
>
> 	// Hypothetical syntax
> 	format(q"CODETEMPLATE
> 		void %{funcName}s(%{funcParams}(%s, %)) {
> 			%{boilerPlate}s
> 			for (i; 0 .. %{numIter}d)
> 			{
> 				%{loopBody}s
> 			}
> 		}
> 	CODETEMPLATE", NamedArgs([
> 		"funcName", "myFunc",
> 		"funcParams", ["int x", "float y", "string z"],
> 		"boilerPlate", generateBoilerplate(),
> 		"loopBody", generateFuncBody(),
> 		"numIter", 255
> 	]));
>
> Basically, instead of sequential arguments (or 
> numerically-indexed arguments like $#1), format takes what 
> amounts to a polymorphic associative array from which it can 
> look up named arguments. This gets rid of the "too many %s I 
> can't figure out which argument is which" problem, plus it 
> makes your format string more readable and maintainable. It 
> allows the same argument to be referenced multiple times, and 
> arguments don't have to appear in the order they appear in the 
> format string (important for i18n uses).
>
> Note that NamedArgs can be dispensed with if the language 
> supported
> named arguments (like in Python, `myfunc(width = 123, height = 
> 234)`).
>
>
> T

Got that one covered:

import std.stdio;

auto formatHex(T)(T value)
{
     static struct Formatter
     {
         T value;
         void toString(scope void delegate(const(char)[]) sink)
         {
             import std.format : formattedWrite;
             writef("%x", value);
         }
     }
     return Formatter(value);
}

void main(string[] args)
{
     int a = 42;
     writeln("a is ", a);
     writeln("a is ", a.formatHex);
     /*
     writeln(i"a is $(a)");
     writeln(i"a is $(a.formatHex)");
     */
}



More information about the Digitalmars-d mailing list