स्काला आरईपीएल का पावर मोड सक्षम करता है :phase आदेश:

:phase <phase>           set the implicit phase for power commands

मुझे इस आदेश का उपयोग करने के तरीके पर दस्तावेज़ीकरण नहीं मिल रहा है। उदाहरण के लिए, मान लें कि मैंने parser कंपाइलर चरण सेट किया है

scala> :phase parser
Active phase is now: Parser

इससे कौन सी पावर कमांड प्रभावित हुई है? मैं इन प्रभावित पावर कमांड को कैसे कॉल करूं? यह :settings -Xprint:parser से किस प्रकार भिन्न है?

2
Mario Galic 26 पद 2019, 03:06

1 उत्तर

सबसे बढ़िया उत्तर

कमांड के कारण आपके कोड का मूल्यांकन enteringPhase होता है, जिसे intp.setExecutionWrapper का उपयोग करके पूरा किया जाता है। आप रैपिंग को -Dscala.repl.debug के साथ देख सकते हैं।

यह आरईपीएल के "प्रिंट" को लपेटता है:

lazy val $print: _root_.java.lang.String = $line4.$read.$iw.$iw.$r.phased.atCurrent {

phased ऑब्जेक्ट केवल कॉल को enteringPhase के अनुकूल बनाता है।

यहां एक उदाहरण दिया गया है जहां आप बाद के चरण में मिटाए गए प्रकार को देखते हैं:

scala> global.rootMirror.staticClass("scala.Option").typeSignature
res0: $r.global.Type =
[+A <: <?>]AnyRef
        with IterableOnce[A]
        with Product
        with Serializable {
  def <init>(): Option[A]
  final def isEmpty: Boolean
  final def isDefined: Boolean
  final override def knownSize: Int
  def get: A
  final def getOrElse[B >: A](default: => B): B
  final def orNull[A1 >: A](implicit ev: Null <:< A1): A1
  final def map[B](f: A => B): Option[B]
  final def fold[B](ifEmpty: => B)(f: A => B): B
  final def flatMap[B](f: A => Option[B]): Option[B]
  def flatten[B](implicit ev: A <:< Option[B]): Option[B]
  final def filter(p: A => Boolean): Option[A]
  final def filterNot(p: A => Boolean): Option[A]
  final def nonEmpty: Boolean
  final def withFilter(p: A => Boolean): Option.this.WithFilter
  class WithFilter extends AnyRef
  final def...

scala> global.rootMirror.staticClass("scala.Option").typeSignature.getClass
res1: Class[_ <: $r.global.Type] = class scala.reflect.internal.Types$PolyType

scala> :phase cleanup
Active phase is now: Cleanup

scala> global.rootMirror.staticClass("scala.Option").typeSignature.getClass
res2: Class[_ <: $r.global.Type] = class scala.reflect.internal.Types$ClassInfoType

scala> global.rootMirror.staticClass("scala.Option").typeSignature
res3: $r.global.Type =
Object
        with scala.collection.IterableOnce
        with Product
        with java.io.Serializable {
  def <init>(): Option
  final def isEmpty(): Boolean
  final def isDefined(): Boolean
  final override def knownSize(): Int
  def get(): Object
[snip]

आरईपीएल में :type कमांड प्रभावित नहीं होता क्योंकि यह exitingTyper को कॉल करता है।

3
som-snytt 26 पद 2019, 06:19