scala macros - Liftable for function literal -


क्या एक कार्यात्मक शब्दशः (2.11 के साथ) लिफ्ट योग्य है? यदि मेरे पास

  मामला वर्ग का सत्यापनकर्ता [टी] (निश्चय: टी = & gt; बूलियन) वैल की परिभाषा = (s: स्ट्रिंग) = & gt; S.startsWith ("हाय")   

फिर मैं predicate भी quasiquote करने में सक्षम होना चाहता हूँ:

  q "नया सत्यापनकर्ता ($ वर्डिकेट) "  

मुझे आश्वस्त था कि एक अधोरेखण के साथ एक लिफ्ट योग्य बनाने के लिए लेकिन यह थोड़ा बहुत आशावादी था:

  अंतर्निहित def भारप्रतिक्रिया [टी: लिफ्ट योग्य] (f: T = & gt; बूलियन) = लिफ्ट योग्य [T = & gt; बूलियन] {एफ = & gt; Q "$ f (_)"}   

मुझे यह देखने से पता नहीं चला था कि मैं इसे कैसे हल कर सकता हूं।

इसे देखने का दूसरा तरीका:

कहें कि मैं मैक्रो के साथ समय संकलित करने पर निम्न वर्ग से उदाहरण बनाना चाहता हूं:

  सार वर्ग कक्षा के साथ Validity {val predicate: String = & gt;   

और मैं कहीं और एक वैरिएबल वैल्यू के रूप में एक कार्यात्मक शब्दशः प्राप्त करता हूं:

  val predicate = (s: स्ट्रिंग) = & gt; S.startsWith ("हाय")   

तब मैं बस उस वेरिएबल को निर्माण में क्वैसिक्ट करना चाहता हूं:

  q "" "नया क्लासविथ वैधता {val predicate = $ Predicate // अन्य सामान ...} "" "  

लेकिन यह मुझे यह त्रुटि देता है:

  त्रुटि: (46, 28) कर सकते हैं स्ट्रिंग = & gt; बूलियन, लिफ्ट योग्य [स्ट्रिंग = & gt; बूलियन]   

आम तौर पर मैं केवल एक कस्टम प्रकार के लिए ऐसा गहन लिफ्ट योग्य बना सकता हूं। लेकिन मुझे एक कार्यात्मक शब्दशः के लिए ऐसा करने का कोई तरीका नहीं मिला है। क्या ऐसा करने का कोई तरीका है या फिर मुझे इसे दूसरी तरफ देखने की जरूरत है?

समझें, आप एक फ़ंक्शन से एक सार सिंटैक्स पेड़ तक जाने की कोशिश कर रहे हैं जो अपने स्रोत कोड का प्रतिनिधित्व करता है (ताकि इसे मैक्रो विस्तार में दिखाया जा सकता है) यह एक लगातार चीज है जो लोग अनुरोध करते हैं (जैसे कि यह अक्सर डीएसएल में आता है), लेकिन हमारे वर्तमान मैक्रो प्रणाली में इसे प्राप्त करने का कोई सीधा तरीका नहीं है।

इस समय आप इसके बारे में क्या कर सकते हैं AST को स्पष्ट रूप से सहेजते समय फ़ंक्शन घोषित करते हैं और फिर लोड करते हैं और इसे अपने मैक्रो में उपयोग करते हैं ऐसा करने का सबसे सुविधाजनक तरीका एक और मैक्रो के माध्यम से होता है: एक मैक्रो एनोटेशन लिखने की कल्पना भी हो सकती है जो समान लाइनों पर काम करेगी।

प्रोजेक्ट पैलेडियम में, संकलित संकलित कार्यक्रमों के लिए टाइप -केक्ड पेड़ों को बचाने की एक योजना है। इसका मतलब यह है कि सबसे अधिक सीधी एपीआई होगी, उदा। वृक्ष (ख़तरेज़) जो स्वचालित रूप से विवरणाम के स्रोत के साथ सार सिंटेक्स पेड़ वापस करेगा लेकिन यह निश्चित रूप से पत्थर में कुछ सेट नहीं है - हम देखेंगे कि यह कैसा चला जाता है, और मैं इस साल के स्कैलाइड के दौरान प्रगति पर वापस रिपोर्ट करूंगा।

Comments

Popular posts from this blog

asp.net - Procedure or function "Procedure name" expects a parameter "Param name" which was not supplied occurs rarely -

c# - The item with identity 'Id' already exists in the metadata collection. Parameter name: item -

c++ - Redefined variable in the other module -