![]() |
1
7
你在描述不变性,一种 functional languages. 这是真的;一旦一个变量被设置为一个值,它就不能被设置为其他值。 不变性有很多好处。特别地, concurrent programming 变得容易多了。
|
![]() |
2
7
XQuery脚本扩展1.0
顺序函数可以进行更新。apply语句(每段代码以
如果您只想在FLWOR中有一个计数变量,您可以使用
退货:
|
![]() |
3
3
你不能改变一个变量的值(一个愚蠢的名字不是吗,因为它们没有变化!)。 将XQuery与任何复杂逻辑(以及可变变量之类的逻辑)结合使用的魔力在于递归。 robertharvey提到了for循环的语言结构,其中变量每次都会发生变化,这是非常相关的,但这并不能总是解决问题,除非您的预期行为可以通过简单的列表迭代来实现。你要的是可变变量。
从程序性(步骤的顺序执行)思维方式转变为功能性(同时评估从句)思维方式可能有点令人头晕。
注意变量$patternsremaining严格来说是一个新变量(部分基于$patterns计算)。作为参数传递到递归调用中的任何模式都将在新函数调用中分配给$patterns。
对于使用XSLT和XQuery的硬核活动(例如编写编译器),递归是我发现的唯一具有足够能力的模型。然而,真实的例子看起来比上面的更复杂。 至于if()then()else()语句,因为可能以前遇到过相同的执行上下文(如果您是过程编码人员,则认为是“堆栈变量的组合”),并且在其他地方已经对相同的表达式进行了求值,因此if语句将永远不会再次求值,因为解释器可以基于上一次调用缓存结果。因此,严格来说,你不能依赖序列。它可能根本不会运行! 这是可能的,因为它内置于语言定义中,不存在会改变函数求值结果的副作用(因此这些变量不会变化)。 这种可缓存性是函数方法的一个中心特性。它为编写高效的解释器创造了潜力,但如果您想能够使用可变值进行操作,就需要递归地思考。 |
![]() |
4
0
不,不能更新变量。如果你不能依赖执行顺序,那么这样做又有什么意义呢?
当然,即使没有可更新的变量,您也可以使用递归函数执行几乎所有操作,包括变量递增的“循环”。这是有效的还是好的主意,则另当别论。我曾经实施过
|
![]() |
5
0
相信我。 在这方面,XQuery就像一种函数式编程语言。您不希望从函数/数学的角度更改已计算计算的计算值。此外,数据是不可变的,并且不能更改状态,因此可以使用该语言构建高并发性应用程序。Erlang是为高并发性而构建的语言的“好”例子。一些命令式语言(如Java)中也使用了不变性来实现高并发性。 就像在任何其他函数式语言中一样,您可以始终确保“eval”您的“expr”,然后使用一个副本进行所需的更改。 注意,我并不是说XQuery是一种好的函数式编程语言。看看erlang,它是一个很好的函数语言和实现的例子,可以提供很好的性能。 |
![]() |
coder25 · 基于marklogic中的元素返回最新文档 6 年前 |