Языковая поддержка для связанных операторов сравнения (x <y <z) - PullRequest
19 голосов
/ 03 ноября 2010

A вопрос был опубликован о цепочечных операторах сравнения и о том, как они интерпретируются на разных языках.

Операторы сравнения цепочек означают, что (x < y < z) будет интерпретироваться как ((x < y) && (y < z)) вместо ((x < y) < z).

Комментарии к этому вопросу показывают, что Python, Perl 6 и Mathematica поддерживают операторы сравнения цепочек, но какие другие языки поддерживают эту функцию и почему она не более распространена?

Беглый взгляд на документацию по Python показывает, что эта функция существует по крайней мере с 1996 года. Есть ли причина, по которой другие языки не добавили этот синтаксис?

У статически типизированного языка могут возникнуть проблемы с преобразованием типов, но есть ли другие причины, по которым это не так часто встречается?

Ответы [ 5 ]

12 голосов
/ 03 ноября 2010

Пособие слишком мало, чтобы оправдать усложнение языка.

Вам это не нужно часто, и легко получить тот же эффект с помощью нескольких символов.

9 голосов
/ 04 ноября 2010

Это должно быть более распространенным, но я подозреваю, что это не потому, что это делает синтаксический анализ языков более сложным.

Преимущества:

  • Поддерживает принцип наименьшего удивления
  • Читает, как учат математике
  • Снижает познавательную нагрузку (см. Предыдущие 2 пункта)

Недостатки:

  • Грамматика более сложна для языка
  • Особый случай синтаксического сахара

Почему нет,мои предположения:

  • Язык, который автор (ы) не думал об этом
  • В списке 'приятно иметь'
  • Было решено, что это нене достаточно полезно, чтобы оправдать реализацию
3 голосов
/ 16 декабря 2010

Сравнение в цепочках - это особенность BCPL, начиная с конца 1960-х годов.

3 голосов
/ 04 ноября 2010
Схема

(и, вероятно, большинство других языков семейства Лисп) эффективно поддерживает множественное сравнение в своей грамматике:

(< x y z)

Это можно считать обычным приложением функции < с тремя аргументами.См. 6.2.5 Числовые операции в спецификации.

Clojure поддерживает цепное сравнение тоже.

1 голос
/ 03 ноября 2010

Я думаю, что ICON является исходным языком, который имеет это, и в ICON не учитывается, что логические значения обрабатываются как специальные теги 'fail', а все остальные значения рассматриваются как true.

...