Hi Rob,

Glad to you hear you are fine.

If you want to ensure that arguments of user-defined functions are not
evaluated before the function is evaluated, you should work with
function items:

let $check := function(
  $pred   as item(),
  $true   as function() as item()*,
  $false  as function() as item()*
) {
  if ($pred) then $true() else $false()
}
return $check(true(), true#0, function() { error((), 'false') })

In the specific case you brought up, you can instead call the built-in
function util:if:

  util:if(true(), 'true', error((), 'false'))

The third argument will only be considered if the supplied condition fails.

Hope this helps,
Christian


> It has been a while. I hope all is well over there.
> Yep, still using BaseX and still loving it. It is a great product.
>
> However lately I encounter an issue with the %basex:inline annotation ☹ and 
> it is bugging me.
>
> Consider both snippets [snip1], [snip2]. Both should give the same result. 
> However they don’t and worse a can’t make the second snippet [ snip2] work 
> conform the first snippet{snip1].
>
> [snip1]:
> ======
> if ( true() )
> then "true"
> else error((),"false")
>
> [snip2]:
> ======
> %basex:inline(0)
> %basex:lazy
> function( $pred
>         , $true
>         , $false
>         )
>         {
>           if ( $pred)
>           then $true
>           else $false
>         } ( true()
>           , "true"
>           , error((),"false")
>           )
>
> Can you please have a look at this?
> TIA.
> Greatings,
> Rob Stapper
> PS. As I remember this used to work fine.
> I remember we had a discussion concerning inlining and laziness on 2015-06-17.

Reply via email to