2010-01-21 13 views
14

के बराबर स्केल स्केल में सी # के अभिव्यक्ति API के बराबर है?सी # के अभिव्यक्ति एपीआई

उदाहरण के लिए, मैं इस तरह एक लैम्ब्डा करना चाहते हैं:

(Foo) => Foo.bar 

और समारोह इसे करने के लिए पारित हो जाता है में "बार" का उपयोग कर सकेंगे।

उत्तर

9

यह स्कैला द्वारा समर्थित नहीं है। ScalaQL: Language-Integrated Database Queries for Scala स्काला में एक LINQ जैसी कार्यप्रणाली में बताता है:

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

सौभाग्य से, स्काला में और स्वयं का करने के लिए भी अभिव्यक्ति पेड़ों के लिए समर्थन जोड़ने के बिना LINQ का एक रूप को लागू करने के लिए पर्याप्त वास्तव में शक्तिशाली है। ऑपरेटर ओवरलोडिंग, अंतर्निहित रूपांतरण का एक संयोजन के माध्यम से, और नियंत्रित कॉल दर-नाम अर्थ विज्ञान, हम ही भाषा में कोई बदलाव किए बिना ही eect प्राप्त करने में सफल रहे हैं ।

+1

हां, लेकिन लेखक ने अपना स्रोत कोड जारी नहीं किया; इसके अलावा, उस पेपर में पूर्ण कार्यान्वयन के लिए आवश्यक कुछ विवरणों की कमी है - वे अपनी लाइब्रेरी का वास्तविक इंटरफ़ेस भी नहीं लिखते हैं। फ्लैटमैप का समर्थन करना (जो कि किसी भी उदाहरण में उपयोग नहीं किया जाता है) उदाहरण के लिए मुश्किल है। – Blaisorblade

+0

मुझे यकीन नहीं है कि यह LINQ करता है सब कुछ लागू करता है, लेकिन सिर्फ यह इंगित करना चाहता था कि Slick उपर्युक्त विधियों का उपयोग करता है। यह अपना खुद का नक्शा, फ़िल्टर, समूहबी, इत्यादि लागू करता है जो नियमित रूप से नियमित स्कैला प्रकारों से एक विशेष प्रतिनिधि प्रकार में डाला जाता है। तो आप 'coffees.filter (_। कीमत> 8.0) .map (_। Name)' कर सकते हैं और यह SQL में बदल जाएगा। [दस्तावेज़ देखें] (http://slick.typesafe.com/doc/2.0.0/introduction.html#lifted-embedding)। – ShawnFumo

1

नहीं, मेरे सर्वोत्तम ज्ञान के लिए।

6

एक प्रायोगिक scala.reflect.Code.lift है जो रुचि का हो सकता है, लेकिन संक्षिप्त उत्तर नहीं है, स्कैला को किसी भी रूप में एएसटी तक पहुंच नहीं है (अभिव्यक्ति पेड़ सी # एएसटी का सबसेट है)।

2

यह मेरे लिए बिल्कुल स्पष्ट नहीं है कि आप क्या चाहते हैं। यदि आप एक समारोह है कि एक क्षेत्र के लिए एक गेटर रिटर्न चाहते हैं, आप ऐसा कर सकते काफी आसानी से:

class Holder(var s: String) { } 
class StringSaver(f: Holder => (() => String), h: Holder) { 
    val getter = f(h) 
    def lookAtString = getter() 
} 

val held = new Holder("Hello") 
val ss = new StringSaver((h: Holder) => (h.s _) , held) 
println(ss.lookAtString) 
held.s = "Bye now" 
println(ss.lookAtString) 

कुंजी के माध्यम से (h.s _) एक समारोह में गेटर h.s चालू करने के लिए है।

+0

.NET में इसका उपयोग किया जाने वाला एक तरीका एमवीसी टेम्पलेट हेल्पर्स में है। टेम्पलेट मॉडल के प्रकार को जानता है, उपयोगकर्ता कहें (जिसमें पहला नाम है)। तो आप 'helpers.textBoxFor (m => m.firstName)' कर सकते हैं। यह न केवल डेटाबेसिंग करता है बल्कि संपत्ति के नाम का उपयोग करता है, ' 'जैसे कुछ बना रहा है। इस तरह आपको कोई जादू तारों की आवश्यकता के साथ टाइप सुरक्षा (और समर्थन को पुन: सक्रिय करना) मिलता है। – ShawnFumo

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