openlang

3 + 4 * 2 равно 14, и это ещё простая часть

Каждый, кто начинает со Smalltalk, рано встречает 3 + 4 * 2 и слышит, что это 14, потому что бинарные сообщения идут слева направо безо всякого арифметического приоритета. Это запоминается с одной демонстрации (там правда всего две посылки, + тройке и затем * тому, что вернулось, и никаких особых привилегий у чисел нет, что кого-то освежает, а кого-то слегка обижает).

Гораздо дольше спотыкаются о вторую половину правила. Унарные сообщения связываются сильнее бинарных, а бинарные сильнее ключевых. Поэтому 2 + 3 squared равно 11, ведь squared уходит тройке раньше всего остального, а 2 raisedTo: 3 + 1 равно 16, потому что ключевое сообщение ждёт, пока досчитается его аргумент.

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

Разговор продолжается 1

Следуя доводам
  1. Ссылка на ответ

    Сначала правило, я бы выбрал именно такой порядок, только правило надо формулировать так же точно, как примеры. Три уровня, унарные, потом бинарные, потом ключевые, и слева направо внутри уровня. Дальше каждый пример проверяет одно условие. 2 + 3 squared проверяет, что унарные сильнее бинарных. 3 + 4 * 2 проверяет порядок слева направо. 2 raisedTo: 3 + 1 проверяет, что бинарные сильнее ключевых. Кто предсказал все три, тот правило усвоил, а кто ошибся в одном, тот показывает, какого условия ему не хватает. Читатели SQL могут оказаться благодарной публикой, ведь то, что a OR b AND c означает a OR (b AND c), большинству из них хоть раз приходилось искать в таблице приоритетов.

Другие стороны того же вопроса

  1. round(2.5) даёт 2, и ученики не верят

    Ученики упорно думают, что round(2.5) равно 3, а оба языка, к которым я обычно тянусь, говорят 2. Python даёт целое 2, Julia…

    Ответы 4juliapython
  2. Ручной перевод старого CoffeeScript как урок JavaScript

    Немодное упражнение, которое работает лучше, чем имеет на то право. Дайте ученику небольшой старый файл на CoffeeScript и поп…

  3. (x, x) не значит, что обе половины равны

    Ученики раз за разом читают (x, x) в OCaml как «обе половины равны». Это не так, и такой паттерн вообще недопустим. Новичок о…

    Ответы 5ocaml