복붙노트

[SCALA] / 이해의 표현을위한 스칼라의 desugared 부분을 얻기?

SCALA

/ 이해의 표현을위한 스칼라의 desugared 부분을 얻기?

사람은 실제로 REPL (또는 컴파일러)로 컴파일을 시도하기 전에 / 이해에 대한 표현의 desugared 번역문 (단지 스칼라 부분)을 얻는 방법을 알고 있나요?

내가 지금까지 찾은 유일한 방법은 컴파일러 "-print"플래그입니다 그러나 그것은 당신에게 전체 스칼라 번역을 제공합니다 ...

해결법

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

    1.이미 다른 항목에 말했듯이, scalac 스칼라 코드가 아닌 자바를 출력 -print. 그것은 정상 스칼라 코드와 자바와 직접 호환되지 않는 모든 스칼라 키워드를 변환합니다. 이 컴파일러는 AFAIK 부분 만 번역 할 수 없습니다. 그러나 기본적으로 대한-이해는 항상 같은 방식으로 변환됩니다.

    이미 다른 항목에 말했듯이, scalac 스칼라 코드가 아닌 자바를 출력 -print. 그것은 정상 스칼라 코드와 자바와 직접 호환되지 않는 모든 스칼라 키워드를 변환합니다. 이 컴파일러는 AFAIK 부분 만 번역 할 수 없습니다. 그러나 기본적으로 대한-이해는 항상 같은 방식으로 변환됩니다.

    대한 /이 같은 수율 간단한

    for(x <- List(1,2,3)) yield x*x
    

    로 번역됩니다

    List(1,2,3).map {x => x*x}
    

    그리고 수율없이

    for(x <- List(1,2,3)) println(x)
    

    List(1,2,3).foreach{x => println(x)}
    

    중첩 된 FORS 중첩 된 flatMap / 맵 구조로 변환됩니다

    for(x <- List(1,2,3); y <- List(4,5,6)) yield x*y
    

    로 번역됩니다

    List(1,2,3).flatMap { x =>
      List(4,5,6).map { y =>
        x*y
      }
    }
    

    그래서 전혀 마법이 없다

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

    2.에 직접 REPL에서 표현 "/ 이해를 위해"desugar 어떤 가능성을 존재하지 않는 것 같습니다. 그러나 또 다른 하나는 "-print"와 같은 또는 간단한 표현에 대한 몇 가지 스칼라 컴파일러 옵션을 사용할 수 있습니다로 "의 Xprint : 타이 퍼 -e"

    에 직접 REPL에서 표현 "/ 이해를 위해"desugar 어떤 가능성을 존재하지 않는 것 같습니다. 그러나 또 다른 하나는 "-print"와 같은 또는 간단한 표현에 대한 몇 가지 스칼라 컴파일러 옵션을 사용할 수 있습니다로 "의 Xprint : 타이 퍼 -e"

    예:

    파일에서 desugard 출력은 "-print"플래그를 사용 얻으려면 :

    # scala -print file.scala
    

    플래그 : 간단한 한 줄 식을 desugar하려면 "타이 퍼 -e -Xprint"를 사용합니다 :

    # scala -Xprint:typer -e "for (i <- 0 to 100) yield i"
    
  3. ==============================

    3.어떻게 매크로에 대한?

    어떻게 매크로에 대한?

    import scala.reflect.macros.Context
    import scala.reflect.runtime.universe._
    import scala.language.experimental.macros
    
    def _desugar(c : Context)(expr : c.Expr[Any]): c.Expr[Unit] = {
      import c.universe._
      println(show(expr.tree))
      reify {}
    }
    
    def desugar(expr : Any) = macro _desugar
    

    이것은 귀하의 요청에 따라 같이 REPL에서 직접 사용할 수 있습니다 :

    scala> desugar { for(i <- List(1,2,3,4,5)) yield i }
    immutable.this.List.apply[Int](1, 2, 3, 4, 5).map[Int, Any](((i: Int) =>
    i))(immutable.this.List.canBuildFrom[Int])
    
    scala> desguar { for(i <- (0 to 10) if (i > 5)) yield i }
    scala.this.Predef.intWrapper(0).to(10).withFilter(((i: Int) => i.>(5))).map[Int,
    Any](((i: Int) => i))(immutable.this.IndexedSeq.canBuildFrom[Int])
    

    또한 다른 임의의 표현에서 작동합니다.

    scala> desugar {
         |   val x = 20
         |   val y = 10
         |   println(x + y)
         | }
    {
      val x: Int = 20;
      val y: Int = 10;
      scala.this.Predef.println(x.+(y))
    }
    

    이것은 아마도 당신은 당신이 이제까지 컴파일하거나 언제든지 파일로 출력 데이터를 덤프하지 않고도 요구하고 무엇을 얻을 것이다 가장 가까운입니다. 당신은 REPL에서 직접 매크로를 정의하거나로드 외부 파일의 수 : LOAD 명령.

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

    4.파서 옵션 : 간단한 desugaring이 -Xprint를 사용한 후 결과를 참조하십시오.

    파서 옵션 : 간단한 desugaring이 -Xprint를 사용한 후 결과를 참조하십시오.

    이 간단한 입력 파일을 이름 test.scala이있는 경우 :

    object Test {
      for(x <- List(1,2,3); y <- List(4,5,6)) yield x*y
    }
    

    파서 인쇄 아웃 : 다음 scalac -Xprint를 사용하여 컴파일 :

    $ scalac -Xprint:parser test.scala 
    [[syntax trees at end of                    parser]] // test.scala
    package <empty> {
      object Test extends scala.AnyRef {
        def <init>() = {
          super.<init>();
          ()
        };
        List(1, 2, 3).flatMap(((x) => List(4, 5, 6).map(((y) => x.$times(y)))))
      }
    }
    

    -Xprint에 적용 컴파일러 단계의 전체 목록을 보려면 : <상>이 작업을 수행 :

    $ scalac -Xshow-phases
                 phase name  id  description
                 ----------  --  -----------
                     parser   1  parse source into ASTs, perform simple desugaring
                      namer   2  resolve names, attach symbols to named trees
             packageobjects   3  load package objects
                      typer   4  the meat and potatoes: type the trees
                     patmat   5  translate match expressions
             superaccessors   6  add super accessors in traits and nested classes
                 extmethods   7  add extension methods for inline classes
                    pickler   8  serialize symbol tables
                  refchecks   9  reference/override checking, translate nested objects
               selectiveanf  10  
               selectivecps  11  
                    uncurry  12  uncurry, translate function values to anonymous classes
                  tailcalls  13  replace tail calls by jumps
                 specialize  14  @specialized-driven class and method specialization
              explicitouter  15  this refs to outer pointers, translate patterns
                    erasure  16  erase types, add interfaces for traits
                posterasure  17  clean up erased inline classes
                   lazyvals  18  allocate bitmaps, translate lazy vals into lazified defs
                 lambdalift  19  move nested functions to top level
               constructors  20  move field definitions into constructors
                    flatten  21  eliminate inner classes
                      mixin  22  mixin composition
                    cleanup  23  platform-specific cleanups, generate reflective calls
                      icode  24  generate portable intermediate code
                    inliner  25  optimization: do inlining
    inlineExceptionHandlers  26  optimization: inline exception handlers
                   closelim  27  optimization: eliminate uncalled closures
                        dce  28  optimization: eliminate dead code
                        jvm  29  generate JVM bytecode
                   terminal  30  The last phase in the compiler chain
    

    -Xprint는 <상> 옵션은 스칼라에 적용되므로 REPL이다. 그러나 REPL뿐만 아니라 삽입 모든 래퍼 코드를 볼 수 있습니다.

    $ scala -Xprint:parser
    Welcome to Scala version 2.10.3 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_25).
    Type in expressions to have them evaluated.
    Type :help for more information.
    
    <..a lot of initialisation code printed..>
    
    scala> object Test {
         |   for(x <- List(1,2,3); y <- List(4,5,6)) yield x*y
         | }
    [[syntax trees at end of                    parser]] // <console>
    package $line3 {
      object $read extends scala.AnyRef {
        def <init>() = {
          super.<init>();
          ()
        };
        object $iw extends scala.AnyRef {
          def <init>() = {
            super.<init>();
            ()
          };
          object $iw extends scala.AnyRef {
            def <init>() = {
              super.<init>();
              ()
            };
            object Test extends scala.AnyRef {
              def <init>() = {
                super.<init>();
                ()
              };
              List(1, 2, 3).flatMap(((x) => List(4, 5, 6).map(((y) => x.$times(y)))))
            }
          }
        }
      }
    }
    
    [[syntax trees at end of                    parser]] // <console>
    package $line3 {
      object $eval extends scala.AnyRef {
        def <init>() = {
          super.<init>();
          ()
        };
        lazy val $result = $line3.$read.$iw.$iw.Test;
        val $print: String = {
          $read.$iw.$iw;
          "".$plus("defined module ").$plus("Test").$plus("\n")
        }
      }
    }
    
    defined module Test
    
    scala> 
    
  5. ==============================

    5.IntelliJ를 직접 편집중인 파일에지도 / flatMap / 필터로 함축에 대한 확장을 포함 desugaring을 많이 수행 "을 설명 스칼라"기능이 있습니다.

    IntelliJ를 직접 편집중인 파일에지도 / flatMap / 필터로 함축에 대한 확장을 포함 desugaring을 많이 수행 "을 설명 스칼라"기능이 있습니다.

    IntelliJ에 2017.1 이후이 지금 "Desugar 스칼라 코드"라고하며 "코드"메뉴 (정보 주셔서 감사 미카엘)에 있습니다.

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

    6.스칼라 2.11에서는 quasiquotes를 사용하는 것도 가능합니다 :

    스칼라 2.11에서는 quasiquotes를 사용하는 것도 가능합니다 :

    val universe: scala.reflect.runtime.universe.type = scala.reflect.runtime.universe
    import universe._
    val tree = q"""
      val x = 20
      val y = 10
      println(x + y)
    """
    println(tree)
    
  7. from https://stackoverflow.com/questions/9891407/getting-the-desugared-part-of-a-scala-for-comprehension-expression by cc-by-sa and MIT license