2015-03-14 4 views
1

J'expérimente avec la bibliothèque Scala FastParsers et je suis étudiant macro du expansion code suivant:Impossible d'obtenir la sémantique de cette boucle en macro expansion

val trueValue = "true".toCharArray 
val falseValue = "false".toCharArray 

object KParser1 { 
    import fastparsers.framework.implementations.FastParsersCharArray._ 

    val kparser = FastParsersCharArray { 
    def func1: Parser[Any] = func1 | falseValue 
    } 
} 

entier est there expansion mais un morceau de code de là me dérange vraiment

while$2() { 
    if (inputpos$macro$2.$less(inputsize$macro$3).$amp$amp(input$macro$1(inputpos$macro$2).$eq$eq(' ').$bar$bar(input$macro$1(inputpos$macro$2).$eq$eq('\t')).$bar$bar(input$macro$1(inputpos$macro$2).$eq$eq('\n')).$bar$bar(input$macro$1(inputpos$macro$2).$eq$eq('\r')))) 
    { 
    inputpos$macro$2 = inputpos$macro$2.$plus(1); 
    while$2() 
    } 
    else 
    () 
}; 

il ressemble le code qui saute des espaces de flux d'entrée, mais je ne peux pas déduire ce qui est while$2 exactement: est-il y a déclaré que Unit => Unit et appelé automatiquement ou est il une certaine fonction prédéfinie avec le type Unit => Any => Any?

+0

'tout 2' $ ressemble à des détails de mise en œuvre de la boucle selon [cette discussion liste de courrier] (https://groups.google.com/forum/#!topic/scala-language/jmIouhGYLRg). – ForNeVeR

Répondre

0

C'est juste une boucle. Comparez:

scala> while (!done) println("working") 
[[syntax trees at end of      typer]] // <console> 
package $line5 { 
    object $read extends scala.AnyRef { 
    def <init>(): $line5.$read.type = { 
     $read.super.<init>(); 
    () 
    }; 
    object $iw extends scala.AnyRef { 
     def <init>(): type = { 
     $iw.super.<init>(); 
     () 
     }; 
     import $line4.$read.$iw.$iw.done; 
     object $iw extends scala.AnyRef { 
     def <init>(): type = { 
      $iw.super.<init>(); 
     () 
     }; 
     private[this] val res0: Unit = while$1(){ 
      if ($line4.$read.$iw.$iw.done.unary_!) 
      { 
       scala.this.Predef.println("working"); 
       while$1() 
      } 
      else 
      () 
     }; 
     <stable> <accessor> def res0: Unit = $iw.this.res0 
     } 
    } 
    } 
}