是否有任何公认的习惯用法可以在 MarkLogic XQuery 中编写相当于 while 循环的内容?我知道我可以编写一个尾递归例程,但 MarkLogic XQuery 不会优化尾递归,并且我遇到了堆栈溢出(我必须绕循环约 20000 次)。
编者注:从 MarkLogic 6 开始,尾递归在 MarkLogic 中得到了优化。
最佳答案
递归是通常的方法。另一种方法是将 FLWOR 与 try-catch
结合使用,并抛出已知代码的异常以提前退出。
try {
for $x in 1 to count($tokens)
return tok($x) }
catch ($ex) {
if ($x/error:code eq 'BREAK') then ()
else xdmp:rethrow() }
tok
函数将调用 error((), 'BREAK')
退出父 FLWOR 表达式。如果需要,您可以将 token 计数乘以某个因子,或使用任意大的数字。
https://github.com/robwhitby/xray/blob/coverage/src/coverage.xqy在 cover:actual-via-debug
函数中有一个更复杂的示例。
关于xquery - 如何在 MarkLogic XQuery 中编写 while 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13359631/