digitalmars.D.learn - String interpolation
- tired_eyes (12/12) Nov 10 2015 Hi,
- wobbles (7/19) Nov 10 2015 Whats clumsy about it?
- Tobias Pankrath (3/15) Nov 10 2015 std.string.format and std.format are the standard options. What
- tired_eyes (12/30) Nov 10 2015 Ruby:
- wobbles (4/21) Nov 10 2015 int a = 1;
- tcak (5/30) Nov 10 2015 D:
- TheFlyingFiddle (12/24) Nov 10 2015 int a = 1, b = 4;
- tired_eyes (4/30) Nov 10 2015 Thank everybody for the answers. I know about writefln, but I was
- =?UTF-8?B?TcOhcmNpbw==?= Martins (14/40) Nov 10 2015 You could perhaps do it with a mixin instead of AST macros:
- Andrea Fontana (4/7) Nov 10 2015 Yes. Here a (stupid!) proof of concept:
- mw (36/51) May 20 2020 $ cat i.d
- Paul Backus (3/4) May 20 2020 There's an implementation in the dub package "scriptlike":
- mw (9/13) May 20 2020 Thank you! very nice:
- Paul Backus (3/18) May 21 2020 Unfortunately, it's not possible. Without `mixin`, there's no way
- Adam D. Ruppe (6/7) May 21 2020 gimme a like on the proposal to add to the language!
- mw (3/10) May 21 2020 Liked.
- Adam D. Ruppe (6/7) May 21 2020 It is discussed more in the github document but basically the
- mw (5/20) May 21 2020 And for debug print, I like the output be:
Hi, The only example of string interpolation I've found so far is on Rosetta Code: void main() { import std.stdio, std.string; "Mary had a %s lamb.".format("little").writeln; "Mary had a %2$s %1$s lamb.".format("little", "white").writeln; } Is this a "proper" way of string interpolation in D? This looks a little clumsy. Are there any better approaches? Quick skimming through the docs didn't give anything.
Nov 10 2015
On Tuesday, 10 November 2015 at 10:21:32 UTC, tired_eyes wrote:Hi, The only example of string interpolation I've found so far is on Rosetta Code: void main() { import std.stdio, std.string; "Mary had a %s lamb.".format("little").writeln; "Mary had a %2$s %1$s lamb.".format("little", "white").writeln; } Is this a "proper" way of string interpolation in D? This looks a little clumsy. Are there any better approaches? Quick skimming through the docs didn't give anything.Whats clumsy about it? If it's the style (excessive use of UFCS), I'd have to agree with you. Could easily have been written as: format("Mary had a %s lamb", "little"); which I personally think is more readable...
Nov 10 2015
On Tuesday, 10 November 2015 at 10:21:32 UTC, tired_eyes wrote:Hi, The only example of string interpolation I've found so far is on Rosetta Code: void main() { import std.stdio, std.string; "Mary had a %s lamb.".format("little").writeln; "Mary had a %2$s %1$s lamb.".format("little", "white").writeln; } Is this a "proper" way of string interpolation in D? This looks a little clumsy. Are there any better approaches? Quick skimming through the docs didn't give anything.std.string.format and std.format are the standard options. What are you missing?
Nov 10 2015
On Tuesday, 10 November 2015 at 10:33:30 UTC, Tobias Pankrath wrote:On Tuesday, 10 November 2015 at 10:21:32 UTC, tired_eyes wrote:Ruby: a = 1 b = 4 PHP: $a = 1; $b = 4; echo "The number $a is less than $b"; D: ???Hi, The only example of string interpolation I've found so far is on Rosetta Code: void main() { import std.stdio, std.string; "Mary had a %s lamb.".format("little").writeln; "Mary had a %2$s %1$s lamb.".format("little", "white").writeln; } Is this a "proper" way of string interpolation in D? This looks a little clumsy. Are there any better approaches? Quick skimming through the docs didn't give anything.std.string.format and std.format are the standard options. What are you missing?
Nov 10 2015
On Tuesday, 10 November 2015 at 10:41:52 UTC, tired_eyes wrote:On Tuesday, 10 November 2015 at 10:33:30 UTC, Tobias Pankrath wrote:int a = 1; int b = 4; writefln("The number %s is less than %s", a, b);On Tuesday, 10 November 2015 at 10:21:32 UTC, tired_eyes wrote:Ruby: a = 1 b = 4 PHP: $a = 1; $b = 4; echo "The number $a is less than $b"; D: ???[...]std.string.format and std.format are the standard options. What are you missing?
Nov 10 2015
On Tuesday, 10 November 2015 at 11:22:56 UTC, wobbles wrote:On Tuesday, 10 November 2015 at 10:41:52 UTC, tired_eyes wrote:D: int a = 1; int b = 4; writeln("The number ", a, " is less than ", b);On Tuesday, 10 November 2015 at 10:33:30 UTC, Tobias Pankrath wrote:int a = 1; int b = 4; writefln("The number %s is less than %s", a, b);On Tuesday, 10 November 2015 at 10:21:32 UTC, tired_eyes wrote:Ruby: a = 1 b = 4 PHP: $a = 1; $b = 4; echo "The number $a is less than $b"; D: ???[...]std.string.format and std.format are the standard options. What are you missing?
Nov 10 2015
On Tuesday, 10 November 2015 at 10:41:52 UTC, tired_eyes wrote:On Tuesday, 10 November 2015 at 10:33:30 UTC, Tobias Pankrath wrote: Ruby: a = 1 b = 4 PHP: $a = 1; $b = 4; echo "The number $a is less than $b"; D: ???int a = 1, b = 4; writefln("The number %s is less than %s", a, b); You can't do it the ruby / perl / php way in D. It could be possible if we had AST macros in the language but as it stands now it's not possible to do that. the closest you could get is something like this: string s = aliasFormat!("The number $a is less than $b", a, b); or aliasWrite!("The number $a is less than $b", a, b); Not really recommended though as these would end up creating lots of template bloat.
Nov 10 2015
On Tuesday, 10 November 2015 at 11:29:32 UTC, TheFlyingFiddle wrote:On Tuesday, 10 November 2015 at 10:41:52 UTC, tired_eyes wrote:Thank everybody for the answers. I know about writefln, but I was hoping I just overlooked some simpler way.On Tuesday, 10 November 2015 at 10:33:30 UTC, Tobias Pankrath wrote: Ruby: a = 1 b = 4 PHP: $a = 1; $b = 4; echo "The number $a is less than $b"; D: ???int a = 1, b = 4; writefln("The number %s is less than %s", a, b); You can't do it the ruby / perl / php way in D. It could be possible if we had AST macros in the language but as it stands now it's not possible to do that. the closest you could get is something like this: string s = aliasFormat!("The number $a is less than $b", a, b); or aliasWrite!("The number $a is less than $b", a, b); Not really recommended though as these would end up creating lots of template bloat.
Nov 10 2015
On Tuesday, 10 November 2015 at 11:29:32 UTC, TheFlyingFiddle wrote:On Tuesday, 10 November 2015 at 10:41:52 UTC, tired_eyes wrote:You could perhaps do it with a mixin instead of AST macros: int a = 10; int b = 20; One thing that would make this a lot more elegant would be the ability to instantiate mixins in templates. For example: template interp(X) { alias interp = mixin(interpGenCode!X); } Quite pleasant syntax this way :) Not sure if it's feasible to do this on the language side.On Tuesday, 10 November 2015 at 10:33:30 UTC, Tobias Pankrath wrote: Ruby: a = 1 b = 4 PHP: $a = 1; $b = 4; echo "The number $a is less than $b"; D: ???int a = 1, b = 4; writefln("The number %s is less than %s", a, b); You can't do it the ruby / perl / php way in D. It could be possible if we had AST macros in the language but as it stands now it's not possible to do that. the closest you could get is something like this: string s = aliasFormat!("The number $a is less than $b", a, b); or aliasWrite!("The number $a is less than $b", a, b); Not really recommended though as these would end up creating lots of template bloat.!
Nov 10 2015
On Tuesday, 10 November 2015 at 12:40:07 UTC, Márcio Martins wrote:Quite pleasant syntax this way :) Not sure if it's feasible to do this on the language side.Yes. Here a (stupid!) proof of concept: http://dpaste.dzfl.pl/74b1a4e3c8c6
Nov 10 2015
On Tuesday, 10 November 2015 at 13:36:44 UTC, Andrea Fontana wrote:On Tuesday, 10 November 2015 at 12:40:07 UTC, Márcio Martins wrote:$ cat i.d --------------------------------------------------------------------- import std.stdio; template interp(X) { alias interp = mixin(interpGenCode!X); } void main() { int a = 10; int b = 20; } --------------------------------------------------------------------- $ dmd.exe i.d I'm wondering if this code has once worked? and seems dpaste.dzfl.pl no longer there. Can we do string interpolation in D now? Speaking of language evolution in the other thread, https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/tokens/interpolated string name = "Mark"; var date = DateTime.Now; Console.WriteLine($"Hello, {name}! Today is {date.DayOfWeek}, it's {date:HH:mm} now."); Python have it here: https://www.python.org/dev/peps/pep-0498/Quite pleasant syntax this way :) Not sure if it's feasible to do this on the language side.Yes. Here a (stupid!) proof of concept: http://dpaste.dzfl.pl/74b1a4e3c8c6'My name is Fred, my age next year is 51, my anniversary is Saturday, October 12, 1991.'import datetime name = 'Fred' age = 50 anniversary = datetime.date(1991, 10, 12) f'My name is {name}, my age next year is {age+1}, my anniversary is {anniversary:%A, %B %d, %Y}.'"He said his name is 'Fred'." How can we do it in D? or when will we have it :-)?f'He said his name is {name!r}.'
May 20 2020
On Wednesday, 20 May 2020 at 23:41:15 UTC, mw wrote:Can we do string interpolation in D now?There's an implementation in the dub package "scriptlike": https://code.dlang.org/packages/scriptlike#string-interpolation
May 20 2020
On Thursday, 21 May 2020 at 01:13:27 UTC, Paul Backus wrote:On Wednesday, 20 May 2020 at 23:41:15 UTC, mw wrote:Thank you! very nice: // Output: The number 21 doubled is 42! int num = 21; writeln( mixin(interp!"The number ${num} doubled is ${num * 2}!") ); Is there any way to make it shorter? e.g. writeln( s!"The number ${num} doubled is ${num * 2}!" ); i.e how to write this 's'?Can we do string interpolation in D now?There's an implementation in the dub package "scriptlike": https://code.dlang.org/packages/scriptlike#string-interpolation
May 20 2020
On Thursday, 21 May 2020 at 06:57:28 UTC, mw wrote:On Thursday, 21 May 2020 at 01:13:27 UTC, Paul Backus wrote:Unfortunately, it's not possible. Without `mixin`, there's no way to give the template access to local variables like `num`.On Wednesday, 20 May 2020 at 23:41:15 UTC, mw wrote:Thank you! very nice: // Output: The number 21 doubled is 42! int num = 21; writeln( mixin(interp!"The number ${num} doubled is ${num * 2}!") ); Is there any way to make it shorter? e.g. writeln( s!"The number ${num} doubled is ${num * 2}!" ); i.e how to write this 's'?Can we do string interpolation in D now?There's an implementation in the dub package "scriptlike": https://code.dlang.org/packages/scriptlike#string-interpolation
May 21 2020
On Thursday, 21 May 2020 at 06:57:28 UTC, mw wrote:i.e how to write this 's'?gimme a like on the proposal to add to the language! https://github.com/dlang/DIPs/pull/186 If accepted, that would let you write i"stuff here".idup to get an interpolated string.
May 21 2020
On Thursday, 21 May 2020 at 12:53:50 UTC, Adam D. Ruppe wrote:On Thursday, 21 May 2020 at 06:57:28 UTC, mw wrote:Liked. BTW, is the .idup must be there?i.e how to write this 's'?gimme a like on the proposal to add to the language! https://github.com/dlang/DIPs/pull/186 If accepted, that would let you write i"stuff here".idup to get an interpolated string.
May 21 2020
On Thursday, 21 May 2020 at 17:10:31 UTC, mw wrote:BTW, is the .idup must be there?It is discussed more in the github document but basically the proposed built-in syntax returns a generic builder thing which can make more than just strings. The idup specifically asks it to make a copy into a string as opposed to the other things it can provide too.
May 21 2020
On Thursday, 21 May 2020 at 17:17:49 UTC, Adam D. Ruppe wrote:On Thursday, 21 May 2020 at 17:10:31 UTC, mw wrote:I love the extensibility of this, but perhaps there should be something like `ii"foo".idup` that's syntactic sugar for `i"foo".idup`. New users might get confused by the need for appending idup, and then they'll think about how other languages don't necessitate this perceived superfluity when using their interpolated string.BTW, is the .idup must be there?It is discussed more in the github document but basically the proposed built-in syntax returns a generic builder thing which can make more than just strings. The idup specifically asks it to make a copy into a string as opposed to the other things it can provide too.
May 21 2020
On Thursday, 21 May 2020 at 18:12:01 UTC, ZK wrote:I love the extensibility of this, but perhaps there should be something like `ii"foo".idup` that's syntactic sugar for `i"foo".idup`. New users might get confused by the need for appending idup, and then they'll think about how other languages don't necessitate this perceived superfluity when using their interpolated string.Whoops! I meant to say `ii"foo"`, not `ii"foo".idup`.
May 21 2020
On Thursday, 21 May 2020 at 06:57:28 UTC, mw wrote:On Thursday, 21 May 2020 at 01:13:27 UTC, Paul Backus wrote:And for debug print, I like the output be: The number num=21 doubled is num * 2=42! i.e print out the string of the original expression, like the stringy operator in C’s macro #varOn Wednesday, 20 May 2020 at 23:41:15 UTC, mw wrote:Thank you! very nice: // Output: The number 21 doubled is 42! int num = 21; writeln( mixin(interp!"The number ${num} doubled is ${num * 2}!") ); Is there any way to make it shorter? e.g. writeln( s!"The number ${num} doubled is ${num * 2}!" ); i.e how to write this 's'?Can we do string interpolation in D now?There's an implementation in the dub package "scriptlike": https://code.dlang.org/packages/scriptlike#string-interpolation
May 21 2020