/** Evaluate the string in the current interpreter (see source()). Returns the result of the evaluation or null.
Evaluate a string as if it were written directly in the current scope, with side effects in the current scope.
e.g.
a=5;
eval("b=a*2");
print(b); // 10
eval() acts just like invoked text except that any exceptions generated by the code are captured in a bsh.EvalError. This includes ParseException for syntactic errors and TargetError for exceptions thrown by the evaluated code.
e.g.
try { eval("foo>>><>M>JK$LJLK$"); } catch ( EvalError e ) { // ParseException caught here } try { eval("(Integer)true"); // illegal cast } catch ( EvalError e ) { // TargetException caught here print( e.getTarget() ) // prints ClassCastException }
If you want eval() to throw target exceptions directly, without wrapping them, you can simply redefine own eval like so:
myEval( String expression ) { try { return eval( expression ); } catch ( TargetError e ) { throw e.getTarget(); } }Here is a cute example of how to use eval to implement a dynamic cast. i.e. to cast a script to an arbitrary type by name at run-time where the type is not known when you are writing the script. In this case the type is in the variable interfaceType.
reference = eval( "("+interfaceType+")this" );
Returns the value of the expression.
Throws bsh.EvalError on error
@return the value of the expression. @throws bsh.EvalError on error */ bsh.help.eval = "usage: eval( String expression )"; Object eval( String expression ) { return this.interpreter.eval( expression, this.caller.namespace ); }