2009-12-26 6 views
12

मैंने कहा "लाइव कोड" क्योंकि मेरा मतलब टेक्स्ट स्रोत फ़ाइलों या स्रोत तारों से नहीं है, लेकिन आंशिक फ़ंक्शन/लैम्बडास से है। (मैं जानता हूँ कि Ruby1.8 के parseTree और सी # LINQ यह कर सकते हैं)क्या मुझे लाइव स्कैला कोड से एएसटी मिल सकता है?

एक partialFunction च पर विचार करें:

val f = (i: Int, j: Int) => (i + j) * 2 

मुझे आशा है कि वहाँ कुछ उपकरण है इस तरह काम करता है:

getBodyAstFrom(f) //=> (Infix('*'), (Infix('+'), Id('i'), Id('j')), Val('2')) 

मैं डॉन ' अर्थपूर्ण चीजों की परवाह नहीं करते हैं (संदर्भ पार्सिंग और implicits बहुत जटिल हैं, और मेरे लिए अनावश्यक), मुझे बस लाइव कोड से सिंटैक्स पेड़ की आवश्यकता है, क्या यह संभव है?

अन्य लोगों के कोड का निरीक्षण करने में समस्या हो सकती है, लेकिन मेरे अपने कोड के बारे में क्या? क्या निम्नलिखित चीजें संभव हैं?

val f = AstFunction(i: Int, j: Int){(i + j) * 2} 
f(5, 6) //=> 22 
f.ast //=> (Infix('*'), (Infix('+'), Id('i'), Id('j')), Val('2')) 

यह कुछ संकलक, hmmmm में हैकिंग ...

उत्तर

17

संकलक अपने आप में एक पुस्तकालय है, जो आप कॉल कर सकते हैं की जरूरत लगती है। वास्तव में, वास्तव में आरईपीएल कैसे काम करता है। लेकिन जब आप कोड की एक स्ट्रिंग के लिए पेड़ (विभिन्न चरणों में) प्राप्त कर सकते हैं, तो आप इसे संकलित कोड के लिए नहीं प्राप्त कर सकते हैं।

बेशक, यदि आप प्रयोगात्मक सामान का उपयोग करते हैं जो कि किसी भी समय बदल सकता है या बस अस्तित्व में रह सकता है। उस मामले में, तुम कोशिश कर सकते हैं:

scala.reflect.Code.lift(f).tree 

और मिलती है:

res17: scala.reflect.Tree = Select(Select(Select(Ident(Field(line26$object,PrefixedType(ThisType(RootSymbol),Class(line26$object)))),Field($iw,PrefixedType(ThisType(Class(line26$object)),Class($iw)))),Field($iw,PrefixedType(ThisType(Class($iw)),Class($iw)))),Method(f,PolyType(List(),List(),AppliedType(PrefixedType(ThisType(Class(scala)),Class(scala.Function2)),List(PrefixedType(ThisType(Class(scala)),Class(scala.Int)), PrefixedType(ThisType(Class(scala)),Class(scala.Int)), PrefixedType(ThisType(Class(scala)),Class(scala.Int))))))) 

चाहे कि मदद करता है या नहीं ... आप मिगुएल गार्सिया के "The Scala Compiler Corner" जाँच करना चाहते हो सकता है।

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

  • कोई संबंधित समस्या नहीं^_^