DIP 1027---String Interpolation---Community Review Round 1
H. S. Teoh
hsteoh at quickfur.ath.cx
Wed Dec 11 22:37:33 UTC 2019
On Wed, Dec 11, 2019 at 03:38:49PM -0500, Steven Schveighoffer via Digitalmars-d wrote:
[...]
> But there are a couple problems.
>
> This is very much focused on writef and printf. What about other
> functions that accept similar string + arg tuple, but don't use %s
> specifiers? Perfect example is SQL:
>
> query("select * from sometable where date < ?", someDate);
>
> With the interpolation string:
>
> query(i"select * from sometable where date < %someDate");
>
> This translates to:
>
> query("select * from sometable where date < %s", someDate);
>
> which is not correct SQL syntax.
[...]
Here's a potential 2-step fix:
1) Change the interpretation of `%({X}varname)` to mean "use `X` instead
of %s as placeholder in output string", rather than "use `%X` ...".
I.e.:
i"%abc" == tuple("%s", abc);
i"%({%x}abc)" == tuple("%x", abc);
i"%({?}abc)" == tuple("?", abc); // bingo, SQL syntax!
2) Then, in light of the %%%% problem, and to fix the repeated % in
"%{%x}abc", change the default metacharacter to something like $:
i"$abc" == tuple("%s", abc);
i"$({%d}abc)" == tuple("%d", abc);
i"$({?}abc)" == tuple("?", abc);
For convenient interop with printf/writefln, we can still default to
"%s" as the default placeholder, but the {} syntax now no longer assumes
printf syntax, making i"" literals MUCH more useful in many more places
outside the purvey of printf/writefln.
So you'd do SQL strings like this:
string name;
int serial;
float cost;
db.exec(i"INSERT INTO mytable VALUES (${?}name, ${?}serial, ${?}cost)");
which translates the last line to:
db.exec("INSERT INTO mytable VALUES (?, ?, ?)", name, serial, cost);
without the need for any intermediate format string parser.
T
--
VI = Visual Irritation
More information about the Digitalmars-d
mailing list