Software Guru Conference & Expo 2014

String Calculator en Ceylon

Ya otros miembros de la comunidad pusieron aquí su solución a la kata de String Calculator, en Groovy y Kawa y creo que hay otras también.

Aquí está mi solución en Ceylon:

Integer add(String numbers) {
    if (numbers.empty) {
        return 0;
    }
    {String*} parts;
    if (numbers.startsWith("//")) {
        doc "Para indicar delimitador propio, debe haber al menos dos lineas"
        assert(exists firstNewline = numbers.firstOccurrence("\n"));
        value delim = numbers[2..firstNewline-1];
        if (delim.startsWith("[") && delim.endsWith("]")) {
            value delims = StringBuilder();
            for (d in delim.split("[]")) {
                delims.append(d);
            }
            parts = numbers[firstNewline+1:numbers.size].split(delims.string);
        } else {
            parts = numbers[firstNewline+1:numbers.size].split(delim);
        }
    } else {
        parts = numbers.split(",\n");
    }
    value nums = { for (s in parts) if (exists i=parseInteger(s.trimmed)) i>1000 then 0 else i };
    if (nonempty n=nums.filter((Integer i) => i<0).sequence) {
        throw Exception("Negatives not allowed: ``n``");
    } else if (nonempty n=nums.sequence) {
        return sum(n);
    }
    return 0;
}

void run() {
    assert(add("")==0);
    assert(add("1")==1);
    assert(add("1,2")==3);
    assert(add("1
                2"
)==3);
    assert(add("//;
                1;2"
)==3);
    try {
        add("-1,2,-3,4");
        doc "Negative numbers shouldn't be allowed"
        assert(false);
    } catch (Exception e) {
        print(e.message);
    }
    assert(add("2,1001")==2);
    assert(add("2,1000")==1002);
    assert(add("//[AB][cd]
                1cd2AB3"
)==6);
    print("ok");
}

El módulo de lenguaje no incluye expresiones regulares, pero para los requerimientos de la kata realmente no se necesitan.