Комбинированные постоператоры? - PullRequest
1 голос
/ 06 октября 2008

Мы все знакомы с операторами до и после приращения, например,

c++;    // c = c + 1
++c;    // ditto

и «комбинированные операторы», расширяющие этот принцип:

c += 5;    // c = c + 5
s .= ", world";    // s = s . ", world"; e.g. PHP

Мне часто требовался «посткомбинированный оператор», который позволял бы:

s =. "Hello ";    // s = "Hello " . s

Очевидно, что это действительно полезно только для некоммутируемых операторов, и значение изменяется от пре- / постинкрементного, даже если синтаксис заимствован.

Вам известен какой-либо язык, предлагающий такого оператора, и почему он не является более распространенным?

Ответы [ 3 ]

3 голосов
/ 06 октября 2008

Основное возражение против приведенного примера - создание двусмысленности:

a=-5;    //'a = -5' or 'a =- 5'?
b=*p;    //'b = *p' or 'b =* p'?
c=.5;    //'c = .5' or 'c =. 5'?

Редактировать: Но нет, я не знаю ни одного языка, который их использует. Предположительно, это потому, что они были исключены из C, откуда большинство других языков получают свои основные операторы.

И да, я хотел бы видеть их на языках, которые я использую.

2 голосов
/ 06 октября 2008

Комбинированные операторы 'op =' являются сокращением для var = var op predicate, но op не должен быть чем-то конкретным. Оператор '.' является кратким обозначением для операции «добавления» на нескольких языках, но ничто не мешает вам определить операцию «добавления» - или даже изменить добавление на предварительное - на любом языке, который позволяет перегрузить оператор с любым типом данных, с которым вы хотите работать (или любым другим объектом, который вы могли бы использовать для хранения этих данных в противном случае). Если вы хотите сделать textvar /= newtext сокращение для textobj = textobj->prepend(newtext), вас ничто не остановит.

Тем не менее, вы, вероятно, никогда не должны этого делать, поскольку нет способа изменить существующего оператора, не вызывая кучу путаницы. Значительно проще (и понятнее) изменить порядок выписок, чтобы вы могли переходить слева направо или использовать определенную функцию, такую ​​как unshift, для добавления слов без какой-либо двусмысленности.

0 голосов
/ 06 октября 2008

Ни о чем я не знаю, и я не думаю, что это произойдет, поскольку это метамета-команда.

Для пояснения, исходные операторы (для чисел) пришли из C, где они напрямую сопоставлены с операциями машинного кода. Это позволило программисту выполнить оптимизацию, поскольку ранний компилятор этого не делал.
Таким образом,

x=x+1;

и

x+=1;

и

x++;

будет генерировать три разных вывода ассемблера.

Теперь добавление + = для строки является мета-командой. Он не сопоставляется с кодом операции, он просто следует и расширяет шаблон.

...