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