code: import java.io.File;
  import java.lang.reflect.Method;
  import java.net.URI;
  import java.util.Arrays;
  import javax.tools.JavaCompiler;
  import javax.tools.SimpleJavaFileObject;
  import javax.tools.ToolProvider;
  
  public class Eval {
      private static final String CLASS_NAME = "TempPleaseDeleteMe";
  
      private static class StringCompiler
              extends SimpleJavaFileObject {
          final String m_sourceCode;
  
          private StringCompiler( final String sourceCode ) {
              super( URI.create( "string:///" + CLASS_NAME + Kind.SOURCE.extension ), Kind.SOURCE );
              m_sourceCode = sourceCode;
          }
  
          @Override
          public CharSequence getCharContent( final boolean ignoreEncodingErrors ) {
              return m_sourceCode;
          }
  
          private boolean compile() {
              final JavaCompiler javac = ToolProvider.getSystemJavaCompiler();
  
              return javac.getTask( null, javac.getStandardFileManager( null, null, null ),
                  null, null, null, Arrays.asList( this )
              ).call();
          }
  
          private double callEval( final double x )
                  throws Exception {
              final Class<?> clarse = Class.forName( CLASS_NAME );
              final Method   eval   = clarse.getMethod( "eval", double.class );
  
              return ( Double ) eval.invoke( null, x );
          }
      }
  
      public static double evalWithX( final String code, final double x )
              throws Exception {
          final StringCompiler sc = new StringCompiler(
              "class "
                  + CLASS_NAME
                  + "{public static double eval(double x){return ("
                  + code
                  + ");}}"
              );
  
          if ( ! sc.compile() ) throw new RuntimeException( "Compiler error" );
          return sc.callEval( x );
      }
  
      public static void main( final String [] args )
              throws Exception /* lazy programmer */ {
          final String expression = args [ 0 ];
          final double x1         = Double.parseDouble( args [ 1 ] );
          final double x2         = Double.parseDouble( args [ 2 ] );
  
          System.out.println(
              evalWithX( expression, x1 )
              - evalWithX( expression, x2 )
          );
      }
  }
  