2013-09-10 8 views
5

मैं एक मैक्रो के पैरामीटर की मूल इनपुट स्ट्रिंग प्राप्त करने का प्रयास कर रहा हूं, लेकिन लौटाई गई स्थिति थोड़ा सा लगता है। इस मैक्रो पर विचार करें, उदाहरण के लिए:स्कैला मैक्रोज़ पर स्थिति के साथ क्या हो रहा है?

object M { 
    import scala.reflect.macros.Context 
    import language.experimental.macros 
    def f[T](v: => T) = macro fImpl[T] 
    def fImpl[T : c.WeakTypeTag](c: Context)(v: c.Expr[T]): c.Expr[Unit] = { 
    import c.universe._ 
    val pos = v.tree.pos 
    println(pos.lineContent) 
    println(" " * pos.column + "^") 
    println(" " * pos.point + "^") 
    c.literalUnit 
    } 
} 

जब मैंने इसे इस फ़ाइल के साथ प्रयास करें:

object N extends App { 
    val x = 1 
    val y = 2 
    println(M.f(x + y)) 
} 

मैं इस उत्पादन प्राप्त करें:

println(M.f(x + y)) 
       ^
                   ^

जो मेरे लिए कोई मतलब नहीं है। मैं उम्मीद करता हूं कि यह x पर इंगित करें, या एक से दूर रहें। उसके साथ क्या है?

+0

आप 'को println (एमएफ (एक्स इसे बदल सकते हैं। + (Y))) 'बिंदु y पर इंगित करने के लिए एक से अधिक स्थानांतरित होता है, और' println (एमएफ (अगर (सत्य) {x + y}) के साथ) 'यह अगर f में इंगित करता है। मुझे संदेह है कि यह पेड़ के शीर्ष पर इंगित करने की कोशिश कर रहा है, + या अगर का आविष्कार, हालांकि यह माना जाता है कि यह एक और सवाल है या नहीं। कम-से-कम एक-एक-एक त्रुटि भी हो सकती है। यह मुझे एक बग रिपोर्ट के लिए उपयुक्त लग रहा है। – wingedsubmariner

+0

प्रश्न पढ़ने पर यह मजेदार होगा, मैक्रोज़ पर आपकी स्थिति क्या है? –

उत्तर

3

यह एक ऑफ-बाय-वन बग है कि Position.column और Position.line 1-आधारित हैं।

यह एक प्रलेखन बग है कि वे एपीआई दस्तावेज करने के लिए परेशान हैं लेकिन इसका उल्लेख करने के लिए परेशान नहीं है।

आप -Yrangepos साथ संकलन कर सकते हैं और:

val n = pos.column - (pos.point - pos.startOrPoint) - 1 
println(" " * n + "^") 

या इसी तरह के पेड़ में जल्द से जल्द स्थिति का संकेत करने।

println(M.f(x + y)) 
      ^

अद्यतन:

मैक्रो वापसी अभिव्यक्ति यह दिया है दे, और -Xprint:typer -Yshow-trees साथ संकलन, पेड़ भीतरी Apply नोड, जो + पर स्थित होती है है:

 Apply(// def println(x: Any): Unit in object Predef, tree.tpe=Unit 
     scala.this."Predef"."println" // def println(x: Any): Unit in object Predef, tree.tpe=(x: Any)Unit 
     Apply(// def +(x: Int): Int in class Int, tree.tpe=Int 
      "x"."$plus" // def +(x: Int): Int in class Int, tree.tpe=(x: Int)Int 
      "y" // val y: Int, tree.tpe=Int 
     ) 
    ) 

के साथ एक "रेंज" स्थिति, पेड़ के शीर्ष की स्थिति में इसके नीचे सब कुछ शामिल है। इसलिए point है जहां + है, start एक रेंज स्थिति की श्रेणी सीमा से घिरी सब कुछ की सबसे पुरानी स्थिति है, यानी, पेड़ में सब कुछ कम है। इस मामले में, बायां पत्ता x है।

तो अंतर point - start आपको बताता है कि बैक अप कितना दूर है।

(मैं नहीं पर विचार किया है क्या हुआ अगर स्रोत फ़ाइल में ऑफसेट क्योंकि वर्ण एन्कोडिंग में मतभेद के स्तंभ ऑफसेट से अलग हैं।)

+0

लेकिन _what_ 'कॉलम' को इंगित करता है? और 'pos.point - pos.startOrPoint' का अर्थ क्या है (जिनमें से दोनों मेरे लिए अर्थहीन थे)? –

+0

@ डैनियल सी। सोब्राल मुझे केवल एक बग पेश करने के लिए रेंज पोजिशन के बारे में पर्याप्त जानकारी है, जिसे आईडीई लोगों को ठीक करना था। कम से कम मैं एक बग फिक्स भी कर रहा था, इसलिए यह धोया गया था। इसके अलावा, मैंने सोचा- यंगपैप्स डिफ़ॉल्ट बनने जा रहा था? मेरे सीमित ज्ञान के साथ अद्यतन किया गया। –

+0

@ डैनियलसी। सोब्राल https://github.com/scala/scala/pull/2936 –

संबंधित मुद्दे