XQuery:导入的变量是否被延迟计算?

XQuery:导入的变量是否被延迟计算?,xquery,saxon,basex,Xquery,Saxon,Basex,我有一个XQuery库模块,包括一些不带参数的函数。 我正在考虑将这些函数重写为变量,以便更快地访问它们 然而,其中一些表达式的内容在计算上非常昂贵。作为函数,它们显然只有在被调用时才会被评估。但作为变量,我不确定在导入库模块时是否会自动计算它们 只有导入此模块的一些查询才会使用这些变量,并证明其计算是正确的。对于其他不使用变量的人来说,评估将是不必要的开销 但是,如果对导入的变量进行延迟计算,则不会有问题:我可以在任何查询中导入库模块,因为我知道这些昂贵的变量只有在主模块实际使用时才会进行计算

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

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

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

但是,如果对导入的变量进行延迟计算,则不会有问题:我可以在任何查询中导入库模块,因为我知道这些昂贵的变量只有在主模块实际使用时才会进行计算

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


我相信这种行为依赖于实现。我对BaseX和Saxon HE的行为特别感兴趣。他们是否懒散地评估导入的变量

Saxon通常会对全局变量使用惰性求值。例外情况是,如果启用了运行时跟踪,则在IDE中调试时可以执行此操作;然后,它切换到急切求值,以使调试更易于处理。

在BaseX中,只有那些变量将被优化,因此,如果它们在执行的代码中被引用,则可能会进行预求值。例如,在以下表达式中,将不计算$v:

declare variable $expensive := (1 to 100000000)[. = 1];
123
之所以选择对访问的变量进行预评估,是因为它支持BaseX中的许多后续优化。但是,可以通过添加以下命令来强制执行变量的延迟计算:


我不知道懒惰的注解。伟大的提示;谢谢分享。除此之外,我想再次检查一下您提到的两个关键词:执行代码。如果在库模块的另一个变量中引用了昂贵的变量,但在主模块中没有引用,那么$昂贵将不会被预计算,因为它不是已执行代码的一部分。对吗?如果变量出现在主模块或库模块中,实际上并不重要。但是,如果变量在可能执行的代码中的某个地方被引用,它确实会起作用。如果它出现在一个永远不会被调用的函数中,那么它实际上不会被计算这有用吗?
declare namespace basex = 'http://basex.org';
declare %basex:lazy variable $expensive := (1 to 100000000)[. = 1];
(1, $expensive)[1]