आप समान बाध्य नाम का संदर्भ देने वाले अभिव्यक्तियों को कैसे ढूंढते और फिर से लिखते हैं? उदाहरण के लिए, अभिव्यक्तिदो अभिव्यक्तियों को समान बाध्य नाम से संदर्भित करने के आधार पर आप एक पुनर्लेखन पास कैसे बनाते हैं?
let xs = ...
in ...map f xs...map g xs...
दोनों अभिव्यक्ति map f xs
और अभिव्यक्ति map g xs
में एक ही बाध्य नाम, अर्थात् xs
को देखें। क्या कोई मानक कंपाइलर विश्लेषण है जो हमें इस स्थिति की पहचान करने देगा और दो map
अभिव्यक्तियों को फिर से लिखने देगा।
let xs = ...
e = unzip (map (f *** g) xs)
in ...fst e...snd e...
मैं पेड़ के ट्रैवर्सल के मामले में समस्या के बारे में सोच रहा हूं। उदाहरण के लिए एएसटी दिया:
data Ast = Map (a -> b) -> Ast -> Ast
| Var String
| ...
हम इस मामले का पता लगाने के एक पेड़ ट्रेवर्सल लिखने के लिए कोशिश कर सकते हैं, लेकिन यह मुश्किल लगता है के बाद से दो Map
नोड्स है कि एक ही Var
का उल्लेख पेड़ में व्यापक रूप से विभिन्न स्थानों पर दिखाई दे सकता है। यह विश्लेषण करना आसान लगता है यदि आप एएसटी में सभी संदर्भों को उलटा करते हैं, इसे ग्राफ बनाते हैं, लेकिन मैं देखना चाहता हूं कि उस दृष्टिकोण के कोई विकल्प हैं या नहीं।