My experience making an on-disk merge sort using ranges

bearophile bearophileHUGS at lycos.com
Tue Feb 26 19:16:35 PST 2013


Chris Cain:

> import std.stdio, std.file, std.algorithm, std.conv;
>
> void main() {
> 	dirEntries("data", "*.out", SpanMode.shallow)
> 		.map!(e => File(e.name).byLine(KeepTerminator.yes)
> 			.map!(l => l.to!string())()
> 		)()
> 		.array()
> 		.nWayUnion()
> 		.copy(stdout.lockingTextWriter);
> }
>
> ---
>
> I was certainly surprised to find out that nWayUnion existed in 
> std.algorithm which essentially does the work for me. However, 
> I was more surprised to find out that this does not compile.


With the latest compiler this compiles to me:


import std.stdio, std.file, std.algorithm, std.conv, std.array;

void main() {
     dirEntries(".", "data*.txt", SpanMode.shallow)
     .map!(e => File(e.name).byLine(KeepTerminator.yes).map!text)
     .array
     .nWayUnion
     .copy(stdout.lockingTextWriter);
}



Then at runtime that array() gives me this:


object.Error: Access Violation
----------------
0x0041DC9F in void* gc.gcx.GC.mallocNoSync(uint, uint, uint*)
0x00363297
----------------


Bye,
bearophile


More information about the Digitalmars-d mailing list