protected Object computeAssign(IEnv env, Object right) {
		ASTNode leftNode = left();
		if (leftNode instanceof PrimaryExpr) {
			PrimaryExpr expr = (PrimaryExpr) leftNode;
			if (expr.hasPostfix(0) && expr.postfix(0) instanceof ArrayRef) {
				Object object = expr.evaluateSubExpr(env, 1);
				if (object instanceof Object[]) {
					ArrayRef ref = (ArrayRef) expr.postfix(0);
					Object index = ref.index().evaluate(env);
					if (index instanceof Integer) {
						((Object[]) object)[(int) index] = right;
						return right;
					}
				}
				throw new StoneException("bad array access", this);
			}
			if (expr.hasPostfix(0) && expr.postfix(0) instanceof Dot) {
				Object object = expr.evaluateSubExpr(env, 1);
				if (object instanceof StoneObject) {
					return setField((StoneObject) object,
							(Dot) expr.postfix(0), right);
				}
			}
		}
		if (leftNode instanceof Name) {
			env.put(((Name) leftNode).name(), right);
			return right;
		}
		throw new StoneException("bad assignment", this);
	}