Thanks for the ideas, I've now reduced the size of the getWords() function (even allowing for moving the imports to the top of the file) to this:

WordSet getWords(string filename, int wordsize) {
    string bareWord(string line) {
        auto rx = ctRegex!(r"^([a-z]+)", "i");
        auto match = matchFirst(line, rx);
        return match.empty ? "" : match.hit.to!string;
    }
    WordSet words;
    slurp!string(filename, "%s")
        .map!(line => bareWord(line))
        .filter!(word => word.length == wordsize)
        .each!(word => words[word.toUpper] = 0);
    return words;
}

Is this as compact as it _reasonably_ can be?

Reply via email to