Hi Graydon, Folks tell us it’s time to stop delaying BaseX 11… We’re trying hard.
The good news: The only difference between hof:until [1] and fn:do-until [2] is the order of parameters. The following queries will do the same thing: hof:until(function($a) { $a > 16 }, function($a) { $a * 2 }, 1) do-until(1, function($a) { $a * 2 }, function($a) { $a > 16 }) With fn:do-until, the input has moved to the first position, the action comes second and the predicate comes last. Hope this helps, Christian [1] https://files.basex.org/releases/10.0/BaseX100.pdf [2] https://qt4cg.org/specifications/xpath-functions-40/Overview.html#func-do-until On Thu, Mar 28, 2024 at 5:41 PM Graydon <graydon...@gmail.com> wrote: > Hi Andy -- > > On Thu, Mar 28, 2024 at 01:06:10PM +0000, Andy Bunce scripsit: > > hof:until is not gone, it is just hiding [1] > > - In 10.7 it is there but undocumented in Wiki > > Which is useful to know -- thank you! -- but makes me think a bunch of > my production code is going to break hard when 11 is released. I would > really like to avoid that. (In particular, the conversation with > management about how much refactoring work will be required.) > > > - In BaseX 11 you need to use XQuery 4 fn:while-do⁺, fn:do-until⁺ [2] > > It is very probably my brain, but I'm having trouble transposing > hof:until to those functions. I can an implement what I want to do with > hof:until like so: > > declare function xc:dropTableLinesFancy($in as node()*) as node()* { > let $result as map(*) := > hof:until( > (: are we done? (= we've run off the end of our list of nodes ) :) > function($m) { > empty($m?oldNodes) > }, > (: create new list of line elements :) > function($m) { > map { > 'oldNodes': tail($m?oldNodes), > 'newNodes': ($m?newNodes, > switch (true()) > case starts-with(head($m?oldNodes),':stab') return <line/> > case starts-with(head($m?oldNodes),':rtab') return <line/> > case $m?toggle return <line/> > default return head($m?oldNodes) > ), > 'toggle': ( > switch (true()) > case starts-with(head($m?oldNodes),':stab') return true() > case starts-with(head($m?oldNodes),':rtab') return false() > default return $m?toggle > ) > } > }, > (: initial input = we start with no new nodes :) > map { 'oldNodes': $in, 'newNodes': (), 'toggle': false() } > ) > return $result?newNodes > }; > > Anyone willing to provide an example of what that would look like in > fn:while-do or fn:do-until? > > Thanks! > Graydon > > > -- > Graydon Saunders | graydon...@fastmail.com > Þæs oferéode, ðisses swá mæg. > -- Deor ("That passed, so may this.") >