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

Adam D. Ruppe destructionator at gmail.com
Wed Sep 9 23:47:35 UTC 2020


On Wednesday, 9 September 2020 at 23:04:37 UTC, James Blachly 
wrote:
> Are there contemporary examples of other languages whose string 
> interpolation is as complex as this proposals? I am really only 
> most familiar with Javascript and Python, both of which use 
> automatic memory management and the *string is a string is a 
> string*.

Javascript is actually *very* similar to this dip, with the key 
difference that in D, we reuse existing normal function call 
syntax whereas Javascript invented a new magic function call 
syntax just for this feature.

See the "Tagged templates" section here: 
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals

Notice that they call it a "template literal" rather than an 
interpolated string since it is so much more than a string.

If you write

foo`${5}, ${23}`

in Javascript, it actually will rewrite that into a function call:

foo([ "", ", ", ", ", "" ], 5, 23);

I realize that's hard to read with all the quotes and commas... 
but it is essentially a dynamically-typed equivalent to what this 
DIP is talking about.

The first argument to foo is a string spec. In D, we represent it 
as a templated struct. Javascript instead represents that as an 
array of strings. But it is fundamentally the same idea: it gives 
the string pieces from around the placeholders and an entry 
representing the inserted item.

Then, the interpolated items are passed as separate arguments 
after the spec - just like we propose for D. The example on MDN 
for this uses JS' `...values` syntax to put it into an array, in 
D, we'd call that same thing `(Values...)(Values values)`, but 
again it is the same thing, just JS uses their dynamic typing 
whereas D uses a template.


Now, the obvious difference with Javascript is they have a 
default function. Above, I wrote foo`...`. Leave the foo part off 
and it uses the default function instead - which is identical to 
our proposed idup. JS can do this because they introduced a new 
function call syntax to the language. And they can do that 
because JS only has one kind of function call to begin with: 
obj.foo(x) (where obj is optional and will default to null).

D, by contrast, has several kinds of function calls: traditional 
foo(x), UFCS x.foo, and template foo!(x). Instead of inventing 
three new kinds of magic function call syntax, we just reuse what 
we already have. But, of course, that does have one small 
downside: there's no way to insert a default function like 
Javascript does without either more compiler magic or limiting it 
to just one case and forgetting about the others.

Instead we simply ask you to explicitly call the function you 
want in all cases. I doubt most users will even find this 
particular controversial after they try it in reality.


More information about the Digitalmars-d mailing list