private Expression rest( List<Expression> args, String caller ) {
      
      if ( args.size() != 1 ) {
         System.err.println("rest/tail expected exactly one argument and got " + args.size() );
         return new Void();
      }
      
      Expression expr = args.get(0).eval(defSubst, caller);
      
      if ( expr.getType().compareTo("quotelist") != 0 ) {
         System.err.println("rest/tail expected a quotelist as an argument and got a " + expr.getType() );
         return new Void();
      }
      
      QuoteList ourList = (QuoteList) expr;
      
      // the elements of the list
      List<Expression> elements = ourList.getElements();
      
      // if the list is empty -> error
      // otherwise -> return all but the first element of the list
      if ( elements.size() == 0 ) {
         //return args.get(0).eval(defSubst); // the empty list
         System.err.println("Can't get rest of an empty list");
         return new Void();
      } else {
         elements.remove(0);
         QuoteList newList = new QuoteList(elements);
         return newList.eval(defSubst, caller);
      }  
   }