यहां एक डिजाइन समस्या है जिसे मैंने बार-बार सामना किया है। मान लीजिए कि आप एक कंपाइलर बना रहे हैं, आप पेड़ों में प्रकार कैसे स्टोर करते हैं?अपरिवर्तनीय, टाइप करने योग्य, पेड़ का डिजाइन
एक सरल Expr
और Type
पदानुक्रम विचार करें, और मान लेते हैं कि Plus
और Equals
बहुरूपी होते हैं (प्लस सिर्फ ||
में बूलियन्स पर, उदाहरण के लिए)।
trait Type
case object BoolType extends Type
case object IntType extends Type
case object Untyped extends Type
trait Expr { var tpe : Type = Untyped }
case class Var(id : String) extends Expr
case class Plus(l : Expr, r : Expr) extends Expr
case class Equals(l : Expr, r : Expr) extends Expr
// ...
आगे मान लें कि मैं जब मैं अभिव्यक्ति पेड़ का निर्माण पहचानकर्ता के प्रकार पता नहीं है, और इसलिए निर्माण के द्वारा प्रकार पता नहीं कर सकते हैं। अब एक ठेठ typechecking समारोह ऐसा दिखाई दे सकता:
def typeCheck(env : Map[String,Type])(expr : Expr) : Expr = expr match {
case Var(id) =>
expr.tpe = env(id)
expr
case Plus(l,r) =>
val tl = typeCheck(env)(l)
val tr = typeCheck(env)(r)
assert(tl == tr)
expr.tpe = tl
expr
// etc.
}
इस बल्कि लिखने के लिए सीधा है, लेकिन दो प्रमुख समस्याओं के साथ आता है:
Expr
रों परिवर्तनशील हैं। कोई भी उत्परिवर्तन पसंद नहीं करता है।- टाइप किए गए और untyped अभिव्यक्तियों को प्रतिष्ठित नहीं किया जा सकता है। मैं एक ऐसा फ़ंक्शन नहीं लिख सकता जिसका हस्ताक्षर निर्दिष्ट करता है कि उसका तर्क एक टाइप की गई अभिव्यक्ति होनी चाहिए।
तो मेरा प्रश्न निम्न है। एक अच्छा तरीका है (मैं कहता हूँ की हिम्मत नहीं डिजाइन पैटर्न) संभवतः untyped पेड़ों को परिभाषित करने के क्या है ऐसा है कि:
- मैं केवल एक बार
Expr
पदानुक्रम परिभाषित करने की जरूरत। - टाइप किए गए और untyped पेड़ों के अलग प्रकार हैं और मैं उन्हें असंगत बनाने के लिए चुन सकते हैं।
संपादित करें: एक और आवश्यकता है कि यह प्रकार के एक असीम और अप्रत्याशित संख्या के साथ प्रकार सिस्टम के लिए काम करना चाहिए है (लगता है: उदाहरण के लिए, case class ClassType(classID : String) extends Type
)।
एक उपयोग उदाहरण बहुत अच्छा होगा। आप अपने सिस्टम में 'टाइप चेक' कैसे लिखेंगे? –
ऐसा लगता है कि यह वही हो सकता है जो मैं ढूंढ रहा था। जैसा कि यूजीन सुझाव देता है, क्या आप शायद दिखा सकते हैं कि आप अपने 'टाइप चेक' फ़ंक्शन को अपनी परिभाषाओं में कैसे अनुकूलित करेंगे? – Philippe
मुझे लगता है कि आपने गलती से भ्रमित नहीं किया है और कुछ भी नहीं। इसके अलावा, कुछ भी नहीं। टाइप, मुझे लगता है कि आपका मतलब कोई नहीं है। – nnythm