class IdExpr extends Expr { String name; // The name of the Q2 identifier public IdExpr( String _name ) { this.name = _name; } public String toString() { return name; } public Value eval() { throw new RuntimeException("no such var: " + name ); } public Expr subst( /* IdExpr this */ IdExpr id, Value v ) { return (this.name.equals(id.name)) ? v : this; } @Override public boolean equals( /* IdExpr this, */ Object that) { if (this==that) { return true; } else if (that==null) { return false; } else if (this.getClass() != that.getClass()) { return false; } else { IdExpr thatt = (IdExpr) that; return this.name.equals(thatt.name); } } @Override public int hashCode() { if (cachedHash == null) { int hashSoFar = 0x815F58D4; // fingerprint hashSoFar += this.name.hashCode(); cachedHash = hashSoFar; } return cachedHash; } private Integer cachedHash = null; }