2016-08-02 4 views
0

Я преподавал другу о программировании, и мне было трудно убедить их, что a = b и b = a - это две разные вещи.Пример языка программирования, который остается ассоциативным?

В конце концов я нашел правильные слова для описания (right associative), которые заставили меня думать.

Существуют ли какие-либо языки программирования, которые являются ассоциативными? Я никогда не видел языка, где:

a = b приводит к тому, что значение b устанавливается равным значению a.

+2

Я думаю, что ваш вопрос вводит в заблуждение. Вы спрашиваете о ассоциативности присваивания, но продаете свой вопрос как ассоциативность языка, что бы это ни значило (я считаю, что это ничего не значит.) –

+0

@LittleAlien, как бы вы прояснили вопрос? Из того, что я видел, все операторы на каждом языке заданы как правые ассоциативные. Я думал, что может быть язык, который был написан, чтобы быть ассоциативным. –

+1

Нетрудно узнать, что есть операции, которые не являются правильными ассоциативными. Даже по ссылке, которую вы опубликовали, мы читаем о неассоциативных операторах и видим ссылку на таблицу приоритетов на языке C с ассоциативностью. Здесь вы найдете левые и правые ассоциативные операторы. Вы не найдете никакого «правильного ассоциативного языка» в Google. Вы только [выбрали одного оператора и распространили его ассоциативность на все операторы] (http://www.youtube.com/watch?v=s7MTM4BKZ_E). Поскольку нет RA-языков, это заставило меня подумать, что вы спрашиваете об операторе назначения LA. –

ответ

0

Если мы говорим о Operator associativity мы фактически должны рассмотреть два типа associativity: side_associative (например =) или non-associative (например ==), поскольку это не имеет никакого значения для машины, если получить это линия слева справа или справа налево.

Там нет таких языков программирования, которые первоначально left associative, но некоторые из них позволяют это с помощью перегрузки операторов и некоторых (например, R) позволит как: -> и <-.

Я считаю, что ему никто не понравится в Европе, но на Ближнем Востоке он может быть прекрасен. Я могу себе представить, что есть IDE s, которые переключают правую сторону с левой стороны, но в конце компиляторы написаны по-европейски.

+0

«Неассоциативный» не означает, что не имеет значения, читается ли он справа или слева. В зависимости от контекста это может означать, что оператор не имеет ассоциативного свойства (т. Е. '(A op b) op c' не эквивалентен' op (b op c) ') (как используется [здесь] (https: //en.wikipedia.org/wiki/Associative_property#Non-associativity)) или что он не является ни левым, ни право-ассоциативным (т. е. множественное использование оператора всегда должно быть заключено в скобки) - как используется [здесь] (https://en.wikipedia.org/wiki/Operator_associativity#Non-associative_operators). – sepp2k

2

Я так не верю. Хотя вы всегда можете перегрузить оператор присваивания и вызвать полное замешательство внутри вашего C++.

1

R имеет как <-, так и -> заданные операторы назначения.

> b <- 42 
> b -> a 
> a 
[1] 42 
4

Вы неправильно поняли ассоциативность. Оператор op ассоциативен, если (a op b) op c эквивалентен a op (b op c). Для операторов, которые не являются ассоциативными, становится актуальным то, означает ли a op b op c для первого или последнего. Таким образом, мы различаем левоассоциативные операторы, где это (a op b) op c, и право-ассоциативные операторы, где это a op (b op c).

Большинство операторов на большинстве языков являются лево-ассоциативными. Возьмем, например, -: a - b - c эквивалентен (a - b) - c на большинстве языков, а не a - (b - c).

Оператор присваивания является исключением из того, что (a = b) = c, как правило, не является законным (так как вы не можете назначить результат задания). Таким образом, в большинстве языков a = b = c эквивалентно a = (b = c). Заметным исключением является Python, где a = b = c не ассоциируется вообще и является просто незаконным.

Ничего из этого не имеет отношения к разнице между a = b и b = a. Поскольку это связано только с одним использованием оператора =, ассоциативность вообще не влияет на это. Скорее соответствующее имущество commutativity: Оператор op является коммутативным, если a op b равнозначно b op a. Я не знаю ни одного языка, где назначение является коммутативным, и я не знаю, как это может быть.

Понятия, такие как левая коммутация или право коммутативность, не существуют. Насколько я знаю, нет никакого вопроса для вопроса: «a = b присваивает ba или наоборот?» - это только часть семантики оператора присваивания.