Как устранить неоднозначность в определениях операторов между объектами / классами в языке программирования?

Я разрабатываю свой собственный язык программирования (называемый 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 ++ справляется с подобной двусмысленностью?

6
задан Cœur 19 March 2017 в 02:19
поделиться