static void tok_listComprehensions(L tok) { if (!tok.contains("[")) ret; for (int i = 1; i < l(tok); i += 2) { continue unless eq(tok.get(i), "["); int iOp = indexOfAny(tok, i+2, ":", "in", "[", "]"); if (iOp < 0) ret; if (!eqOneOf(tok.get(iOp), ":", "in")) continue; // not a list comprehension Map bracketMap = getBracketMap(tok); // XXX - optimize S type = joinSubList(tok, i+2, iOp-3), id = tok.get(iOp-2); int j = scanOverExpression(tok, bracketMap, iOp+2, "|"); S exp = join(tok.subList(iOp+2, j)); j += 2; int k = scanOverExpression(tok, bracketMap, j, "]"); S where = join(tok.subList(j, k)); ++k; S code = "filter(" + exp + ", func(" + type + " " + id + ") -> Bool { " + where + " })"; replaceTokens(tok, i, k, code); reTok(tok, i, k); } }