2013-02-04 25 views
12

वापस जब प्रतिबिंब अभी भी प्रारंभिक था, स्कैला 2.10.0 मील के पत्थर के दिनों में, मैं asked a question के बारे में आरईपीएल से कोड स्निपेट के पेड़ों को देखने के लिए इसका उपयोग कैसे कर सकता हूं। उत्कृष्ट उत्तर मैंने पूछा उससे आगे चला गया, और दिखाया कि कैसे पेड़ों का विश्लेषण और मूल्यांकन करने के लिए उनका उपयोग किया जा सकता है, इसलिए मैं आगे बढ़ गया और उस छोटी परियोजना पर इसका उपयोग करने की कोशिश की जो मैं आज जा रहा था।आरईपीएल परिभाषाओं को देखने के लिए मैं स्कैला टूलबॉक्स कैसे प्राप्त कर सकता हूं?

दुर्भाग्य से, कोड पार्स और इस तरह से किसी भी आरईपीएल परिभाषा को देखने के लिए प्रतीत नहीं होता है का मूल्यांकन:

scala> val x = 1 
x: Int = 1 

scala> import scala.tools.reflect.ToolBox 
import scala.tools.reflect.ToolBox 

scala> val tb = scala.reflect.runtime.universe.runtimeMirror(
    getClass.getClassLoader).mkToolBox() 
tb: scala.tools.reflect.ToolBox[reflect.runtime.universe.type] = ... 

scala> tb.eval(tb.parse("x")) 
scala.tools.reflect.ToolBoxError: reflective compilation has failed: 

not found: value x 

वहाँ एक रास्ता यह आरईपीएल पर किए गए परिभाषाओं पहचान करने के लिए प्राप्त करने के लिए है?

+0

आरईपीएल में नहीं होने के विरोध में? मैंने एक एसबीटी परियोजना में सटीक एक ही कोड (https://gist.github.com/jedesah/5812481) लिखा और मुझे आरपीएल में वही व्यवहार मिलता है। यदि इस तरह टूलबॉक्स किसी अन्य संदर्भ में काम करता है, तो मुझे जानना बहुत उत्सुक होगा। टूलबॉक्स में – jedesah

+0

@UndercoverAgent कोड में "रूट" से पहुंचने वाली किसी भी चीज़ तक पहुंच है - अन्यथा यह काफी बेकार होगा। यदि आपने दिखाया है, तो वह चर "रूट" पर उपलब्ध नहीं था। –

+0

बेकार एक मजबूत शब्द है, इसका इस्तेमाल स्वयं निहित पेड़ों का मूल्यांकन करने के लिए किया जा सकता है। किसी भी मामले में, आप इस छोटी परियोजना पर काम कर रहे हैं, क्या यह खुला स्रोत है? मुझे बाहरी (पेड़ से ही) परिभाषाओं तक पहुंचने का एक उदाहरण देखना अच्छा लगेगा, मुझे यकीन नहीं है कि आप "रूट" से उन तक पहुंचकर क्या मतलब रखते हैं। – jedesah

उत्तर

6

हाल ही में मैंने इसे समर्थन प्रकार मैक्रोज़ बनाने की कोशिश करते समय प्रतिलिपि में खोला, इसलिए मैं यह समझाने के लिए सुसज्जित हूं कि यह क्यों काम नहीं करता है। इसे काम करने के लिए अगला कदम होगा :)

मुझे पता है कि आप जानते हैं कि प्रत्येक स्निपेट को प्रतिलिपि बनाने से पहले कुछ बॉयलरप्लेट में लपेटा जाता है। इसलिए एक्स एक अजीब नाम वाले पैकेज में नेस्टेड-नेस्टेड-नेस्टेड ऑब्जेक्ट में फ़ील्ड होने के समाप्त होता है।

जाहिर है, प्रतिलिपि सभी परिभाषित प्रतीकों का ट्रैक रखती है और उसके बाद उत्पन्न बॉयलरप्लेट के साथ आवश्यक आयात इंजेक्ट करती है। इसलिए बाद की रेखाएं देख सकती हैं कि एक्स अयोग्य है। इसके विपरीत, टूलबॉक्स बस प्रतिलिपि के क्लासलोडर का पुन: उपयोग करते हैं, लेकिन आयात के बारे में कुछ भी नहीं करते हैं, इसलिए विफलता।

किसी भी तरह से एक प्रतिलिपि का प्रतिनिधित्व करने वाले ऑब्जेक्ट को प्राप्त करने के लिए एक वर्कअराउंड होगा, इसे परिभाषित प्रतीकों के बारे में पूछें और फिर उस टूल में संबंधित आयात उत्पन्न करें जो आप टूलबॉक्स पर फ़ीड करते हैं। यदि आप टिकट दर्ज करते हैं, तो मैं 2.10.1 कोड फ्रीज पागलपन समाप्त होने के बाद एक वर्कअराउंड को कोड करने का प्रयास करूंगा (माना जाता है, इस सप्ताह का अंत)।

+0

[एसआई -7081] (https://issues.scala-lang.org/browse/SI-7081) –

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

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