HPCC-ECL逻辑运算符 - 为什么OR不短路?

时间:2016-10-14 12:06:00

标签: hpcc hpcc-ecl

The documentation表示OR逻辑运算符应该短路:

  

如果发生概率已知,   你应该从最有可能发生的事件到最不可能发生的事情来命令它们,因为一旦化合物的任何部分   OR条件的计算结果为TRUE,表达式的其余部分被绕过

除非我弄错了,否则表现不如预期。 当必须评估返回TRUE的表达式时,它似乎继续在OR之后计算下一个表达式。 似乎对于硬编码值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 个答案:

答案 0 :(得分:1)

HPCC论坛主题here上提供的回复表明这是一个已知问题:

  

在这种情况下,getSubCount定义是一个Action,编译器执行条件中的所有操作都是一个已知问题。

我已为此here提出了一个错误,但我想这个问题的答案目前是“它应该短路,但它不会”