복붙노트

[SCALA] 스칼라에서 "평가"

SCALA

스칼라에서 "평가"

스칼라는 자바 응용 프로그램에 스크립트를 사용할 수 있습니까?

나는 그것을 (호스트 응용 프로그램에 의해 노출 된 데이터)에 대한 실행 범위를 설정 자바에서 스칼라 코드의 조각을,로드를 평가하고 그것에서 결과 개체를 검색 할 필요가있다.

스칼라 문서는 (가 일반 JVM 바이트 코드로 점등되고 있기 때문에) 자바에서 컴파일 된 스칼라 코드를 호출하는 것이 얼마나 쉬운 지 보여줍니다.

하지만 (스칼라 내에서, 자바에서 또는 쉽게 경우) 즉시 스칼라 식을 계산할 수있는 방법?

다른 언어의 경우, javax.scripting 인터페이스가있다. 스칼라가이를 지원하지 않는 것, 나는 AOT 컴파일에 의존하지 않는 자바 / 스칼라 상호 운용성 문서에서 아무것도 찾을 수 없습니다.

해결법

  1. ==============================

    1.스칼라는 스크립팅 언어가 아닙니다. 그것은 다소 스크립트 언어처럼 보일 수 있습니다, 사람들은 그 목적을 위해 그것을 옹호 할 수 있지만 정말 (동적으로 입력 된 언어를 지향 됨) JSR 223 스크립트 프레임 워크 내에서 잘 맞지 않습니다. 원래의 질문에 대답하기, 스칼라는 평가가없는 단지 자바와 같은 평가 기능이 없습니다. 이러한 기능은 정말 자신 본질적으로 정적 인 특성을 다음 언어 중 하나에 대해 이해가되지 것입니다.

    스칼라는 스크립팅 언어가 아닙니다. 그것은 다소 스크립트 언어처럼 보일 수 있습니다, 사람들은 그 목적을 위해 그것을 옹호 할 수 있지만 정말 (동적으로 입력 된 언어를 지향 됨) JSR 223 스크립트 프레임 워크 내에서 잘 맞지 않습니다. 원래의 질문에 대답하기, 스칼라는 평가가없는 단지 자바와 같은 평가 기능이 없습니다. 이러한 기능은 정말 자신 본질적으로 정적 인 특성을 다음 언어 중 하나에 대해 이해가되지 것입니다.

    내 조언 : 당신이 평가를 (당신이 거의 루비처럼, 심지어이 언어로하지 않는다)이 필요하지 않도록 코드를 다시 생각. 또는, 어쩌면 당신은 응용 프로그램의이 부분에 대해 전혀 스칼라를 사용하고 싶지 않아요. 당신이 정말로 평가해야하는 경우, JRuby를 사용해보십시오. JRuby를, 스칼라 및 Java 함께 매우 잘 메쉬. 그것은 자바, 스칼라에 참여하고 루비의 다른 부분 (평가를 필요로하는 비트)에서 시스템의 일부를 가지고하는 것은 매우 쉽습니다.

  2. ==============================

    2.지금은 2011, 그리고 당신은 scala.tools.nsc.Interpreter으로 그렇게 할 수 있습니다

    지금은 2011, 그리고 당신은 scala.tools.nsc.Interpreter으로 그렇게 할 수 있습니다

    http://blog.darevay.com/2009/01/remedial-scala-interpreting-scala-from-scala/ 참조

  3. ==============================

    3.스칼라는 2.11 JSR-223 (https://issues.scala-lang.org/browse/SI-874)을 공식 지원이 추가되었습니다.

    스칼라는 2.11 JSR-223 (https://issues.scala-lang.org/browse/SI-874)을 공식 지원이 추가되었습니다.

    당신은 여전히 ​​(필요하지 않은 방식으로 재검토에 대한) 다니엘 스피 웍에서 현재 허용 대답에서 만든 고려 사항에 대해 생각 후 필요한 경우 그래서,이 공식 대안이 될 것이다.

  4. ==============================

    4.당신은 클래스에 포장, 스칼라 코드를 복용 클래스를 컴파일, 새로운 인스턴스를 만들 반사를 사용하여 다음을 호출하여 "평가"를 에뮬레이션 할 수 있습니다. 그것은 약간의 참여, 그리고 스칼라 컴파일러는 초기화 (2 초 정도) 매우 느리지 만, 그것을 잘 작동합니다.

    당신은 클래스에 포장, 스칼라 코드를 복용 클래스를 컴파일, 새로운 인스턴스를 만들 반사를 사용하여 다음을 호출하여 "평가"를 에뮬레이션 할 수 있습니다. 그것은 약간의 참여, 그리고 스칼라 컴파일러는 초기화 (2 초 정도) 매우 느리지 만, 그것을 잘 작동합니다.

    그것을 위해 라이브러리 '폴더의 유틸리티 - 평가 "라고, 여기있다 : https://github.com/twitter/util/

    문제의 코드는 여기에 살고 : https://github.com/twitter/util/blob/master/util-eval/src/main/scala/com/twitter/util/Eval.scala

    그것은 다음과 같이 작동합니다 :

    val sum = Eval[Int]("1 + 1")
    // sum will be 2
    
  5. ==============================

    5.이것은 좋은 방법입니다,하지만 난 toolbox.parse 및 toolbox.eval을 사용하여이 문제를 해결하면 나는 확실하지 않다

    이것은 좋은 방법입니다,하지만 난 toolbox.parse 및 toolbox.eval을 사용하여이 문제를 해결하면 나는 확실하지 않다

    당신이이 스칼라의 평가를하려면 :

    + = "org.scala 전용"% libraryDependencies % "2.11.7"을 "스칼라 반영"

      import scala.reflect.runtime.currentMirror
      import scala.tools.reflect.ToolBox
      val toolbox = currentMirror.mkToolBox()
    
      val as = "2*(2+3)"
      val compe = toolbox.eval(toolbox.parse(as))
    
      println(compe.getClass) // prints class java.lang.Integer
      println(compe) // prints 10
    

  6. ==============================

    6.당신은 항상 스칼라 클래스를 컴파일하고 동적으로 클래스를로드 scalac를 사용할 수 있습니다. 그러나 나는 당신이 계신없는 것 같아요.

    당신은 항상 스칼라 클래스를 컴파일하고 동적으로 클래스를로드 scalac를 사용할 수 있습니다. 그러나 나는 당신이 계신없는 것 같아요.

  7. from https://stackoverflow.com/questions/1183645/eval-in-scala by cc-by-sa and MIT license