string interpolation fun
Jonathan Marler
johnnymarler at gmail.com
Thu Dec 13 16:36:01 UTC 2018
On Thursday, 13 December 2018 at 16:21:48 UTC, Jonathan Marler
wrote:
> On Thursday, 13 December 2018 at 16:01:52 UTC, Steven
> Schveighoffer wrote:
>> On 12/13/18 10:53 AM, Steven Schveighoffer wrote:
>>> void main()
>>> {
>>> import std.stdio;
>>> int x = 1;
>>> int y = 2;
>>> auto s = make!(S, i"x: $(y), y: $(x)"); // name the
>>> fields to assign
>>> auto s2 = make!(S, i":$(x), :$(y)"); // use symbol name
>>> as field name
>>> auto s3 = make!(S, i"x: $(6), y: $(7)"); // use literals
>>> to assign
>>> writeln(i"$(s), $(s2), $(s3)"); // runtime parameters
>>> }
>>>
>>>
>>
>> Also, this would be a lot less noisy if we didn't need the
>> parens after the $, but the PR doesn't support that (yet?).
>>
>> -Steve
>
> Very cool use case.
>
> Adding support for the `$foo` case (no parens) would be fairly
> trival, but requires making a decision of what type of grammar
> node/token to use. We could use the same mechanism that
> templates use, but that would mean that something like $foo.max
> would be $(foo).max instead of $(foo.max) which seems a bit
> unexpected. That would be a good thing include in the DIP, a
> list of the obvious tokens/grammar nodes we could use and their
> pros/cons.
I should add, the strategy I used in the PR was to establish the
"foundation" of interpolated strings and postpone any unnecessary
decisions so they didn't prevent the foundation from being
merged. The idea was to be able to merge the change so that it
could be experimented with without disturbing the rest of the
compiler. After it was merged and we could get some experience
with it and we could later decide what features to add later.
I was pleasantly surprised at how little the new feature affected
the compiler. I didn't even need a grammar change. I just
modified the lexer to detect the letter 'i' before string
literals and then in the parse stage lowered those string
literals to tuples. It only affected the existing compiler in 2
places, very low impact and encapsulated.
More information about the Digitalmars-d
mailing list