public LispNumber     add         (LispValue  args)
  {
    // Args is a list of numbers that has already been evaluated.
    // Terminate if we hit any non-numbers.
    BigInteger sum = this.value;
    LispNumber addend;

    while (args != NIL)
    {
      // System.out.println("LispBignum.add: " + sum + " and " + args);
      addend = assertNumber(car(args));

      // If an addend is a float, we need to convert the
      // pending result to a LispReal and add the rest of
      // the numbers as reals.
      if (addend instanceof LispReal)
      {
        // Do we print a warning?
        LispReal realValue = real(this.getDoubleValue());
        return realValue.add(args);
      }

      if (addend instanceof LispBignum)
        sum = sum.add(((LispBignum)addend).getBigIntegerValue());
      else // must be an integer
        sum = sum.add(BigInteger.valueOf(((LispInteger)addend).getLongValue()));

      args = cdr(args);
    };

    if ((sum.compareTo(MAXINT) <= 0)    // If LispInteger size...
            && (sum.compareTo(MININT) >= 0))
      return (integer(sum.longValue()));
    else
      return (bignum(sum));
  }