2015-09-24 5 views
0

Я пытаюсь создать BNF-подобную DSL в Swift. В Scala gll-combinators имеет хороший подход:Как определить рекурсивные структуры данных в Swift

lazy val expr: Parser[Any] = (
    "(" ~ expr ~ ")" ^^ { _ + _ + _ } 
    | "" 
) 

Это создает парсер, который ссылается на себя.

Когда я пытаюсь сделать то же самое в Swift (используя lazy var в классе или @autoclosure в функции), я получаю ошибку «Переменная, используемая в пределах своего собственного начального значения».

В простом примере

class Node { 
    private var node: Node 
    init(node: Node) { self.node = node } 
} 

Я хочу, чтобы создать узел с его членом node указывая на self.

lazy var node = Node(node) // error 

Есть ли способ вокруг?

+1

Пожалуйста, покажите некоторый фактический код Swift и объясните, что вы хотите с ним сделать. – matt

ответ

0

Итак, вы хотите определить класс, в котором свойство ссылается self?

Возможно, что-то вроде этого?

class Node { 
    private var node: Node! 

    init(node: Node) { 
     self.node = node 
    } 

    init() { 
     self.node = self 
    } 
} 

Теперь вы можете написать:

let node = Node() 

я должен был сделать node собственности необязательно, чтобы сделать эту работу.

Надеюсь, это поможет.

+0

Да, но я бы хотел найти более удобный синтаксис, чтобы описать сложные структуры также легче. Но я думаю, мне понадобится этот двухэтапный подход. – Tali

+0

Особый вывод типа больше не работает при разбиении на распределение и присвоение. У моего реального «Узла» есть параметры типа, и теперь я должен их явно указывать. – Tali

Смежные вопросы