In this instance we are accessing the variable, and expecting it to cause a side effect. The access however is by passing it into `xdmp:set-request-content-type` which itself causes a side-effect, could it be perhaps that that is lazily evaluated and so the whole thing is eliminated by the optimiser?
-----Original Message----- From: [email protected] [mailto:[email protected]] On Behalf Of Whitby, Rob Sent: 19 June 2014 16:50 To: MarkLogic Developer Discussion Subject: Re: [MarkLogic Dev General] Evaluation of `declare variable` vs `let` declare variable Š is lazily evaluated, which is great unless you never access the variable but expect it to cause a side-effect. On 19/06/2014 16:28, "Retter, Adam (RBI-UK)" <[email protected]> wrote: >Given a main module with no user defined functions, is it considered >better practice to use `declare variable` as opposed to `let`, the >reason I ask is twofold: > >1) I have started on a large code-base that seems to eschew `let` in >favour of using `declare variable`. This seems somewhat strange to me. > >2) We have seen different evaluation strategies, whereby a function >which returns an empty-sequence which is bound in a declare variable >clause, is never executed. Yet when we re-write that as a let binding, >the code is executed. I think perhaps the query optimiser in ML is >being too aggressive here? > > >For example - > >declare variable $content-type as xs:string := >slib:validated-bulk-load-content-type(); > >and then a few lines later we have - > >slib:normal-bulk-load-response ($etag-map, fn:count >($etag-map/store:etag-entry), $content-type) > >Subsequently the `slib:normal-bulk-load-response` calls >xdmp:set-response-content-type($content-type). However the >`slib:validated-bulk-content-type()` function is never evaluated, we >are certain of this because it eventually calls `fn:error`, yet the >error never occurs! > >If we switch the `declare variable $content-type` for a `let >$content-type` then we do see the error occurring! > >Cheers Adam. > >DISCLAIMER >This message is intended only for the use of the person(s) ("Intended >Recipient") to whom it is addressed. It may contain information, which >is privileged and confidential. Accordingly any dissemination, >distribution, copying or other use of this message or any of its >content by any person other than the Intended Recipient may constitute >a breach of civil or criminal law and is strictly prohibited. If you >are not the Intended Recipient, please contact the sender as soon as possible. >Reed Business Information Limited. Registered Office: Quadrant House, >The Quadrant, Sutton, Surrey, SM2 5AS, UK. >Registered in England under Company No. 151537 > >_______________________________________________ >General mailing list >[email protected] >http://developer.marklogic.com/mailman/listinfo/general _______________________________________________ General mailing list [email protected] http://developer.marklogic.com/mailman/listinfo/general _______________________________________________ General mailing list [email protected] http://developer.marklogic.com/mailman/listinfo/general
