String interpolation, after a healthy debate on discord

WebFreak001 d.forum at webfreak.org
Tue Dec 14 15:58:21 UTC 2021


On Tuesday, 14 December 2021 at 14:01:56 UTC, rikki cattermole 
wrote:
>
> On 10/12/2021 10:06 AM, WebFreak001 wrote:
>> What do you think? Would this be essential for interpolated 
>> string adoption in user code or be useless?
>
> I am against it.
>
> Due to it marrying a memory management+formatting strategy to 
> the language.
>
> One way to do this is to support ``Identifier Token`` UFCS 
> pattern which would allow this to "just work" except 
> generically.

what do you mean with this? Memory management isn't part of the 
language or the proposal here (you need to use std.conv : `text`) 
and the syntax you propose here is the exact syntax proposed in 
the post. I don't quite get where you disagree or why you are 
against it from this paragraph at least.

> So if you want to get data from your database?
>
>     auto data = dbcon.sql`SELECT * FROM table where field = 
> "%value$arg"`;
>
> That could pass it in as an interpolated string.
>
> However, that could be extremely confusing to the user as this 
> is a function call, which takes a string... yet its actually 
> something very different. Like why doesn't adding the brackets 
> allow for that to work? ext. ext.

this is the same as JS template literal syntax - it's another way 
of calling a function. Given how different it looks from regular 
function calls, I don't think you would be very confused. The 
compiler would also tell you that you are trying to pass a string 
to a function that checks for an istring.

Just like currently `a.ufcsFun(b)` works but `&a.ufcsFun` to take 
its address doesn't, even though `a.memberFun(b)` works and 
`&a.memberFun` takes its address - I don't think anyone is 
confused about it, or at least it's easy to learn why the UFCS 
one doesn't work, just as it will with this proposal.

> One reason I would like this pattern even though I don't think 
> we should ever have it is so that I can have hex strings back. 
> Super useful during code generation and table generation for 
> large data sets (now days I've found that std.base64 does an 
> excellent job at this, even with a little bit of fluff).
>
> ubyte[] data = hex"AABBCC"; // ok

I was thinking about this as well - it would work but would run 
at runtime. I'm not a fan of using it just for static data and 
think `hexString!"..."` is better for that.


More information about the Digitalmars-d mailing list