On Sunday, 19 January 2014 at 06:57:37 UTC, CJS wrote:

Ah, I'd been wondering if there was something like this. But why does it need unitlist's address? (Assume & has the same meaning as in C and C++.)

Look at the docs for Appender. It can either provide its own storage, or use an existing one. In the latter case you feed it a pointer to your array and it uses that.



This one seems like it should be unitlist.filter!(x => x.any!(y => s==y)).array();


Oh. Duh. But what is the .array() at the end doing? Allocating a new array for the results of the filter, since it's basically just a lazily computed range rather than actual storage for the results?

Yes. But in this case you'd have to allocate anyways, to fill the units[s] array.

I'm just trying to match what the python code was doing. In that case the line

Ah, I see.


peers = dict((s, set(sum(units[s],[]))-set([s]))
             for s in squares)

was using sum to concatenate a bunch of lists together and then remove the element. But I miscounted the parentheses and didn't notice the '-' was after the concatenated lists were tured into a set. The following code appears to do what I want, but the string temporary and appender are a bit ugly. Any suggestions on getting rid of them?

        foreach(s; squares){
peers[s] = units[s].join().sort().uniq().filter!(a => a!=s).array();
        }

That's std.array.join() there. However, I notice that the output (the order of elements) differs from the one on that page you linked earlier.

Reply via email to