2012-08-26 12 views
5

मैं दो पथ-निर्भर प्रकारों के समतुल्यता के साथ कैसे मिल सकता हूं जो मुझे पता है लेकिन संकलक नहीं है?स्कैला: पथ-निर्भर प्रकारों का समतुल्यता

स्कैला 2.10.0 एम 7 का उपयोग करके मैं एक ब्रह्मांड से दूसरे में एक एएसटी को बदलने की कोशिश कर रहा हूं।

val bridge = treehugger.MacroBridge(c) 
def fromMacroTree(tree: c.universe.Tree): Tree = bridge.fromMacroTree(tree) 

बहरहाल, यह एक संकलक त्रुटि के परिणाम:

[error] /scalamacros-getting-started/library/Macros.scala:21: type mismatch; 
[error] found : c.universe.Tree 
[error] required: bridge.context.universe.Tree 
[error] possible cause: missing arguments for method or constructor 
[error]  def fromMacroTree(tree: c.universe.Tree): Tree = bridge.fromMacroTree(tree) 

ऊपर कोड c में स्पष्ट रूप से एक ही है

case class MacroBridge(context: Context) { 
    def toMacroTree(tree: treehugger.forest.Tree): context.universe.Tree = ??? 
    def fromMacroTree(tree: context.universe.Tree): treehugger.forest.Tree = ??? 
} 

एक मैक्रो कार्यान्वयन के भीतर, मैं के रूप में उपयोग कर सकते हैं bridge.context के रूप में मूल्य, लेकिन हो सकता है क्योंकि यह एक मूल्य प्रकार जांचकर्ता इसे जांच नहीं सकता है। लाना सामान्यीकृत प्रकार बाधा मदद नहीं की:

def fromMacroTree[A](tree: A)(implicit ev: A =:= context.universe.Tree): Tree = 

मैक्रो यह अभी भी एक त्रुटि के परिणामस्वरूप में:

[error] /scalamacros-getting-started/library/Macros.scala:21: Cannot prove that c.universe.Tree =:= bridge.context.universe.Tree. 
[error]  def fromMacroTree(tree: c.universe.Tree): Tree = bridge.fromMacroTree(tree) 

मैं context.universe के लिए उपयोग की जरूरत है तो मैं TermName जैसे अन्य निर्भर प्रकार के लिए मिल सकता है। वहाँ कास्टिंग के अलावा चारों ओर एक बेहतर काम ?:

def fromMacroTree(tree: c.universe.Tree): Tree = 
    bridge.fromMacroTree(tree.asInstanceOf[bridge.context.universe.Tree]) 
+0

शायद मैक्रो ट्री [टी <: पेड़] (पेड़: टी) से डीएफ की तरह कुछ: टी = ??? 'और' से मैक्रो ट्री [पेड़। टाइप] (पेड़) 'मदद करता है? – sschaef

+0

मुझे लगता है कि 'वृक्ष के कुछ सामान्य सुपर प्रकार हैं, कोशिश की? – pedrofurla

+0

@sschaef मुझे त्रुटि मिली: 'तर्क टाइप करें [c.universe.Tree] मैक्रो ट्री के प्रकार पैरामीटर सीमाओं से विधि के अनुरूप नहीं है [टी <: bridge.context.universe.Tree] ' –

उत्तर

9

है मैं कर सकता निम्नलिखित काम करने के लिए करते हैं:

case class MacroBridge[C <: Context](context: C) { 
    def fromMacroTree(tree: context.universe.Tree): context.universe.Tree = ??? 
} 

trait MB { 
    def meth(c: Context) { 
    val bridge = MacroBridge[c.type](c) 
    def fromMacroTree(tree: c.universe.Tree): c.universe.Tree = 
     bridge.fromMacroTree(tree) 
    } 
} 

मैं लगभग same problem कुछ समय पहले किया था।

+0

' वैल ब्रिज = treehugger.MacroBridge [c .type] (सी) 'जवाब था। धन्यवाद! –

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