2012-08-28 18 views
5

तक सीमित न हो, मैं गलत शब्दावली का उपयोग कर रहा हूं, लेकिन यहां उदाहरण है कि मैं क्या हासिल करना चाहता हूं। मैं निम्नलिखित मैक्रो है कहते हैं कि चलो:क्या मैक्रो विस्तार को स्थगित करना संभव है जब तक कि अमूर्त प्रकार विशिष्ट प्रकार

def generateField[T]: AnyRef = 
    macro generateFieldImpl[T] 

def generateFieldImpl[T: c.AbsTypeTag](c: Context): c.Expr[AnyRef] = { 
/** 
* here I'm looking at the type T by reflection to see now many members it has 
* and based on that I'm generating TupleN[Array[Byte], ...](null, ...) 
* where N is number of members in class represented by type T 
*/ 
} 

मैं टी

के रूप में केवल मामले वर्गों का उपयोग करने के जब मैं इस मैक्रो मामले वर्ग के साथ यह बहुत अच्छा काम करता है का उपयोग की योजना बना रहा हूँ, लेकिन अब मैं करना चाहते हैं अमूर्त के एक स्तर जोड़ें:

trait WithGeneratedField[T] { 
    val _myField = generateField[T] 
} 

समस्या मैं आ रही है कि मैक्रो जब विशेषता घोषित किया जा रहा है का विस्तार किया जाता है और उस बिंदु टी पर एक सार प्रकार 'टी' के रूप में जाना जाता है। मैक्रो विस्तार को स्थगित करने का कोई तरीका है जब तक कि मैं इस विशेषता में कुछ ठोस के साथ मिश्रित न हो? उदाहरण के लिए:

case class MyClass(a: String, b: Int) extends WithGeneratedField[MyClass] 

अंत में मेरा लक्ष्य किसी वर्ग वर्ग में जेनरेट किए गए फ़ील्ड को जोड़ने के लिए मैक्रो का उपयोग करना है। शायद ऐसा करने का एक बेहतर तरीका है?

उत्तर

2

यदि यह 2.10.0 में संभव हो तो मुझे आश्चर्य होगा।

मैक्रो प्रकार या मैक्रो एनोटेशन (http://scalamacros.org/future.html) के साथ यह बहुत सरल होना चाहिए। जैसे ही हम 2.10.0-फाइनल जारी करते हैं, हम मैक्रोज़ के इन नए स्वादों पर काम करने जा रहे हैं, लेकिन ईटीए की भविष्यवाणी करना मुश्किल है। शायद 2012 की सर्दी - 2013 की वसंत।

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