sclass DeepZipTools { // define what a variable is swappable bool isVar(O o) { ret o instanceof S && isDollarVar(o/S) || o instanceof SymVar; } swappable MetaTransformer metaTransformer() { ret metaTransformer_transformableAndList(); } // and the usual transformation utils swappable Map deepZip(O a, O b) { ret newGazelle_deepZip1(a, b); } swappable O replaceVars(O o, Map map) { ret replaceVars_understandsTransformableAndList(o, map); //ret metaTransformer().transform() ... } O transform(IF1 f, O o) { ret metaTransformer().transform(f, o); } }