Я разрабатываю свой собственный язык программирования (называемый Lima, если вам интересно его на www.btetrud.com), и я пытаюсь понять, как реализовать перегрузка оператора. Я решаю привязать операторы к конкретным объектам (это язык на основе прототипов). (Это также динамический язык, где 'var' похож на 'var' в javascript - переменная, которая может содержать любой тип значения).
Например, это может быть объект с переопределенным оператором +:
x =
{ int member
operator +
self int[b]:
ret b+self
int[a] self:
ret member+a
}
Надеюсь, это довольно очевидно, что он делает. Оператор определен, когда x является как правым, так и левым операндом (для обозначения используется self
).
Проблема в том, что делать, когда у вас есть два объекта, которые определяют оператор таким открытым способом, как этот. Например, что вы делаете в этом сценарии:
A =
{ int x
operator +
self var[b]:
ret x+b
}
B =
{ int x
operator +
var[a] self:
ret x+a
}
a+b ;; is a's or b's + operator used?
Таким образом, простой ответ на этот вопрос - «хорошо, не делайте двусмысленных определений», но это не так просто. Что, если вы включите модуль, который имеет объект типа A, а затем определите объект типа B.
Как создать язык, защищающий от перехвата другими объектами того, что вы хотите делать с вашими операторами?
В C ++ перегрузка операторов определена как «члены» классов. Как C ++ справляется с подобной двусмысленностью?