XQuery:导入的变量是否被延迟评估?

XQuery: Are imported variables lazily evaluated?

我有一个 XQuery 库模块,其中包含一些不带参数的函数。 我正在考虑将这些函数重写为变量,以便更快地访问它们。

但是,其中一些内容是计算量大的表达式。作为函数,它们显然只有在被调用时才会被求值。但是作为变量,我不确定在导入库模块时是否会自动计算它们。

只有一些导入此模块的查询会使用这些变量,并证明它们的评估是正确的。对于其他不使用变量的人,上述评估将是不必要的开销。

但是,如果导入的变量被惰性求值,那就没问题了:我可以在任何查询中导入库模块,因为我知道这些昂贵的变量只有在主模块实际使用时才会被求值。

我知道这只是写 prefix:myImportedFunction()$prefix:myImportedVariable 的问题,但这是我想消除的不确定性。

我认为此行为取决于实现。我对 BaseX 和 Saxon-HE 中的行为特别感兴趣。他们懒惰地评估导入的变量吗?

Saxon 通常会对全局变量使用惰性求值。例外情况是 运行 时间跟踪已启用(如果您在 IDE 中调试,则可能会这样做);然后它切换到急切的评估以使调试更容易处理。

在 BaseX 中,只有那些变量在执行代码中被引用时才会被优化(因此,可能会被预评估)。例如,在下面的表达式中,$v 将不会被计算:

declare variable $expensive := (1 to 100000000)[. = 1];
123

之所以选择访问变量的预评估,是因为它可以在 BaseX 中启用许多后续优化。但是,可以通过添加 Q{http://basex.org}lazy annotation:

来强制执行变量的惰性求值
declare namespace basex = 'http://basex.org';
declare %basex:lazy variable $expensive := (1 to 100000000)[. = 1];
(1, $expensive)[1]