// Path: src/chap7/ClosureEvaluator.java
// @Require(FuncEvaluator.class)
// @Reviser public class ClosureEvaluator {
//     @Reviser public static class FunEx extends Fun {
//         public FunEx(List<ASTree> c) { super(c); }
//         public Object eval(Environment env) {
//             return new Function(parameters(), body(), env);
//         }
//     }
// }
// 
// Path: src/chap8/NativeEvaluator.java
// @Require(FuncEvaluator.class)
// @Reviser public class NativeEvaluator {
//     @Reviser public static class NativeArgEx extends FuncEvaluator.ArgumentsEx {
//         public NativeArgEx(List<ASTree> c) { super(c); }
//         @Override public Object eval(Environment callerEnv, Object value) {
//             if (!(value instanceof NativeFunction))
//                 return super.eval(callerEnv, value);
// 
//             NativeFunction func = (NativeFunction)value;
//             int nparams = func.numOfParameters();
//             if (size() != nparams)
//                 throw new StoneException("bad number of arguments", this);
//             Object[] args = new Object[nparams];
//             int num = 0;
//             for (ASTree a: this) {
//                 ASTreeEx ae = (ASTreeEx)a;
//                 args[num++] = ae.eval(callerEnv);
//             }
//             return func.invoke(args, this);
//         }
//     }
// }
// 
// Path: src/chap9/ClassEvaluator.java
// @Require(FuncEvaluator.class)
// @Reviser public class ClassEvaluator {
//     @Reviser public static class ClassStmntEx extends ClassStmnt {
//         public ClassStmntEx(List<ASTree> c) { super(c); }
//         public Object eval(Environment env) {
//             ClassInfo ci = new ClassInfo(this, env);
//             ((EnvEx)env).put(name(), ci);
//             return name();
//         }
//     }
//     @Reviser public static class ClassBodyEx extends ClassBody {
//         public ClassBodyEx(List<ASTree> c) { super(c); }
//         public Object eval(Environment env) {
//             for (ASTree t: this)
//                 ((ASTreeEx)t).eval(env);
//             return null;
//         }
//     }
//     @Reviser public static class DotEx extends Dot {
//         public DotEx(List<ASTree> c) { super(c); }
//         public Object eval(Environment env, Object value) {
//             String member = name();
//             if (value instanceof ClassInfo) {
//                 if ("new".equals(member)) {
//                     ClassInfo ci = (ClassInfo)value;
//                     NestedEnv e = new NestedEnv(ci.environment());
//                     StoneObject so = new StoneObject(e);
//                     e.putNew("this", so);
//                     initObject(ci, e);
//                     return so;
//                 }
//             }
//             else if (value instanceof StoneObject) {
//                 try {
//                     return ((StoneObject)value).read(member);
//                 } catch (AccessException e) {}
//             }
//             throw new StoneException("bad member access: " + member, this);
//         }
//         protected void initObject(ClassInfo ci, Environment env) {
//             if (ci.superClass() != null)
//                 initObject(ci.superClass(), env);
//             ((ClassBodyEx)ci.body()).eval(env);
//         }
//     }
//     @Reviser public static class AssignEx extends BasicEvaluator.BinaryEx {
//         public AssignEx(List<ASTree> c) { super(c); }
//         @Override
//         protected Object computeAssign(Environment env, Object rvalue) {
//             ASTree le = left();
//             if (le instanceof PrimaryExpr) {
//                 PrimaryEx p = (PrimaryEx)le;
//                 if (p.hasPostfix(0) && p.postfix(0) instanceof Dot) {
//                     Object t = ((PrimaryEx)le).evalSubExpr(env, 1);
//                     if (t instanceof StoneObject)
//                         return setField((StoneObject)t, (Dot)p.postfix(0),
//                                         rvalue);
//                 }
//             }
//             return super.computeAssign(env, rvalue);
//         }
//         protected Object setField(StoneObject obj, Dot expr, Object rvalue) {
//             String name = expr.name();
//             try {
//                 obj.write(name, rvalue);
//                 return rvalue;
//             } catch (AccessException e) {
//                 throw new StoneException("bad member access " + location()
//                                          + ": " + name);
//             }
//         }
//     }
// }
// 
// Path: src/chap9/ClassInterpreter.java
// public class ClassInterpreter extends BasicInterpreter {
//     public static void main(String[] args) throws ParseException {
//         run(new ClassParser(), new Natives().environment(new NestedEnv())); 
//     }
// }


import javassist.gluonj.util.Loader;
import chap7.ClosureEvaluator;
import chap8.NativeEvaluator;
import chap9.ClassEvaluator;
import chap9.ClassInterpreter;
package chap10;

public class ArrayRunner {
    public static void main(String[] args) throws Throwable {
        Loader.run(ClassInterpreter.class, args, ClassEvaluator.class,
// Path: src/chap7/ClosureEvaluator.java
// @Require(FuncEvaluator.class)
// @Reviser public class ClosureEvaluator {
//     @Reviser public static class FunEx extends Fun {
//         public FunEx(List<ASTree> c) { super(c); }
//         public Object eval(Environment env) {
//             return new Function(parameters(), body(), env);
//         }
//     }
// }
// 
// Path: src/chap8/NativeEvaluator.java
// @Require(FuncEvaluator.class)
// @Reviser public class NativeEvaluator {
//     @Reviser public static class NativeArgEx extends FuncEvaluator.ArgumentsEx {
//         public NativeArgEx(List<ASTree> c) { super(c); }
//         @Override public Object eval(Environment callerEnv, Object value) {
//             if (!(value instanceof NativeFunction))
//                 return super.eval(callerEnv, value);
// 
//             NativeFunction func = (NativeFunction)value;
//             int nparams = func.numOfParameters();
//             if (size() != nparams)
//                 throw new StoneException("bad number of arguments", this);
//             Object[] args = new Object[nparams];
//             int num = 0;
//             for (ASTree a: this) {
//                 ASTreeEx ae = (ASTreeEx)a;
//                 args[num++] = ae.eval(callerEnv);
//             }
//             return func.invoke(args, this);
//         }
//     }
// }
// 
// Path: src/chap9/ClassEvaluator.java
// @Require(FuncEvaluator.class)
// @Reviser public class ClassEvaluator {
//     @Reviser public static class ClassStmntEx extends ClassStmnt {
//         public ClassStmntEx(List<ASTree> c) { super(c); }
//         public Object eval(Environment env) {
//             ClassInfo ci = new ClassInfo(this, env);
//             ((EnvEx)env).put(name(), ci);
//             return name();
//         }
//     }
//     @Reviser public static class ClassBodyEx extends ClassBody {
//         public ClassBodyEx(List<ASTree> c) { super(c); }
//         public Object eval(Environment env) {
//             for (ASTree t: this)
//                 ((ASTreeEx)t).eval(env);
//             return null;
//         }
//     }
//     @Reviser public static class DotEx extends Dot {
//         public DotEx(List<ASTree> c) { super(c); }
//         public Object eval(Environment env, Object value) {
//             String member = name();
//             if (value instanceof ClassInfo) {
//                 if ("new".equals(member)) {
//                     ClassInfo ci = (ClassInfo)value;
//                     NestedEnv e = new NestedEnv(ci.environment());
//                     StoneObject so = new StoneObject(e);
//                     e.putNew("this", so);
//                     initObject(ci, e);
//                     return so;
//                 }
//             }
//             else if (value instanceof StoneObject) {
//                 try {
//                     return ((StoneObject)value).read(member);
//                 } catch (AccessException e) {}
//             }
//             throw new StoneException("bad member access: " + member, this);
//         }
//         protected void initObject(ClassInfo ci, Environment env) {
//             if (ci.superClass() != null)
//                 initObject(ci.superClass(), env);
//             ((ClassBodyEx)ci.body()).eval(env);
//         }
//     }
//     @Reviser public static class AssignEx extends BasicEvaluator.BinaryEx {
//         public AssignEx(List<ASTree> c) { super(c); }
//         @Override
//         protected Object computeAssign(Environment env, Object rvalue) {
//             ASTree le = left();
//             if (le instanceof PrimaryExpr) {
//                 PrimaryEx p = (PrimaryEx)le;
//                 if (p.hasPostfix(0) && p.postfix(0) instanceof Dot) {
//                     Object t = ((PrimaryEx)le).evalSubExpr(env, 1);
//                     if (t instanceof StoneObject)
//                         return setField((StoneObject)t, (Dot)p.postfix(0),
//                                         rvalue);
//                 }
//             }
//             return super.computeAssign(env, rvalue);
//         }
//         protected Object setField(StoneObject obj, Dot expr, Object rvalue) {
//             String name = expr.name();
//             try {
//                 obj.write(name, rvalue);
//                 return rvalue;
//             } catch (AccessException e) {
//                 throw new StoneException("bad member access " + location()
//                                          + ": " + name);
//             }
//         }
//     }
// }
// 
// Path: src/chap9/ClassInterpreter.java
// public class ClassInterpreter extends BasicInterpreter {
//     public static void main(String[] args) throws ParseException {
//         run(new ClassParser(), new Natives().environment(new NestedEnv())); 
//     }
// }


// Path: src/chap10/ArrayRunner.java
import javassist.gluonj.util.Loader;
import chap7.ClosureEvaluator;
import chap8.NativeEvaluator;
import chap9.ClassEvaluator;
import chap9.ClassInterpreter;

package chap10;

public class ArrayRunner {
    public static void main(String[] args) throws Throwable {
        Loader.run(ClassInterpreter.class, args, ClassEvaluator.class,
                   ArrayEvaluator.class, NativeEvaluator.class,