В выходные я начал играть со Свифт. Я пытаюсь построить калькулятор, как приложение. Поэтому я хочу смоделировать дерево выражений.Быстрое компилятор компилятора, где статья
Весь пакет быстрого компилятора/xcode кажется очень неустойчивым. Я продолжаю рушиться каждые несколько минут. Вот почему я хотел бы знать, ошибочен ли мой код или просто компилятор работает неправильно.
Эти два протокола компиляции тонкой
protocol BinaryOperator {
typealias LeftType
typealias RightType
typealias ResultType
func apply(left: LeftType, right: RightType) -> ResultType
}
protocol UnaryOperator {
typealias SourceType
typealias ResultType
func apply(SourceType) -> ResultType
}
Но добавив следующий класс сбои компилятора с ошибкой сегментации на первой линии класса. Я подозреваю, что это вызвано предложением where, потому что, если я его удалю, компилятор больше не сбой, но он все еще не компилируется из-за несоответствий типа.
class BinaryExpression<O:BinaryOperator, L:Expression, R:Expression
where L.ResultType==O.LeftType, R.ResultType==O.RightType> : Expression {
typealias ResultType = O.ResultType
let op : O
let lhs : L
let rhs : R
init(op o : O, left : L, right: R) {
op = o
lhs = left
rhs = right
}
func eval() -> ResultType {
let left : O.LeftType = lhs.eval()
let right : O.RightType = rhs.eval()
return op.apply(left, right: right)
}
}