Fix transposed ranges
Steven Schveighoffer
schveiguy at yahoo.com
Mon Apr 2 19:45:31 UTC 2018
On 4/2/18 3:24 PM, Cym13 wrote:
> On Monday, 2 April 2018 at 18:33:25 UTC, Steven Schveighoffer wrote:
>> On 3/30/18 4:45 PM, Cym13 wrote:
>>> On Friday, 30 March 2018 at 20:43:09 UTC, Cym13 wrote:
>>>> Hi, I've got the following code that takes a list of files as
>>>> argument and xor them together (demo example sufficient for that
>>>> discussion).
>>>>
>>>> [...]
>>>
>>> Forgot to mention but I'm also quite annoyed at the need for that
>>> ".array" because "transposed" requires the RoR to be assignable. That
>>> kills the laziness. I'm very much open to suggestions regarding that
>>> point.
>>
>> 1. The .save deprecation may not affect you. It's probably being used
>> by map or fold but may not need to be. Once it's removed, you may just
>> see the warning go away, and everything still works just fine. I'm not
>> 100% sure on this, as I don't know where it's being used.
>
> That's good to hear, although I don't realy like warnings on which I
> have no control.
Well, it's tough, because you can compose ranges in infinite ways. All
you need to generate the warning is some code like this:
static if(is(typeof(r.save)) r.save;
And now, even if you're not supposed to use it, it gets used. But if
there is a fallback implementation when save *isn't* available, then it
will still work when the deprecation becomes an error.
Caveat here is that I don't know if this is a case in your example. But
if it is working how you expect (and I believe it does), then it should
continue to work. If not, file an issue when that happens.
>> 2. The array is necessary, as map is lazy. what you want is a range of
>> the first byte of each file, then a range of the second byte of each
>> file, etc. mapping to a byte array can't possibly do this, because
>> what would happen is that map would re-open the file, re-read it's
>> contents, and then give you the *second* byte. This is horribly
>> inefficient.
>
> While I agree that using an array is ugly, and that I want ranges of
> first byte (which is why I'm using transposed in the first place),
> transposed just doesn't let me work with the result of map itself. I
> suppose it's because its signature stipulates hasAssignableElements. I
> feel like I'm missing something there but I can't see what.
Let's simplify it into an array of arrays:
int[][] x = [[1,2,3],[4,5,6],[7,8,9]];
In order to progress the transposed wrapper, you need to "popFront" each
element in the array. Which means you need to traverse the array,
getting each element, getting the front of *that* element, and then
popping it off and assigning it back. In other words, after one
popFront, it should look like this:
[[2,3],[5,6],[8,9]]
If you can't assign the range back to itself, then it can't be made to
progress -- you would simply just get the first front over and over again.
The fact that you have to reassign the elements belies why save can
never be made to work -- you have to overwrite the original!
-Steve
More information about the Digitalmars-d-learn
mailing list