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.")
>

Reply via email to