inline issue
Friday, 26 June 2020 · 2 messages
R
RobStapper26 Jun 2020 11:57 #
Sent from Mail for Windows 10
Quoted text · RobStapper · 40 lines
From: RobStapper Sent: Thursday, June 25, 2020 1:33 PM To: basex-talk at mailman.uni-konstanz.de Subject: inline issue Hi Cristian, 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. Sent from Mail for Windows 10 -- This email has been checked for viruses by Avast antivirus software. https://www.avast.com/antivirus
CG
Christian Grün26 Jun 2020 12:22 #
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
Quoted text · RobStapper · 36 lines
> 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.
Written for BaseX 9.3. BaseX may have changed since: please check the current documentation.
⚡Generated with XQuery