27Oct00
Procedural Macros for Java
Bachrach and Playford
Parallel iteration
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)) };
    }
  }
}