Цепочечная нотация неравенства на языках программирования

Существует ли язык программирования, который поддерживает цепочечную нотацию a <b <c, чтобы использоваться вместо <b и b <c в условных операторах?

Пример:

  1. если (2 <x <5)
  2. если (2 <x && x <5)

Первый statementlooks лучше мне, легче понять, и компилятор мог использовать свойство транзитивности для предупреждения об ошибках (например, 5 <x <2 даст предупреждение).

13
задан Davorin 15 April 2010 в 09:18
поделиться

3 ответа

Icon делает это, и это не является частью какого-либо хакерского "связывания" в особых случаях; это часть модели целенаправленной оценки Icon. Любое сравнение либо завершается успешно , либо не выполняется . В случае успеха он производит правую часть. Итак, вы можете написать

if 0 <= i <= j < n then ...

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

Примечание. В статье Гвидо, представляющей Python на VHLL (середина 1990-х годов), он явно упоминает Icon как источник вдохновения при разработке Python.

6
ответ дан 1 December 2019 в 22:22
поделиться

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

В частности, каждый раз, когда вы используете функции (или свойства в случае C #, Getters for Java)

Итак

public int GetX()
{
   return 4;
}

(2 < GetX() < 5);

(2 < GetX() > 5);

(5 < GetX() < 2);

Похоже, это было бы очень просто. Но проблемы возникают, если GetX () имеет побочные эффекты.

private int val = 10;

public int GetCountdown()
{
   return val--;
}

(2 < GetCountdown() < 5);

(2 < GetCountdown() > 5);

(5 < GetCountdown() < 2);

В этой ситуации "GetCountdown ()" уменьшается дважды или только один раз? Будет ли когда-либо ярлык для "связанного оператора if"?

Рассмотрим последний статус, который приблизительно оценивает (на английском языке) как «На 5 меньше некоторого значения, которое меньше 2), что должно быть невозможно, но в зависимости от реализации и побочных эффектов возможно, что некоторая функция ( Random.NextInt ()) может пройти оба этих теста.

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

public int GetOne()
{
   return 1;
}

public int GetVar()
{
   return -1;
}

(GetOne() < GetVar() < GetDBVal() < GetUserInput())

Как правило, вам нужно сначала проверить константы и переменные, прежде чем выполнять обращение к базе данных.Но если мы сказали (как мы сказали ранее), что все значения должны быть заранее сохранены в локальных переменных, это означает, что он может вызывать попадание в базу данных и запрашивать информацию у пользователя, даже если «GetVar ()» - 1, и поэтому первое сравнение не удается)

Как я сказал ранее, очевидно, что Python допускает этот синтаксис, поэтому очевидно, что это возможно. Но, независимо от технических последствий, которые я изложил (все из которых легко спроектировать), это означает, что ваш код менее ясен , потому что следующий человек, который его прочитает, не знает, действительно ли вы учли все это. Принимая во внимание, что if (x> 2 && x <5) {} кажется мне ясным, я знаю, что он делает, и я знаю, что намеревается кодировщик.

3
ответ дан 1 December 2019 в 22:22
поделиться

Это делает Python.

13
ответ дан 1 December 2019 в 22:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: