XQuery 表达式求值示例不是连续的
Example of XQuery expression evaluation is not sequential
我正在寻找一个表明 XQuery 表达式求值不是顺序的示例。在将 XQuery 的功能性质与过程语言进行比较时,总是会提到它。
例如在 XQuery, 2nd edition 中,在以下部分中:
The FLWOR expression with its for clause is similar to loops in
procedural languages such as C. However, one key difference is that in
XQuery, because it is a functional language, the iterations are
considered to be in no particular order. They do not necessarily occur
sequentially, one after the other.
在某些实现中,您会发现更复杂的 FLOWR 表达式中的结果顺序是任意的,例如以 Priscilla Walmsley 的书 http://www.datypic.com/books/xquery/ a grouping of item
elements ('order.xml' in http://www.datypic.com/books/xquery/chapter01.html) 和
为例
<order num="00299432" date="2015-09-15" cust="0221A">
<item dept="WMN" num="557" quantity="1" color="navy"/>
<item dept="ACC" num="563" quantity="1"/>
<item dept="ACC" num="443" quantity="2"/>
<item dept="MEN" num="784" quantity="1" color="white"/>
<item dept="MEN" num="784" quantity="1" color="gray"/>
<item dept="WMN" num="557" quantity="1" color="black"/>
</order>
在 Saxon 9.8 HE 中使用代码(http://www.datypic.com/books/xquery/chapter07.html 中的 7.11)
declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization";
declare option output:method 'xml';
declare option output:indent 'yes';
for $item in //item
group by $d:= $item/@dept, $n:= $item/@num
return <group dept="{$d}" num="{$n}" count="{count($item)}"/>
给出输出
<?xml version="1.0" encoding="UTF-8"?>
<group dept="ACC" num="563" count="1"/>
<group dept="MEN" num="784" count="2"/>
<group dept="WMN" num="557" count="2"/>
<group dept="ACC" num="443" count="1"/>
而例如使用 BaseX,对于 group
元素,您可能会得到不同的输出顺序(如果我没记错的话,我认为是基于项目的输入顺序),例如在 BaseX 9 中,我得到
<group dept="WMN" num="557" count="2"/>
<group dept="ACC" num="563" count="1"/>
<group dept="ACC" num="443" count="1"/>
<group dept="MEN" num="784" count="2"/>
一般来说,语言的设计让您无法分辨求值顺序是什么,这使得很难证明它不是您所期望的。要观察实际的评估顺序,您需要做一些有副作用的事情,这通常意味着偏离语言规范并使用供应商扩展。例如,您可以使用 EXPath 文件模块并发出对 file:append-text()
的调用,然后检查添加到外部文本文件的条目的顺序。
当然,如果文件中的条目完全按照您期望的顺序排列,这并不能证明任何事情。查询处理器不会为了好玩而使用不明显的执行顺序。他们只会在通过更改顺序获得某些收益时才会这样做。例如,Saxon 会延迟评估变量,直到它们被使用,并且如果可以的话会将表达式从循环中提取出来。但是你会遇到问题,如果你使用像 file:append-text()
这样有副作用的函数来观察这种行为,Saxon 可能会检测到你的代码有副作用并抑制优化。
我正在寻找一个表明 XQuery 表达式求值不是顺序的示例。在将 XQuery 的功能性质与过程语言进行比较时,总是会提到它。
例如在 XQuery, 2nd edition 中,在以下部分中:
The FLWOR expression with its for clause is similar to loops in procedural languages such as C. However, one key difference is that in XQuery, because it is a functional language, the iterations are considered to be in no particular order. They do not necessarily occur sequentially, one after the other.
在某些实现中,您会发现更复杂的 FLOWR 表达式中的结果顺序是任意的,例如以 Priscilla Walmsley 的书 http://www.datypic.com/books/xquery/ a grouping of item
elements ('order.xml' in http://www.datypic.com/books/xquery/chapter01.html) 和
<order num="00299432" date="2015-09-15" cust="0221A">
<item dept="WMN" num="557" quantity="1" color="navy"/>
<item dept="ACC" num="563" quantity="1"/>
<item dept="ACC" num="443" quantity="2"/>
<item dept="MEN" num="784" quantity="1" color="white"/>
<item dept="MEN" num="784" quantity="1" color="gray"/>
<item dept="WMN" num="557" quantity="1" color="black"/>
</order>
在 Saxon 9.8 HE 中使用代码(http://www.datypic.com/books/xquery/chapter07.html 中的 7.11)
declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization";
declare option output:method 'xml';
declare option output:indent 'yes';
for $item in //item
group by $d:= $item/@dept, $n:= $item/@num
return <group dept="{$d}" num="{$n}" count="{count($item)}"/>
给出输出
<?xml version="1.0" encoding="UTF-8"?>
<group dept="ACC" num="563" count="1"/>
<group dept="MEN" num="784" count="2"/>
<group dept="WMN" num="557" count="2"/>
<group dept="ACC" num="443" count="1"/>
而例如使用 BaseX,对于 group
元素,您可能会得到不同的输出顺序(如果我没记错的话,我认为是基于项目的输入顺序),例如在 BaseX 9 中,我得到
<group dept="WMN" num="557" count="2"/>
<group dept="ACC" num="563" count="1"/>
<group dept="ACC" num="443" count="1"/>
<group dept="MEN" num="784" count="2"/>
一般来说,语言的设计让您无法分辨求值顺序是什么,这使得很难证明它不是您所期望的。要观察实际的评估顺序,您需要做一些有副作用的事情,这通常意味着偏离语言规范并使用供应商扩展。例如,您可以使用 EXPath 文件模块并发出对 file:append-text()
的调用,然后检查添加到外部文本文件的条目的顺序。
当然,如果文件中的条目完全按照您期望的顺序排列,这并不能证明任何事情。查询处理器不会为了好玩而使用不明显的执行顺序。他们只会在通过更改顺序获得某些收益时才会这样做。例如,Saxon 会延迟评估变量,直到它们被使用,并且如果可以的话会将表达式从循环中提取出来。但是你会遇到问题,如果你使用像 file:append-text()
这样有副作用的函数来观察这种行为,Saxon 可能会检测到你的代码有副作用并抑制优化。