private Expression plus( List<Expression> args, String caller ) {
      
      boolean ints = true;
      boolean intsOrDecimals = true;
      
      for ( int i = 0; i < args.size(); ++i ) {
         
         // 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(0);
         for ( int i = 0; 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(0.0);
         for ( int i = 0; 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();
      }
   }