private Expression minus( List<Expression> args, String caller ) {
      
      boolean ints = true;
      boolean intsOrDecimals = true;
      
      if ( args.size() < 2 ) {
         System.err.println("- expected at least two arguments and got " + args.size() );
         return new Void();
      }

      for ( int i = 0; i < args.size(); ++i ) {
      
         // first evaluate the argument
         args.add(i, args.remove(i).eval(defSubst, caller));
         
         // if it's not an int
         if ( ! args.get(i).show(defSubst, caller).matches("\\d+") ) {
            ints = false;
         }
         
         // if it's not an int or a decimal
         if ( ! args.get(i).show(defSubst, caller).matches("\\d+") &&
              ! args.get(i).show(defSubst, caller).matches("\\d*.\\d+") ) {
            intsOrDecimals = false;
         }
      }
      
      // integer addition
      if ( ints ) {
         //System.err.println("INT ARTH");
         Long result = new Long( args.get(0).show(defSubst, caller) );
         for ( int i = 1; i < args.size(); ++i ) {
            result -= new Long( args.get(i).show(defSubst, caller) );
         }
         return new Value(result.toString());
      }
      // double precision floating point addition
      else if ( intsOrDecimals ) {
         //System.err.println("DOUBLE ARTH");
         Double result = new Double( args.get(0).show(defSubst, caller ) );
         for ( int i = 1; i < args.size(); ++i ) {
            result -= new Double( args.get(i).show(defSubst, caller) );
         }
         return new Value(result.toString());
      }
      // error condition... 
      else {
         System.err.println("Error: - expected only numbers as arguments");
         return new Void();
      }
   }