On Wednesday, 7 September 2016 at 08:19:39 UTC, Russel Winder wrote:
On Tue, 2016-09-06 at 14:50 +0000, Lodovico Giaretta via Digitalmars-d- learn wrote:

[…]
 From a quick look, it looks like `results` is a `const(TickDuration[3])`, that is a fixed-length array. And fixed-length arrays aren't ranges. If you explicitly slice them, they become dynamic arrays, which are ranges.

So the solution is to call `map` with `results[]` instead of `results`.

So trying with results[] leads to:

run_checks.d(21): Error: mutable method std.algorithm.iteration.MapResult!(function (TickDuration t) => to(t).total(), const(TickDuration)[]).MapResult.opIndex is not callable using a const object run_checks.d(21): Error: mutable method std.algorithm.iteration.MapResult!(function (TickDuration t) => to(t).total(), const(TickDuration)[]).MapResult.opIndex is not callable using a const object run_checks.d(21): Error: mutable method std.algorithm.iteration.MapResult!(function (TickDuration t) => to(t).total(), const(TickDuration)[]).MapResult.opIndex is not callable using a const object

yes, the message is repeated three times, for unknown reason. Possibly because the compiler is fairly certain I am not going to believe it.

So the upshot of this is that I can't work with const data, which is dreadful in these days of single assignment being the way of doing things.

So what is the way of constructing a range from a const array? If it involves copying then D is doomed.

And yes I am under stress as I am trying to pitch D to Python people next week.

You have your const fixed-length array. You slice it and you obtain a const range to feed map. Now map will not return you an array. Because most of the time you don't need it. It will return you a range that lazily computes its elements on demand. No memory allocation at all. You can do a foreach on that range. If you need to access those elements more than once, instead of recomputing each of them every time it is accessed, you can store the results of the map. You simply have to use .array on the map result. This will allocate memory and give you an array with your results. Otherwise, no allocation at all. That result array can be const, if you want. If you need to access your elements only once, there's no need to have an array.

I really don't see what's not working in this.

And by the way, there's no need to put const on everything. An optimizing compiler is often able to infer things, especially for stack allocated local variables.

Reply via email to