static void tok_listComprehensions(L tok) { if (!tok.contains("[")) ret; for (int i = 1; i < l(tok); i += 2) try { 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 if (eqGet(tok, iOp+2, ".")) continue; // "in." (in is a variable name) 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(subList(tok, iOp+2, j)); j += 2; int k = scanOverExpression(tok, bracketMap, j, "]"); S where = join(subList(tok, j, k)); ++k; S code = "filter(" + exp + ", func(" + type + " " + id + ") -> Bool { " + where + " })"; replaceTokens(tok, i, k, code); reTok(tok, i, k); } on fail { print("Was processing list comprehension: " + joinSubList(tok, i, i+30) + "..."); } }