【问题标题】:Why does xquery allow local variable redeclaration?为什么 xquery 允许局部变量重新声明?
【发布时间】:2020-08-10 01:21:49
【问题描述】:

这甚至不会引发警告:

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)

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

【问题讨论】:

    标签: xquery xquery-3.1


    【解决方案1】:

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

    XSLT 1.0 不允许重新声明局部变量,我似乎记得 XSL 人通常反对允许它,而 XQuery 人通常赞成。两种方式都有争论。允许它的主要论据可能是“没有不必要的限制”论点:如果它具有明确定义的语义,您就不会禁止它。不允许它的理由是人们可能会误用和误解它;他们认为如果两个变量具有相同的名称,它们一定是相关的。

    Javascript 类比不是一个特别好的类比,因为过程语言中的变量与函数语言中的变量有很大不同。

    许多其他语言允许两个局部变量具有相同的名称,前提是它们具有不同的作用域。

    【讨论】:

    • 感谢您的详细回答。与往常一样,这确实有助于我了解一些决定背后的历史。我绝对不同意的地方是 JavaScript 是“公正的”程序性的(参见 crockford.com/javascript/javascript.html)。我的观点是,我学会了喜欢编译器告诉我要注意什么。我并不是说这应该被禁止(默认情况下)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-20
    • 2020-04-14
    • 1970-01-01
    • 2018-08-15
    • 2014-02-12
    相关资源
    最近更新 更多