首页 > 解决方案 > XQuery 表达式求值的示例不是顺序的

问题描述

我正在寻找一个示例,它表明 XQuery 表达式评估不是连续的。在将 XQuery 的功能特性与过程语言进行比较时,总是会提到它。

例如在XQuery, 2nd edition中,在下面的部分:

带有 for 子句的 FLWOR 表达式类似于过程语言(例如 C)中的循环。但是,一个关键的区别是在 XQuery 中,因为它是一种函数式语言,所以认为迭代没有特定的顺序。它们不一定顺序发生,一个接一个。

标签: xquerynonsequential

解决方案


通常,该语言的设计使您无法分辨评估顺序是什么,这使得很难证明它不是您所期望的。要观察评估的实际顺序,您需要做一些有副作用的事情,这通常意味着偏离语言规范并使用供应商扩展。例如,您可以使用 EXPath 文件模块并发出对 的调用file:append-text(),然后检查添加到外部文本文件的条目的顺序。

当然,如果文件中的条目完全按照您期望的顺序,它不会证明任何事情。查询处理器不会仅仅为了好玩而使用不明显的执行顺序。他们只会在通过更改顺序获得一些东西时才会这样做。例如,Saxon 将延迟评估变量,直到它们被使用,并且如果可以的话,会将表达式从循环中取出。但是您会遇到问题,如果您使用具有副作用的函数file:append-text()来观察这种行为,Saxon 可能会检测到您的代码具有副作用并抑制优化。


推荐阅读