syntax - XQuery 函数 : variable and expression vs FLOWR

标签 syntax xquery

方法一

declare function foo($bar){
     variable $x := some_fn($bar/yada/yada);
     variable $y := other_fn($x);
     $y
};

方法 2(FLOWR)

declare function foo($bar){
     let $x := some_fn($bar/yada/yada)
     let $y := other_fn($x)
     return $y
};

不同的语法,相同的结果;从处理器的角度来看,有什么不同?有什么理由优先选择一种方法而不是另一种方法?为了便于阅读,我更喜欢 FLOWR。

最佳答案

第一种方法(使用变量)依赖于非标准扩展。至少在 Zorba 上,这被称为 Zorba Scripting Extension (滚动到底部,标题“脚本”)这向 XQuery 添加了副作用命令式编程结构。默认情况下,此扩展在 Zorba 中处于启用状态,但 can be turned off .

我找不到此扩展的规范。更令人困惑的是,有一个名为 XQuery Scripting Extension 的 W3C XQuery 扩展。它添加了相同的功能,但使用了不同的语法,而 Zorba 没有实现此 W3C 扩展。 W3C 语法为declare $x ...; (而不是 block 顶部的变量 $x ...;

无论如何,以下是两个代码片段之间的差异:

  1. 您的变量方法是非标准的,并且可能是 Zorba 特定的;您的 FLWOR 是普通的 XQuery 1.0。
  2. variable 方法具有副作用:$x$y 位于整个 block 的范围内,并且可以重新定义随时分配。使用 FLWOR 方法,每个 let 绑定(bind)仅对以下 FLWOR 子句可见。
  3. 我不知道这样一个简单的示例是否会对性能产生任何影响。一般来说,有时可变性和副作用更快,但编译器通常更难优化此类代码(并且它们可能能够比手写的可变代码更好地优化不可变的纯代码)。但这完全取决于 Zorba 在幕后所做的事情。

我不会使用变量,因为它是非标准的,而且我更喜欢基于表达式的非命令性代码的可预测性。对我来说,使 XQuery 命令式听起来像是一个错误。

关于syntax - XQuery 函数 : variable and expression vs FLOWR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25670248/

相关文章:

python - 使用切片表示法反转列表

java - 制作二维链表时出现语法错误

xml - sql中查询xml列的方法

javascript - 我可以在 javascript 中使用 XPath 返回整个 XML 文档吗?

regex - 如何跳过 elisp 中的符号?

css - 这行在 CSS 中是什么意思?

c# - 为什么 "SELECT * FROM user"会抛出语法错误?

javascript - xpath 评估多个元素值

sql - 除了结构化 XML 数据之外,还选择行数据

java - 如何针对字符串中的 XML 运行 XQuery?