4

У меня есть раздел об операторах в The Ruby Programming Language, и это заставило меня задуматься о ассоциативности операторов. Кстати, это не вопрос Ruby - он применим ко всем языкам.Почему разные операторы имеют различную ассоциативность?

Я знаю, что операторы должны ассоциироваться так или иначе, и я вижу, почему в некоторых случаях один из способов был бы предпочтительнее другого, но я изо всех сил стараюсь увидеть большую картину. Существуют ли некоторые критерии, которые используют разработчики языка, чтобы решить, что должно быть слева направо и что должно быть справа налево? Есть ли в некоторых случаях, когда это «имеет смысл» для того, чтобы это было одним способом над другими, и в других случаях, когда это просто произвольное решение? Или есть какой-то грандиозный дизайн за всем этим?

ответ

7

Обычно это так синтаксис "естественный":

  • Рассмотрим x - y + z. Вы хотите, чтобы это было слева направо, так что вы получите (x - y) + z, а не x - (y + z).
  • Рассмотрите a = b = c. Вы хотите, чтобы это было справа налево, так что вы получите a = (b = c), а не (a = b) = c.

Я не могу придумать пример того, где выбор, кажется, был сделан «произвольно».

Отказ от ответственности: Я не знаю Ruby, поэтому мои примеры выше основаны на синтаксисе C. Но я уверен, что эти же принципы применяются и в Ruby.

+0

Спасибо. Вопрос был не в том, что касается Руби - именно это и заставило меня начать думать об этом. – Skilldrick

0

Большинство ассоциаций операторов в comp sci вырезано непосредственно из математики. В частности, символическая логика и алгебра.

4

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

Кстати, левая/правая ассоциативная означает то же, что и левая/правая-рекурсивная. Слово ассоциативное - это математическая перспектива, рекурсивная алгорихма. (см. «end-recursive» и посмотрите, где вы пишете большинство скобок.)

+0

+1 для долгосрочной минимизации скобок – Museful