Correct Rob, " declare variable " evaluated lazily and is never evaluated more than once. So the expression in right side will never be evaluated until the declared variable accessed for the first time.
Thanks, Abhinav ________________________________________ From: [email protected] [[email protected]] on behalf of Whitby, Rob [[email protected]] Sent: Thursday, June 19, 2014 9:20 PM 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 This e-mail and any files transmitted with it are for the sole use of the intended recipient(s) and may contain confidential and privileged information. If you are not the intended recipient(s), please reply to the sender and destroy all copies of the original message. Any unauthorized review, use, disclosure, dissemination, forwarding, printing or copying of this email, and/or any action taken in reliance on the contents of this e-mail is strictly prohibited and may be unlawful. Where permitted by applicable law, this e-mail and other e-mail communications sent to and from Cognizant e-mail addresses may be monitored. _______________________________________________ General mailing list [email protected] http://developer.marklogic.com/mailman/listinfo/general
