2013-10-10 26 views
2

我要創建簡單的DSL申報樹:如何實現在Scala中聲明樹的簡單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

'{節點(4),節點(5),節點(6)}' - 例如語法並不代表Scala中的任何東西,它顯然不正確。 – ghik

+0

只要堅持括號,你可能會發現有用的閱讀本:http://stackoverflow.com/questions/4386127/what-is-the-formal-difference-in-scala-between-braces-and-parentheses-and -什麼時候 –

回答

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) } 
}