package nars.operator.misc;
import java.util.HashMap;
import javax.script.Bindings;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.SimpleBindings;
import nars.storage.Memory;
import nars.io.Output.ERR;
import nars.io.Texts;
import nars.language.Term;
import nars.operator.SynchronousFunctionOperator;
/**
* Executes a Javascript expression
*/
public class Javascript extends SynchronousFunctionOperator {
ScriptEngine js = null;
Bindings bindings = null;
final HashMap global = new HashMap();
public Javascript() {
super("^js");
}
@Override protected Term function(Memory memory, Term[] args) {
if (args.length < 1) {
return null;
}
if (js == null) {
ScriptEngineManager factory = new ScriptEngineManager();
js = factory.getEngineByName("JavaScript");
}
// copy over all arguments
Term[] scriptArguments;
scriptArguments = new Term[args.length-1];
System.arraycopy(args, 1, scriptArguments, 0, args.length-1);
if(bindings == null) {
bindings = new SimpleBindings();
}
bindings.put("arg", scriptArguments);
bindings.put("memory", memory);
bindings.put("nar", nar);
bindings.put("global", global);
String input = Texts.unescape(args[0].name()).toString();
if (input.charAt(0) == '"') {
input = input.substring(1, input.length() - 1);
}
Object result;
try {
result = js.eval(input, bindings);
} catch (Throwable ex) {
//result=ex.toString();
nar.emit(ERR.class, ex.toString());
return null;
}
if(result==null) {
return null;
}
return Term.text(result.toString());
}
@Override public Term getRange() {
return Term.get("js_evaluation");
}
}