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.