आइए कहें कि मैं एफ # में किसी डोमेन-विशिष्ट भाषा के लिए एक पार्सर बना रहा हूं।एफ # डिजाइन पैटर्न
मैं भाव का प्रतिनिधित्व करने के लिए एक भेदभाव संघ द्वारा निर्धारित किए गए:
type Expression =
| Equality of Expression*Expression
| NonEquality of Expression*Expression
| Or of Expression*Expression
| And of Expression*Expression
| If of Expression*Expression
| IfElse of Expression*Expression*Expression
| Bool of bool
| Variable of string
| StringLiteral of string
अब, मैं प्रकार Expression
के एएसटी का निर्माण किया है और इसके लिए कोड उत्पन्न करने के लिए चाहते हैं। मेरे पास एक ऐसा फ़ंक्शन है जो एक अभिव्यक्ति पर टाइप अनुमान और प्रकार जांच करता है।
यह
let rec InferType expr =
match expr with
| Equality(e1,e2) -> CheckTypes (InferType e1) (InferType e2)
| Or(e1,e2) -> CheckTypes (InferType e1) (InferType e2)
| And(e1,e2) -> CheckTypes (InferType e1) (InferType e2)
...
तरह परिभाषित किया है और मैं एक और समारोह कोड जो एक समान पद्धति का अनुसरण करता उत्पन्न करने के लिए है: एक अभिव्यक्ति ले लो, संघ में प्रत्येक आइटम के लिए पैटर्न मिलान बयान लिखें।
मेरा प्रश्न है: क्या यह एफ # में ऐसा करने का बेवकूफ तरीका है?
ऐसा लगता है कि संघ के प्रत्येक सदस्य ने अपने InferType
और GenerateCode
को स्थानीय रूप से परिभाषित किया है तो यह क्लीनर होगा।
अगर मैं सी # उपयोग कर रहे थे, मैं InferType
और GenerateCode
के लिए आभासी तरीकों के साथ Expression
बुलाया कुछ सार आधार वर्ग को परिभाषित करने और फिर उन्हें प्रत्येक उपवर्ग में ओवरराइड करेगी।
क्या ऐसा करने का कोई और तरीका है?
धन्यवाद - यह वह उत्तर था जिसे मैं ढूंढ रहा था । –