2013-10-10 3 views
2

Я хочу создать простой DSL объявить деревья:Как реализовать простую DSL для объявления деревьев в Scala?

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

Но я думаю, что это немного более интуитивным использовать фигурные скобки, потому что они напоминают иерархическую декларацию классов в ООП.

Любые рекомендации, чтобы заставить его работать? Изменение DSL также допустимо (этот синтаксис не является строгим, это только то, что мне пришло в голову).

+0

'{Node (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) } 
} 
Смежные вопросы