Xquery 在FLWOR中执行函数而不使用“let”

Xquery 在FLWOR中执行函数而不使用“let”,xquery,marklogic,Xquery,Marklogic,假设我创建了一个地图: let $map := map:map() 不使用let,我怎么能在地图上放东西?通常我必须做一些类似的事情 let $map := map:map() let $useless-var := map:put($map, $key, $value) 奇怪的是,如果我想执行一些东西,而我不关心返回值,我仍然必须存储结果。我错过了什么 注意:重要的不是映射,而是一个事实,即如果不将结果存储在某个无意义的变量中,我就无法运行函数。在MarkLogic 7中,可以使用映射构造

假设我创建了一个地图:

let $map := map:map()
不使用let,我怎么能在地图上放东西?通常我必须做一些类似的事情

let $map := map:map()
let $useless-var := map:put($map, $key, $value)
奇怪的是,如果我想执行一些东西,而我不关心返回值,我仍然必须存储结果。我错过了什么


注意:重要的不是映射,而是一个事实,即如果不将结果存储在某个无意义的变量中,我就无法运行函数。

在MarkLogic 7中,可以使用映射构造函数递归生成映射。我想这可能就是你想要的:

let $map := map:new( 
  (1 to 10) ! map:entry(., .)
)
或者执行map:put作为另一个序列的一部分,或者在返回map之前执行return语句:

let $map := map:map()
let $not-useless-var := ...
return (map:put($map, string($not-useless-var), $not-useless-var), $map)

一种方法是将函数作为序列中的项执行,其中通常只有一项(序列中的第一项或最后一项)为赋值或返回提供实际值,如:

let $roundedX := (
    math:floor($x),
    local:function1(...),
    local:function2(...)[false()],
    ...
    )
...
return (
    local:functionA(...),
    local:functionB(...)[false()],
    ...,
    $roundedX * 10
    )
如果函数返回一个您想要丢弃的值,只需使用一个false谓词,就像上面的两个函数一样


当然,这种方法只对有副作用的函数有用。

在普通XQuery中,忽略诸如的扩展没有副作用,因此不使用返回值调用函数是没有意义的

这里您可能缺少的是映射:put返回一个添加了额外项的新映射,它不会改变原始映射。因此,您的$Uffuse var实际上并不是无用的


编辑:事实上,我不确定MarkLogic的map:put是否会改变映射。如果是的话,那真的很恶心。我在考虑我在BaseX中使用的XQuery 3.1映射,它肯定是不可变的。

除非需要,否则不要使用FLWOR。在我看来,FLWOR表达式有点被过度使用了。我经常看到这样的表达:

let $a := current-time()
return $a
…当写下以下内容同样有效时:

current-time()

另请参见:

因为您的问题的焦点是关于在不存储中间结果的情况下运行函数,所以您可能会找到map操作符!有益的:

local:build-sequence() ! local:do-something-to-each(.)
这对处理序列很有好处。如果您更多地考虑处理某件事情的结果,那么答案很可能是接受XQuery的功能性质:

local:produce-result(
  local:build-parameter(),
  local:retrieve-config()
)

不确定你到底在找什么,但希望这些能帮上忙

这一点并不是关于映射的——我只是在寻找一种在FLWOR中运行函数而不使用let的方法。我更新了我的问题以澄清一点。映射是一个例外,但通常,XQuery中的函数没有副作用,因此如果不存储结果,为什么要调用该函数?在XQuery和其他函数式语言中,所有内容都是表达式,因此所有内容都会生成值。即使该值是空序列。这种语言实际上没有只调用函数的概念。调用函数是一种表达式求值。在FLWOR中,需要将结果绑定到变量,这就是FLWOR语法。我使用$作为被忽略变量的约定。这并不完全正确。不同的XQuery处理器实现映射的方式显然略有不同,在MarkLogic map:put中,会对原始映射进行变异并返回一个空序列。@wst它甚至没有返回相同映射的体面?这真的很糟糕。是的,MarkLogic映射是直接可变的。它们在服务器内部实现为C++数据结构。它们是作为一种性能增强而引入的,速度非常快,但确实违反了无副作用函数编程的预期。它们是特定于MarkLogic的,不是XQuery标准的一部分,并且比XQuery 3.x早几年。如果函数返回一个空序列,比如map:put,那么你甚至不需要谓词。