क्या आप बता सकते हैं कि नीचे दिए गए स्काला क्यूसिकोट के दो उपयोग अलग-अलग आउटपुट क्यों देते हैं result1
तथा result2
? क्या इसका पुनरुत्पादन संभव है result3
कैसेट का उपयोग कर रहे हैं? यानी एक स्ट्रिंग पार्स सामग्री और इसका मूल्यांकन करेंगे?
import scala.tools.reflect.ToolBox
import scala.reflect.runtime.universe._
val miniSrc = "val lst = (1 to 5).toList ; val sum = lst.foldLeft(0)(_ + _); sum"
val tree1 = q"$miniSrc"
//tree1: reflect.runtime.universe.Tree = "val lst = (1 to 5).toList ; val sum = lst.foldLeft(0)(_ + _); sum"
val tree2 = q"val lst = (1 to 5).toList ; val sum = lst.foldLeft(0)(_ + _); sum"
//tree2: reflect.runtime.universe.Tree =
//{
// val lst = 1.to(5).toList;
// val sum = lst.foldLeft(0)(((x$1, x$2) => x$1.$plus(x$2)));
// sum
//}
val tb = scala.reflect.runtime.currentMirror.mkToolBox()
val result1 = tb.eval(tree1)
//result1: Any = val lst = (1 to 5).toList ; val sum = lst.foldLeft(0)(_ + _); sum
val result2 = tb.eval(tree2)
//result2: Any = 15
val result3 = tb.eval(tb.parse(miniSrc))
//result3: Any = 15
उत्तर:
जवाब के लिए 3 № 1क्या आप बता सकते हैं कि नीचे दिए गए स्काला क्यूसिकोट के दो उपयोग अलग-अलग आउटपुट क्यों देते हैं
result1
तथाresult2
?
miniSrc
एक शाब्दिक है String
और नहीं एक Tree
. q"{$miniSrc}"
लिफ्टों miniSrc
, एक शाब्दिक String
दूसरे में Tree
। लिफ्टिंग मनमाने कोड को पार्स नहीं करता है Tree
, यह बस पेड़ों या अन्य प्रकार के पेड़ों में एक साथ फैलता है। tree1
इसलिए ए है Tree
जिसमें एक शाब्दिक शामिल है String
.
इस उदाहरण को अच्छी तरह से वर्णन करना चाहिए कि पेड़ में एक शाब्दिक स्ट्रिंग को क्यों उठाना चाहिए "किसी भी पार्सिंग को शामिल नहीं करना चाहिए:
scala> val miniSrc = "abc"
miniSrc: String = abc
scala> val tree1 = q"$miniSrc"
tree1: reflect.runtime.universe.Tree = "abc"
tree2
स्वाभाविक रूप से अलग है क्योंकि आप बना रहे हैं Tree
सीधे quasiquotes इंटरपोलर के साथ। इसलिए, result1
सिर्फ एक शाब्दिक स्ट्रिंग है, लेकिन result2
कुछ निष्पादित कोड का परिणाम है tree2
.
क्या इसका प्रजनन संभव है
result3
quasiquotes का उपयोग कर? यानी एक स्ट्रिंग सामग्री को पार्स करना और उसका मूल्यांकन करना?
नहीं, यह पार्सिंग के लिए है। यदि आप मनमाने कोड को क्रासिकोट्स में एक स्ट्रिंग शाब्दिक के रूप में उठाना चाहते हैं, तो आप जरूर इसे पार्स करें Tree
प्रथम। अन्यथा, यह सिर्फ एक शाब्दिक होगा।
scala> val tree1 = q"${tb.parse(miniSrc)}"
tree1: tb.u.Tree =
{
val lst = 1.to(5).toList;
val sum = lst.foldLeft(0)(((x$1, x$2) => x$1.$plus(x$2)));
sum
}
ऐसा नहीं है कि मैक्रोज़ के साथ काम करते समय, आप मैक्रो के उपयोग से पार्स कर सकते हैं Context
। अर्थात्, c.parse
(के बजाय का उपयोग करने का ToolBox
)।