2013-11-15 3 views
2

Я пытаюсь смоделировать DSL в Scala. (Я очень новичок в Scala, поэтому я мог бы пропустить что-то тривиальное, и в этом случае извинения). DSL поддерживает очень простую систему типов, где объекты, называемые «Термины», могут иметь тип, который по умолчанию расширяет Object или может распространять другие типы, которые по своему праву в конечном итоге расширяют другой тип или Object.Моделирование иерархии типов для DSL в Scala

Я пытаюсь смоделировать этот тип иерархию в Scala, используя тематический класс:

case class TermType(name: String, superType: TermType) 

Однако, я хочу, чтобы иметь возможность поддержать дело «по умолчанию» (тот, где тип просто расширяет «Object '), без указания типа супер, поэтому что-то вроде:

//the following does not work, just illustrating what I want to achieve 
case class TermType(name: String, superType: TermType = new TermType("Object", ???)) 

Не уверен, что это правильный подход. Я хочу избежать пометок нулей или подобных вещей. Я не знаю, будет ли путь Option в некотором роде лучше (если он вообще работает).

Как лучше всего это сделать?

ответ

3

, например:

sealed abstract class TermType 
case class TermTypeSimple(name: String) extends TermType 
case class TermTypeWithParen(name: String, parent: TermType) extends TermType 

Другой способ:

case class TermType(name: String, superType: Option[TermType] = None) 

С обыкновений:

TermType("Hi") 
TermType("Buy", Some(TermType("Beer")) 
+0

Спасибо, второй случай намного чище. Можно ли каким-либо образом поменять его на TermType («Объект») вместо «Нет»? но объект SuperType объекта должен быть None. – jbx

+0

Основываясь на том, что вы предложили, было бы что-то в этом смысле? 'case class TermType (name: String, superType: Option [TermType] = Some (TermType (« Object », None)))' – jbx

+0

Я лично не вижу преимуществ при создании умолчаний. Еще один шаг вперед в иерархии, но может быть вашим приложение необходимо по умолчанию на «сложных» листовых узлах. Это будет довольно легко изменить позже, если вы не будете полностью удовлетворены, поэтому выберите один подход и поработайте над ним :). –

Смежные вопросы