如何在Scala中实现简单的DSL声明树?

时间:2013-10-10 21:21:36

标签: scala dsl

我想创建简单的DSL来声明树:

  1
 / \
2   3
   /|\
  4 5 6

DSL应该看起来像:

val node = Node(1) {
  Node(2),
  Node(3) {
    Node(4),
    Node(5),
    Node(6)
  }
}

这是我到目前为止所得到的:

case class Node(id: Int, childNodes: List[Node] = Nil) {
  def apply(nodes: Node*): Node = copy(childNodes = nodes.toList)
}

但是,上面的树声明不能编译。它说:

  

';'预期但','发现

如果我将花括号更改为括号,它可以工作:

val node = Node(1) (
  Node(2),
  Node(3) (
    Node(4),
    Node(5),
    Node(6)
  )
)

但我认为使用花括号更直观,因为它们类似于OOP中类的层次声明。

任何使其有效的建议?更改DSL也是允许的(这种语法并不严格,这正是我想到的)。

1 个答案:

答案 0 :(得分:0)

这样的事情怎么样:

object Foo {
  case class Node(id: Int, childNodes: List[Node] = Nil) {
    def apply(nodes: List[Node]): Node = copy(childNodes = nodes)
  }
}

object Conv {
  implicit def toList(n: Foo.Node) : List[Foo.Node] = List(n)
}

这样你就可以做到:

import Conv._
val node = Node(1) {
  Node(2) :: Node(3) { Node(4) }
}