为什么 xquery 允许局部变量重新声明?
Why does xquery allow local variable redeclaration?
这甚至不会引发警告:
xquery version "3.1";
let $a := 1
let $a := 2
return $a
(: yields 2 in all runtimes I tested :)
为什么(函数式)编程语言允许重新声明变量?
我真的只是想了解其背后的基本原理。
我相信,通过在编译步骤中拒绝这一点,可以实现一些更积极的优化。
由于子作用域也知道局部变量,这只会为难以捕获的错误留出更多空间。
JavaScript 与 var
一起使用了多年,最终通过引入 let
和 const
.
摆脱了它
这是一个可能难以跟踪值的示例。
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)
您可能需要先猜测,然后再进行评估。
"Why" 问题总是很困难,因为您可以猜出设计师为什么会做出他们所做的决定,但通常不可能获得他们推理的历史证据。如果您想研究历史,可以在 https://lists.w3.org/Archives/Public/public-xsl-query/ 找到工作组的档案——但搜索工具不是特别好,所以您的工作会被取消。但即使你在会议纪要中找到相关讨论,也可能只会记录决定,而不会记录详细的论点。
XSLT 1.0 不允许局部变量是 re-declared,我似乎记得 XSL 的人通常反对允许它,而 XQuery 的人通常赞成。两种方式都有争论。允许它的主要论点可能是 "no needless restrictions" 论点:如果它具有 well-defined 语义,你就不会禁止它。不允许它的理由是人们可能会误用和误解它;他们认为如果两个变量具有相同的名称,则它们必须以某种方式相关。
Javascript 类比不是特别好,因为过程语言中的变量与函数式语言中的变量有很大不同。
许多其他语言允许两个局部变量具有相同的名称,前提是它们具有不同的范围。
这甚至不会引发警告:
xquery version "3.1";
let $a := 1
let $a := 2
return $a
(: yields 2 in all runtimes I tested :)
为什么(函数式)编程语言允许重新声明变量?
我真的只是想了解其背后的基本原理。
我相信,通过在编译步骤中拒绝这一点,可以实现一些更积极的优化。
由于子作用域也知道局部变量,这只会为难以捕获的错误留出更多空间。
JavaScript 与 var
一起使用了多年,最终通过引入 let
和 const
.
这是一个可能难以跟踪值的示例。
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)
您可能需要先猜测,然后再进行评估。
"Why" 问题总是很困难,因为您可以猜出设计师为什么会做出他们所做的决定,但通常不可能获得他们推理的历史证据。如果您想研究历史,可以在 https://lists.w3.org/Archives/Public/public-xsl-query/ 找到工作组的档案——但搜索工具不是特别好,所以您的工作会被取消。但即使你在会议纪要中找到相关讨论,也可能只会记录决定,而不会记录详细的论点。
XSLT 1.0 不允许局部变量是 re-declared,我似乎记得 XSL 的人通常反对允许它,而 XQuery 的人通常赞成。两种方式都有争论。允许它的主要论点可能是 "no needless restrictions" 论点:如果它具有 well-defined 语义,你就不会禁止它。不允许它的理由是人们可能会误用和误解它;他们认为如果两个变量具有相同的名称,则它们必须以某种方式相关。
Javascript 类比不是特别好,因为过程语言中的变量与函数式语言中的变量有很大不同。
许多其他语言允许两个局部变量具有相同的名称,前提是它们具有不同的范围。