public syntax forEach {
case #{ forEach (?clauses:*) ?:statement }:
Fragment inits = #{ };
Fragment preds = #{ true };
Fragment nexts = #{ };
return #{ ?(loop(clauses, statement, inits, preds,
nexts)) };
private Fragment loop
(Fragment clauses, Fragment statement,
Fragment inits, Fragment preds, Fragment nexts) throws
MatchFailure {
syntaxSwitch (clauses) {
case #{ }:
return #{ ?inits while (?preds) { ?nexts ?statement }
};
case #{ ?:type ?:name in ?c:expression, ... }:
Fragment newInits = #{ ?inits Iterator i = ?c.iterator();
};
Fragment newPreds = #{ ?preds & i.hasNext() };
Fragment newNexts = #{ ?nexts ?name = (?type)i.next();
};
return #{ ?(loop(..., statement, newInits, newPreds,
newNexts)) };
}
}
}