/ / Як визначити рекурсивні структури даних у Swift - swift

Як визначити рекурсивні структури даних у Swift - swift

Я намагаюся створити BNF-подібний DSL у Swift. У Скалі gll-комбінатори має приємний підхід:

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

Це створює синтаксичний синтаксичний аналізатор, який посилається сам.

Коли я намагаюсь зробити те ж саме в Swift (використовуючи a lazy var в класі або @autoclosure в функції), я отримую помилку "Змінні використані в межах власного початкового значення".

У простому прикладі

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

Я хочу створити вузол з його учасником node вказуючи на self.

lazy var node = Node(node) // error

Чи є шлях навколо?

Відповіді:

0 для відповіді № 1

Таким чином, ви хочете визначити клас, де властивість має посилання self?

Може, щось подібне?

class Node {
private var node: Node!

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

init() {
self.node = self
}
}

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

let node = Node()

Мені довелося зробити node майно факультативно, щоб зробити цю роботу.

Сподіваюся, це допоможе.