Логические операторы HPCC-ECL - Почему ИЛИ не имеет короткого замыкания?

В документации указано, что логический оператор ИЛИ должен закорачивать:

Если вероятность возникновения известна, вы должны упорядочить их от наиболее вероятных до наименее вероятных, потому что, как только любая часть составного условия OR оценивается как TRUE, оставшаяся часть выражения пропускается

Если я не ошибаюсь, это не ведет себя, как ожидалось. Когда ему нужно вычислить выражение, которое возвращает TRUE, оно, похоже, продолжает вычислять следующее выражение после ИЛИ. Кажется, что для жестко закодированного значения ИСТИНА он работает как ожидалось.

Я делаю что-то неправильно или неправильно понимаю код / ​​документацию?

Рассмотрим следующий код:

IMPORT STD;
superFileName   := 'temp::superFile';
fileName        := 'temp::regularFile';
returnsTrue     := ~STD.File.FileExists(fileName, TRUE); // File does not exist, so will return true as expression is negated
getSubCount     := NOTHOR(STD.File.GetSuperFileSubCount(superFileName)) > 0; // "Could not locate superfile: thor::nonExistent"

deleteFile      := STD.File.DeleteLogicalFile(fileName);
deleteSuperFile := STD.File.DeleteSuperFile(superFileName);

SEQUENTIAL(
  deleteFile,
  deleteSuperFile,
  OUTPUT(returnsTrue), // true
  OUTPUT(IF ((TRUE OR getSubCount), 'true', 'false')), // 'true'
  OUTPUT(IF ((returnsTrue OR getSubCount), 'true', 'false')), // "Could not locate superfile: thor::temp::superFile"
);

1 ответ

Решение

Ответ на тему форума HPCC здесь указывает на то, что это известная проблема:

В этом случае ваше определение getSubCount является действием, а компилятор, выполняющий все действия в условии, является известной проблемой.

Я поднял ошибку для этого здесь, однако я предполагаю, что ответ на этот вопрос в настоящее время "это должно замкнуть накоротко, но это не так"

Другие вопросы по тегам