Thing parse(string* text) { if (text.accept "(") { Thing[] things; while (!text.accept ")") things ~= parse text; return new List things; } if (gotNum(text, &float f)) { return new Number f; } if (text.accept("\"")) { auto str = slice(text, "\""); return new String str; } if (text.accept("'")) { return new Escape (parse text); } auto t2 = *text #.strip(); char[auto~] token; while (t2.length && t2[0] != " " && t2[0] != ")" && t2[0] != "(" && t2[0] != "\r" && t2[0] != "\n") { token ~= t2[0]; t2 = t2[1..$]; } if (!token.length) error "Don't know what to do at $t2"; *text = t2; return new Token token[]; }