Существует ли язык программирования, который поддерживает цепочечную нотацию a <b <c, чтобы использоваться вместо <b и b <c в условных операторах?
Пример:
Первый statementlooks лучше мне, легче понять, и компилятор мог использовать свойство транзитивности для предупреждения об ошибках (например, 5 <x <2 даст предупреждение).
Icon делает это, и это не является частью какого-либо хакерского "связывания" в особых случаях; это часть модели целенаправленной оценки Icon. Любое сравнение либо завершается успешно , либо не выполняется . В случае успеха он производит правую часть. Итак, вы можете написать
if 0 <= i <= j < n then ...
, и он будет работать именно так, как вы ожидаете. Но он работает не только для сравнений, но и для любого выражения; это означает, что вы можете написать свои собственные функции, которые "цепляются" точно таким же образом. Мне нравится этот аспект Icon, и я хочу, чтобы больше языков могло включать целенаправленную оценку.
Примечание. В статье Гвидо, представляющей Python на VHLL (середина 1990-х годов), он явно упоминает Icon как источник вдохновения при разработке Python.
Это звучит как простой запрос (и очевидно, что он достаточно прост, чтобы его реализовал 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) {}
кажется мне ясным, я знаю, что он делает, и я знаю, что намеревается кодировщик.