2012-02-14 9 views
5

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

F := (x) -> x + 1 
F(1) # returns 2 

मैं एक समारोह के शरीर भाव का एक अनुक्रम होने के साथ एक समस्या नहीं मिला है - पिछले अभिव्यक्ति के मूल्य हमेशा लौटा दिया जाता है , और मैंने यह सुनिश्चित कर लिया है कि दुभाषिया में सभी मामले कम से कम कुछ एक साइड इफेक्ट के रूप में लौटते हैं। अब मैं टर्नरी ऑपरेटर (? :) को लागू करने की कोशिश कर रहा हूं। अभिव्यक्ति पेड़ मैं इस तरह दिखता है प्रतिपादन कर रहा हूँ:

work = Expression.IfThenElse(         
    Expression.IsTrue(Expression.Convert(work, typeof(Boolean))), 
    trueExp, 
    falseExp); 

जहां trueExp और falseExp दोनों वैध अभिव्यक्तियां हैं।

समस्या यह प्रतीत होती है कि IfThenElse अभिव्यक्ति कोई मान नहीं लौटाती है, इसलिए मूल रूप से TrueExp और falseExp अभिव्यक्ति पेड़ बना रहे हैं, तो IfThenElse अभिव्यक्ति का अंतिम परिणाम हमेशा शून्य होता है। रनटाइम फ़ंक्शन बनाने और स्पष्ट रूप से इसे कॉल करने से कम, क्या डीएलआर का उपयोग कर टर्नरी ऑपरेटर को लागू करने का कोई तरीका है?

F := (x) -> (x = 1) ? 4 : 5 
F(1) #4 
F(2) #5 

लेकिन अभी यह हमेशा अशक्त रिटर्न: (यानी:।? एक अभिव्यक्ति है कि IfThenElse करता है और सही और गलत खंड में वास्तविक मान देता है)

क्या मैं पार्स करने के लिए आशा है कि कुछ की तरह है जब ऊपर उल्लिखित समस्या की वजह से प्रोग्राम में संकलित किया जाता है।

मैं किसी भी मदद की सराहना करता हूं, यह काफी परेशान है!

उत्तर

14

Expression.IfThenElse एक if (...) ... else ...; निर्माण, टर्नरी ऑपरेटर नहीं है।

त्रिगुट ऑपरेटर Expression.Condition

+0

बिल्कुल सही है! धन्यवाद – Gakidou

+0

क्या अभिव्यक्ति का अनुकरण करना संभव है। अभिव्यक्ति के साथ शर्त। अगर? i.e बदले में 'वापसी? बी: सी' डू 'अगर (जैसा) वापसी बी और वापसी सी; '? –

+0

@zespri: यदि आप जो करना चाहते हैं वह एक मूल्य वापस कर देता है, निश्चित रूप से। उस मामले में वे वही हैं। स्पष्ट रूप से आप ifthenElse * अंदर * एक और अभिव्यक्ति का उपयोग नहीं कर सकते हैं, क्योंकि यह एक बयान है। व्यक्तिगत रूप से मुझे लगता है कि एक वापसी? बी: सी; हालांकि अधिक आसान समझ है। –

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