Подтвердить что ты не робот

Почему булевое выражение (с побочными эффектами) недостаточно в качестве утверждения?

function A: Boolean;
function B: Boolean;

Я (случайно) написал следующее:

A or B;

Вместо этого:

if not A then
  B;

Компилятор отклоняет первую форму, мне любопытно, почему?

С оценкой короткого замыкания они оба будут делать то же самое, не так ли?

Разъяснение: Мне было интересно, почему язык не был предназначен для того, чтобы мое выражение как выражение.

4b9b3361

Ответ 1

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

Обратитесь к документации , и вы найдете список действительных утверждений. Ваше выражение не может быть найдено в этом списке.

В комментариях (теперь удаленных) вы спросили, почему дизайнеры языка решили не выражать такое выражение как выражение. Но этот вопрос подразумевает цель, где, возможно, их не было. Совершенно правдоподобно, что дизайнеры не решили не делать этого. Скорее, они никогда не думают о том, чтобы сделать это в первую очередь. Языки, как правило, предназначены для решения конкретных проблем. Совершенно правдоподобно, что дизайнеры просто никогда не рассматривали такие выражения как утверждения.

Ответ 2

Первое выражение. Выражения оцениваются. Выражения не имеют видимых побочных эффектов (например, чтение или запись переменной). Оба операнда выражения являются функциями, и те могут иметь побочные эффекты, но для того, чтобы иметь побочные эффекты, должен быть выполнен оператор.

Второй - это утверждение. Он сравнивает результат выражения и на основе оценки вызывает другую функцию.

Запутанная часть состоит в том, что в этом случае Delphi позволяет игнорировать результат функции и выполнять ее как функцию. Таким образом, вы ожидаете то же самое для A or B. Но это не допускается. Это здорово, потому что поведение неоднозначно. Например, если у вас включена ленивая оценка. И A оценивает значение true, B называется да или нет.

Ответ 3

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

Ответ 4

В основе своей, Дельфи - Паскаль. Язык Pascal был разработан Nicklaus Wirth и опубликован в 1968 году. Моя копия Руководства пользователя и отчета с 1978 года. Он был разработан с учетом двух целей в качестве учебного языка и как того, который был легко реализован на любой заданной машине, В этом он был впечатляюще успешным.

Вирт был хорошо знаком с другими языками того времени (в том числе с Фортраном, Коболом и, в частности, с Алголом), и сделал ряд тщательных выборов с особыми целями. В частности, он тщательно отделил понятие "действия" от "ценностей". "Действия" в Pascal являются инструкциями на языке, включая вызов процедуры. "Значения" включают вызовы функций. В этом и некоторых других отношениях язык очень похож на Алгол.

Синтаксис для объявления и использования действий и значений тщательно сохраняется отдельно. Язык и библиотеки, предоставляемые им, вообще не имеют "побочных эффектов" как таковых. Процедуры делают вещи и выражения вычисляют значения. Например, "чтение" - это процедура, а не функция, потому что она извлекает значение и продвигается через файл, но функция "eof" является функцией.

Версия массового рынка Pascal была создана Borland в середине 1980-х годов и впоследствии стала Turbo Pascal для Windows, а затем Delphi. Язык сильно изменился, и не все так чисто, как его разработал Вирт. Это одна из особенностей, которая сохранилась.

Кстати, у Паскаля не было оценки короткого замыкания. У него была память кучи и набор, но нет объектов. Они пришли позже.