为什么xquery允许局部变量重新声明?

时间:2020-04-26 14:50:54

标签: xquery xquery-3.1

这甚至不会发出警告:

xquery version "3.1";
let $a := 1
let $a := 2
return $a
(: yields 2 in all runtimes I tested :)

为什么(功能性)编程语言可以允许变量重新声明? 我真的只想了解其背后的原理。 我相信,通过在编译步骤中拒绝此操作,可以进行一些更积极的优化。 由于局部变量对于子作用域也是已知的,因此仅留出了更多的空间来捕获错误。 JavaScript在var上使用了多年,最后通过引入letconst摆脱了它。

这是一个可能难以跟踪值的示例。

xquery version "3.1";
let $f := function ($c) {
  (: some code ... :)
  let $b := $a
  let $a := 2
  let $c := $b
  (: some more code ... :)
  return ($a, $b, $c)
}
let $a := 1
return ($a, $f($a), $a)

在评估之前,您可能想先猜测一下。

1 个答案:

答案 0 :(得分:1)

“为什么”问题总是很困难,因为您可以猜测为什么设计师可能会做出他们所做的决定,但是通常不可能获得其推理的历史证据。如果您想研究历史,可以在https://lists.w3.org/Archives/Public/public-xsl-query/上找到工作组的档案文件-但是搜索功能不是特别好,因此您可以将工作剪掉。但是,即使您在会议记录中找到了相关讨论,它也可能只会记录决策,而不会记录详细的论点。

XSLT 1.0不允许重新声明局部变量,我似乎还记得XSL人们通常反对允许它,而XQuery人们通常赞成。两种方式都有争论。允许它的主要参数可能是“没有不必要的限制”参数:如果某些东西具有明确定义的语义,则不要禁止它。不允许这样做的理由是人们可能会滥用和误解它;他们认为,如果两个变量具有相同的名称,则它们必须以某种方式关联。

用Java语言进行类比并不是特别好,因为过程语言中的变量与功能语言中的变量完全不同。

许多其他语言允许两个局部变量具有相同的名称,只要它们具有不同的范围。

相关问题