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.
basex-talk@mailman.uni-konstanz.de