Thread overview | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
|
October 08, 2014 Formatted output of range of tuples | ||||
---|---|---|---|---|
| ||||
Hello! Consider this code: +++ import std.stdio; import std.range; import std.algorithm; void printIndexedArray1(T, Range)(T[] source, Range indexes) { foreach(row; zip(indexes, source)) { foreach(col; row) { write(col, " "); } writeln; } } void printIndexedArray2(T, Range)(T[] source, Range indexes) { writef("%(%(%s %)\n%)", zip(indexes, source)); } void main() { uint[] data = [17, 30, 48, 140, 10, 01, 126, 138, 140, 3, 501]; printIndexedArray1(data, sequence!"n"); printIndexedArray2(data, sequence!"n"); } +++ Looks fairly straightforward. But, the second function causes compilation error: std.format.FormatException@C:\D\dmd2\windows\bin\..\..\src\phobos\std\format.d(2 585): Expected '%s' format specifier for type 'Tuple!(uint, uint)' Can you help me with that? |
October 08, 2014 Re: Formatted output of range of tuples | ||||
---|---|---|---|---|
| ||||
Posted in reply to antropod | antropod:
> Looks fairly straightforward. But, the second function causes compilation error:
>
> std.format.FormatException@C:\D\dmd2\windows\bin\..\..\src\phobos\std\format.d(2
> 585): Expected '%s' format specifier for type 'Tuple!(uint, uint)'
>
> Can you help me with that?
Currently the "%(%s%)" formatting doesn't support tuples as sequences of values.
For indexes now there is also "enumerate".
Bye,
bearophile
|
October 08, 2014 Re: Formatted output of range of tuples | ||||
---|---|---|---|---|
| ||||
Posted in reply to antropod | On Wednesday, 8 October 2014 at 21:21:47 UTC, antropod wrote:
> Hello!
>
> Consider this code:
>
> +++
> import std.stdio;
> import std.range;
> import std.algorithm;
>
> void printIndexedArray1(T, Range)(T[] source, Range indexes)
> {
> foreach(row; zip(indexes, source))
> {
> foreach(col; row) {
> write(col, " ");
> }
> writeln;
> }
> }
>
> void printIndexedArray2(T, Range)(T[] source, Range indexes)
> {
> writef("%(%(%s %)\n%)", zip(indexes, source));
> }
>
> void main()
> {
> uint[] data = [17, 30, 48, 140, 10, 01, 126, 138, 140, 3, 501];
> printIndexedArray1(data, sequence!"n");
> printIndexedArray2(data, sequence!"n");
>
> }
> +++
>
> Looks fairly straightforward. But, the second function causes compilation error:
>
> std.format.FormatException@C:\D\dmd2\windows\bin\..\..\src\phobos\std\format.d(2
> 585): Expected '%s' format specifier for type 'Tuple!(uint, uint)'
>
> Can you help me with that?
You can turn the tuples into ranges with `only`:
writef("%(%(%s %)\n%)", zip(indexes, source).map!(t =>
only(t.expand)));
|
October 08, 2014 Re: Formatted output of range of tuples | ||||
---|---|---|---|---|
| ||||
Posted in reply to anonymous | On 10/08/2014 02:34 PM, anonymous wrote: > You can turn the tuples into ranges with `only`: > > writef("%(%(%s %)\n%)", zip(indexes, source).map!(t => > only(t.expand))); I haven't measured the performance but there is also the following automatic expansion of tuple members as slice elements: ... zip(indexes, source).map!(t => [ t ])); Probably the same thing... Ali |
October 08, 2014 Re: Formatted output of range of tuples | ||||
---|---|---|---|---|
| ||||
Posted in reply to anonymous | On Wednesday, 8 October 2014 at 21:34:54 UTC, anonymous wrote:
>
> You can turn the tuples into ranges with `only`:
>
> writef("%(%(%s %)\n%)", zip(indexes, source).map!(t =>
> only(t.expand)));
That works for me, thanks.
By the way my compiler is DMD 2.066.0
|
October 08, 2014 Re: Formatted output of range of tuples | ||||
---|---|---|---|---|
| ||||
Posted in reply to anonymous | anonymous:
> You can turn the tuples into ranges with `only`:
>
> writef("%(%(%s %)\n%)", zip(indexes, source).map!(t => only(t.expand)));
This is a nice idea. Expand can probably be replaced by a []. I presume this works only if the types inside the tuple are the same.
Bye,
bearophile
|
October 13, 2014 Re: Formatted output of range of tuples | ||||
---|---|---|---|---|
| ||||
Posted in reply to bearophile | On 10/08/2014 02:31 PM, bearophile wrote: > For indexes now there is also "enumerate". > > Bye, > bearophile Thanks for the tip. std.range.enumerate makes a big difference: foreach (i, element; MyRange(42).enumerate) { // ... } versus sequence!"n" and zip: foreach (i, element; zip(sequence!"n", MyRange(42))) { // ... } Ali |
October 13, 2014 Re: Formatted output of range of tuples | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli | Ali Çehreli:
> foreach (i, element; MyRange(42).enumerate) {
> // ...
> }
>
> versus sequence!"n" and zip:
>
> foreach (i, element; zip(sequence!"n", MyRange(42))) {
> // ...
> }
But it's better to not use automatic unpacking of tuples. See issues 7361 and especially 9817.
Bye,
bearophile
|
October 13, 2014 Re: Formatted output of range of tuples | ||||
---|---|---|---|---|
| ||||
Posted in reply to bearophile | On Wednesday, 8 October 2014 at 23:28:34 UTC, bearophile wrote:
> anonymous:
>
>> You can turn the tuples into ranges with `only`:
>>
>> writef("%(%(%s %)\n%)", zip(indexes, source).map!(t => only(t.expand)));
>
> This is a nice idea. Expand can probably be replaced by a []. I presume this works only if the types inside the tuple are the same.
Expand creates "returns" a TypeTuple though, so it's arguably "free". "[]" allocates a dynamic array, so is costly.
On the flip side, "only" is *entirelly* by value, and carries all its arguments. If the tuple is big, then the range can become quite big.
|
October 13, 2014 Re: Formatted output of range of tuples | ||||
---|---|---|---|---|
| ||||
Posted in reply to monarch_dodra | On Monday, 13 October 2014 at 09:20:27 UTC, monarch_dodra wrote: > On Wednesday, 8 October 2014 at 23:28:34 UTC, bearophile wrote: >> anonymous: >> >>> You can turn the tuples into ranges with `only`: >>> >>> writef("%(%(%s %)\n%)", zip(indexes, source).map!(t => only(t.expand))); >> >> This is a nice idea. Expand can probably be replaced by a []. I presume this works only if the types inside the tuple are the same. > > Expand creates "returns" a TypeTuple though, so it's arguably "free". "[]" allocates a dynamic array, so is costly. > > On the flip side, "only" is *entirelly* by value, and carries all its arguments. If the tuple is big, then the range can become quite big. > you are right man. |
Copyright © 1999-2021 by the D Language Foundation