Цепная нотация в языках программирования - PullRequest
13 голосов
/ 15 апреля 2010

Существует ли язык программирования, который поддерживает цепочечную нотацию a Пример:

  1. if (2
  2. if (2

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

Ответы [ 3 ]

13 голосов
/ 15 апреля 2010

Python делает это.

6 голосов
/ 16 апреля 2010

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

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

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

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

3 голосов
/ 15 апреля 2010

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

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

So

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 ()" уменьшается в два раза или только один раз? Будет ли «цепочка-если-утверждение» когда-либо ярлык?

Рассмотрим последние определения, которые приблизительно оценивают (на английском языке) в «На 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) { } мне кажется ясным, я знаю, что он делает, и я знаю, что намерен кодер.

...