Discussion Thread: DIP 1036--String Interpolation Tuple Literals--Community Review Round 2

Max Haughton maxhaton at gmail.com
Sun Jan 31 15:59:15 UTC 2021


On Sunday, 31 January 2021 at 15:54:38 UTC, Andrei Alexandrescu 
wrote:
>> Try to please everybody and you end up pleasing nobody.
> ...
>> DIP1027 works with writef, and I consider that to be the goal, 
>> not printf.
>
> Unpopular opinion follows (at this point I have no idea which 
> side of the debate this puts me on).
>
> I think working with either writef or printf is a bit of a side 
> quest, and to the extent it affects the fundamental design it 
> becomes a nongoal.
>
> The printf family (which includes writef, too) has a 
> fundamental characteristic: the formatting specification are 
> SEPARATE from the data. You pass the formatting template, you 
> pass the data, and the function puts them together and produces 
> a string nice. This way of doing things has pluses and minuses 
> that are well known.
>
> Interpolated strings fundamentally do the converse: they MIX 
> the formatting specification with the data. You see bits of 
> literal strings mixed with pieces of data. That, too, has 
> pluses and minuses.
>
> From that vantage point, I look at the effort of supporting 
> {print,write}f in interpolated strings leading to any number of 
> contortions and come and ask: cui prodest? Indeed, cui the heck 
> prodest?
>
> The main client of string interpolation by A MILE, is code 
> generation. Whether it's D code, SQL, your own embedded 
> language - that's the ONE use case that any DIP proposing this 
> should drive with. Supporting (print|write)f is some weird 
> invention - I already have these functions that separate 
> formatting from data, why do I want to transform the converse 
> way of doing things into this?
>
> But wait! one might say in response. What if I need on occasion 
> some special formatting of one argument in one of them nice 
> interpolated strings? No problem, I say. Do what Perl, PHP, and 
> Python programmers have done for millenia - apply the 
> formatting function separately for the desired argument:
>
> i"Hello, ${format(`%45s`, var)} world"!
>
> That's how the cookie crumbles. To have to pay syntactically 
> and in complexity WHENEVER I EVER use an interpolated string on 
> the off chance that I might need special formatting for ONE 
> argument is unconscionable.
>
> Define interpolated strings to be simple, cheap, obvious, and 
> well fit for their MAIN USE CASE, which is code generation.

Isn't the specific formatting for a given argument mainly for 
things like floats in practice? We have good ways of doing this 
already, I think if any given proposal is merged it seems worth 
holding back and collecting experience before standardising 
anything other than calling format yourself (What alternatives do 
you have in mind? - the solution I see in python looks fairly 
arcane)

But I (intensely) agree that printf really doesn't matter here - 
even talking C, puts surely is the closest analogue.


More information about the Digitalmars-d mailing list