2012-11-26 3 views
3

JSR223 Bindings class을 사용하면 임의의 Java 객체를 스크립팅 언어에 표시 할 수 있습니다. 그러나 그들은 대상이되어야합니다. Java에서 quitObject.run()이되는 스크립팅 환경에서 호출 할 수있는 함수 quit()을 정의하고자합니다. 그러나 JSR223은 함수 객체의 개념을 정의하지 않습니다. Javascript에서 Runnable()을 사용하고 스크립팅 환경에서 함수를 작성하는 언어 독립적 인 방법이 있습니까? JSR223의 내장 자바 스크립트를 지원JSR223 스크립팅 바인딩에 함수를 추가하는 언어 독립적 인 방법이 있습니까?

static private Object asFunction(ScriptEngine engine, Runnable r) 
    throws ScriptException 
{ 
     final Bindings bindings = engine.createBindings(); 
     bindings.put("r", r); 
     return engine.eval(
      "(function (r) { var f = function() { r.run(); }; return f;})(r)", 
      bindings); 
} 

Runnable quitObject = /* get/create a Runnable here */ 
Bindings bindings = engine.createBindings(); 
bindings.put("quit", asFunction(engine, quitObject)); 

이 내가 원하는 것을 이는 sun.org.mozilla.javascript.internal.InterpretedFunction을 만듭니다. 하지만 분명히 자이 썬에서 작동하지 않을 것입니다. 그리고 저는 이것을 언어 독립적으로 만들고 싶습니다.

내 스크립트 사용자가 quitObject.run()을 입력하는 것을 원하지 않습니다. 스크립트 입력을 구문 분석하여 quit()을 파싱하고 싶지 않아 다른 코드 내에 묻을 수 있습니다.

답변

1

을 보면 oracle/sun이 엔진을 켤 때 마술처럼 (또는 마술처럼) 존재하지 않는 2 가지 기능 (print 및 println)을 구현 한 방법을 찾을 수 있습니다.

이러한 기능은 다소 "스크립트"되어 있습니다.

내가 할 일은 : 새로운 컨텍스트에서 다른 입력을 평가하기 전에 bootstrap.[language_extension]을로드하고 평가하십시오.

지원하려는 각 언어에 대해 이러한 스크립트를 쉽게 만들 수 있습니다.

+0

재미있게 - 내가 마음에 가지고 있었던 것이 아니라 나는 그것을 조사해야 할 것이다! 감사! –

관련 문제