2

我想创建简单的 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 也是允许的(这种语法并不严格,这正是我想到的)。

4

1 回答 1

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) }
}
于 2013-10-11T00:12:21.740 回答