public override int GetHashCode() { unchecked { return((first.GetHashCode() * 397) ^ second.GetHashCode()); } }
// I thought of doing Format as a virtual method of Datum, but I // prefer to keep all the formatting bundled up here. public static string Format(Datum a) { if (a == null) { return "()"; } else if (a is Symbol) { return (a as Symbol).name; } else if (a is Rational) { Rational r = (Rational)a; return r.ToString(); } else if (a is Boolean) { if ((a as Boolean).val == true) return "#t"; else return "#f"; } else if (a is Pair) { StringBuilder fmt = new StringBuilder("("); while (a is Pair) { Pair p = a as Pair; fmt.Append(Format(p.car)); if (p.cdr != null) fmt.Append(" "); a = p.cdr; } if (a != null) { fmt.Append(". "); fmt.Append(Format(a)); } fmt.Append(")"); return fmt.ToString(); } else if (a is Primitive) { return "#<primitive " + (a as Primitive).name + ">"; } else if (a is Closure) { Closure c = a as Closure; return "#<closure " + Format(c.formals) + " " + Format(c.body) + ">"; } else if (a is Continuation) { return "#<continuation " + a.GetHashCode() + ">"; } else if (a is Unspecified) { return "#<unspecified>"; } else if (a is SharpF.String) { return "\"" + (a as SharpF.String).val + "\""; } else { return "#<unprintable: " + a.ToString() + ">"; } }
public override int GetHashCode() { return(Datum.GetHashCode() ^ Version.GetHashCode()); }