[OT] C# can do all the interpolated strings now

Steven Schveighoffer schveiguy at gmail.com
Wed Dec 8 22:10:32 UTC 2021


On 12/8/21 4:31 PM, kdevel wrote:
> Further down we must read this:
> 
> ```
> void main(string[] args) {
>      import std.stdio;
>      writeln(i"The program $(args[0]) received $(args.length - 1) 
> arguments.");
>      // Lowering: --->
>      // writeln(InterpolationHeader!("The program ", "args[0]", " 
> received ", "args.length - 1", " arguments.")(),
>      //     "The program ", args[0], " received ", args.length - 1, " 
> arguments.");
> 
>      auto s = sqlExec(i"INSERT INTO runs VALUES ($(args[0]), 
> $(args.length - 1))");
>      // Lowering: --->
>      // auto s = sqlExec(InterpolationHeader!("INSERT INTO runs 
> VALUES(", "args[0]", ", ", "args.length - 1", ")")(),
>      //    args[0], $(args.length - 1));
> }
> ```
> 
> How is the proper separation of code (query) and data achieved in this 
> case?

Because the `sqlExec` function figures it out based on the interpolation 
header. It can tell which parts were literal strings, and which parts 
were interpolation parameters. The interpolation parameters are replaced 
with "?", and then the parameters are passed as data (to avoid SQL 
injection as expected).

> 
> To me
> 
>     auto argsmaxidx = args.length - 1;
>     auto s = sqlExec("INSERT INTO runs VALUES (?, ?)", args [0], 
> argsmaxidx);
> 
> appears way more readable.

Both are readable, though I'd argue that for this particular example, 
the usage of `$(expr)` for syntax makes things complex to read (syntax 
highlighting should help). In our DIP we used ${expr}, which for SQL 
would be more readable, but might look worse for things like code mixins.

But there are plenty of examples where the string-blueprint form is less 
readable (the INSERT form where you specify fields first, and then 
parameters later is kind of a terrible syntax to begin with).

e.g. (from a real line of code in my codebase):

```d
conn.exec("UPDATE organization SET loc_lat = ?, loc_lon = ? WHERE id = 
?", loc_latitude, loc_longitude, id);

// compare to:
conn.exec(i"UPDATE organization SET loc_lat = $loc_latitude, loc_lon = 
$loc_longitude WHERE id = $id");
```

-Steve


More information about the Digitalmars-d mailing list