/ / Quasiquote शाब्दिक के रूप में लेने के बजाय पेड़ की सामग्री की व्याख्या करें - scala, प्रतिबिंब, scala-quasiquotes

Quasiquote शाब्दिक - स्कैला, प्रतिबिंब, स्कैला-quasiquotes के रूप में लेने के बजाय पेड़ सामग्री की व्याख्या

क्या आप बता सकते हैं कि नीचे दिए गए स्काला क्यूसिकोट के दो उपयोग अलग-अलग आउटपुट क्यों देते हैं 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)।