Feedback Thread: DIP 1036--Formatted String Tuple Literals--Community Review Round 1

Seb seb at wilzba.ch
Wed Sep 9 16:43:04 UTC 2020


On Wednesday, 9 September 2020 at 14:19:43 UTC, Paul Backus wrote:
> On Tuesday, 8 September 2020 at 10:59:58 UTC, Mike Parker wrote:
>> This is the feedback thread for the first round of Community 
>> Review of DIP 1036, "Formatted String Tuple Literals".
>
> Scott Meyers has a talk, available on youtube [1], in which he 
> argues that the single most important software design guideline 
> is that "interfaces should be easy to use correctly, and hard 
> to use incorrectly." Let's assume, for the sake of argument, 
> that we all agree with him. (If you do not agree, feel free to 
> disregard this comment.)
>
> What this DIP proposes is an interface that is both hard to use 
> correctly, and hard to use incorrectly. While the efforts taken 
> to prevent misuse are admirable, the burden they impose on 
> programmers who merely wish to use string interpolation 
> as-intended is unacceptably high. Personally, I've supported 
> adding string interpolation to D in the past, but I would not 
> use it if it were implemented as this DIP proposes.
>
> I could point to specific details of the proposal that I think 
> lead to undue complexity, but I don't think I need to. The fact 
> that the DIP authors feel the need to devote as many words to 
> "justifications" of their proposal's complexity as they do to 
> actually explaining it in the first place is evidence enough. 
> They are well aware of what they have written, and of its flaws.
>
> I think the reason the DIP authors have ended up with such a 
> flawed proposal is that they have tried too hard to reach a 
> compromise between mutually-incompatible visions of what string 
> interpolation ought to be. Some people want compatibility with 
> `printf`, and others want compatibility with `writeln`, so we 
> end up with a proposal that's compatible with neither. Some 
> people want implicit conversion to `string`, others want 
> implicit conversion to `const(char)*`, so we end up with 
> explicit conversion required for both. And so on, for each 
> point of contention raised in every previous discussion of 
> string interpolation in D.
>
> This approach is fundamentally flawed. It can lead to Good 
> Work, but never to Great Work [2], and Great Work is the 
> standard that I expect a language addition like this will be 
> held to. As such, I do not think any version of this proposal 
> has much chance of being accepted by the language maintainers. 
> I recommend that this DIP be withdrawn.

I second this. I like this DIP more than 1027, but I fully agree 
with Paul that in its current form this DIP does too many wrong 
compromises. Just to re-state my points:

1) I strongly believe that printf shouldn't make up most of the 
design considerations and DIPs space. This is about a D feature, 
not C. Trying to bridge both worlds will please none.

2) No C string magic: "spec will automatically convert to a 
compile-time NUL-terminated C string if spec.hasAllSpecs is 
true." is just a big NO.

3) `${%d}bananas` is an awful syntax compromise as it will be 
very unintuitive to newcomers as it's not clear what the variable 
is.
For example, `${bananas:2f}` would read much better. In general, 
I like the way Python handles the format specifiers:

https://www.python.org/dev/peps/pep-0498/#format-specifiers

4) Format specifiers need to be 100% customizable. The NodeJS 
community got this right and it lead to a few awesome libraries. 
One example that has been mentioned before is 
https://github.com/chalk/chalk

5) APIs will need to be written specifically to cater for 
_d_interpolated_strings if no implicit conversion is allowed 
anyhow, so the interpolated_string struct should always 
containing its arguments. This would allow for adding methods 
like `idup`, `toString` etc. directly inside the struct. I don't 
see the DIP explaining the advantage of doing rewrite magic to 
`writefln(<interpolationSpec>, apples, bananas, apples + 
bananas);` and this will only confuse people.
More importantly, it severely restricts the freedom for function 
designers as they can not accept two interpolated strings nor 
argument afters the interpolated string.
Note that this also removes most-of the problems with "wrong-use 
of functions".

6) "if a StringLiteral follows an InterpolatedString, it is 
appended to the InterpolatedString in the parsing pass (not the 
lexer pass)". Automatic string concatenation was deprecated for 
good reasons. This DIP does not provide a good motivation for 
this nor explains how all the risks learned from this are 
mitigated.

7) A main use-case for interpolated strings is D mixins. It 
doesn't address combineing it with token strings  to create D 
code, e.g. `qi{class D { auto $varName = 20; }`

8) A lot of people want `string k = i"foo $bar";` to work and the 
DIP should at least a very good explanation why the compiler 
shouldn't rewrite such assignments to `string k = i"foo 
$bar".idup;` as it's very clear what the user wants here and the 
@nogc argument applies to normal strings as well.
In fact, the overload resolution could be changed, s.t. 
d_to_string struct overloads have a higher priority, but the 
`string` overloads are still being considered. The compiler would 
need to implement this logic anyhow to issue the mentioned: "Did 
you mean to use .idup?" messages.

9) The DIP does not mention operator overloading, e.g.

string s = "foo";
...
s ~= i"foo $bar";

IMHO this is unambiguous and would reduce the need to call 
`.idup`.


More information about the Digitalmars-d mailing list