Dear Wouter, Indeed, in some cases, whether to use => or ! can be subject to a matter of taste.
To put things in perspective, => was introduced in version 3.1, together with map and array support. As far as I understand it and looking again at the specs, one of the use cases is for => to be used with maps and arrays, in an object-oriented style. The XPath and XQuery Functions and Operators 3.1 specification [1] explicitly gives a few examples: ["a", "b", "c"] => array:get(2) $array => array:remove($position) => array:insert-before($position, $member) Kind regards, Ghislain [1] https://www.w3.org/TR/xpath-functions-31/ > On 2 Aug 2017, at 12:09, W.S. Hager <[email protected]> wrote: > > That's why, for cases where it's possible, I preferred to write the simple > mapping operator, as it's easier to read IMO. > > 2017-08-02 12:07 GMT+02:00 W.S. Hager <[email protected]>: > Hi Ghislain, > > Alright, I forgot about fn:replace#4, but the implicit binding is sometimes > hard to detect. > > Thanks. > > > 2017-08-02 12:04 GMT+02:00 Ghislain Fourny <[email protected]>: > ... I didn't get it quite right actually. In @address => string(), there is > no context item involved, I wrote too fast. :-) > > New attempt: > > @address ! string(.) (: explicitly passed context item :) > @address ! string() (: context item passed implicitly to string#0, which is > context-dependent) > @address => string() (: @address passed implicitly to string#1 as the first > parameter via the => operator, but string#1 is context-independent) > @address => string(.) (: error: string#2 does not exist :) > > Kind regards, > Ghislain > > > > On 2 Aug 2017, at 12:00, Ghislain Fourny <[email protected]> wrote: > > > > Dear Wouter, > > > > There is one more important difference on the syntactic level. > > > > With the arrow operator, the left-hand-side is implicitly bound to the > > first parameter of the function. > > > > @address => replace(@postcode, "", "q") > > > > is the same as > > > > replace(@address, @postcode, "", "q") > > > > > > With the simple map operator, the context item must be explicitly referred > > to, like so: > > > > @address ! replace(., @postcode, "", "q") > > > > > > What may create confusion is that some functions have several signatures, > > some of which implicitly refer to the context item. But this is a very > > different mechanism. > > > > For example : > > > > @address ! string(.) (: explicitly passed context item :) > > @address ! string() (: context item passed implicitly to string#0, which is > > context-dependent) > > @address => string() (: context item passed implicitly to string#1 via the > > => operator, but string#1 is context-independent) > > > > I hope I got it right! > > > > Kind regards, > > Ghislain > > > > > >> On 2 Aug 2017, at 11:27, W.S. Hager <[email protected]> wrote: > >> > >> Hi Michael, > >> > >> The way you used the arrow operator in the example would be the way I > >> expected it to work, namely by explicitly addressing the context, but it > >> seems that it doesn't. It's actually implicitly binding the first argument > >> of the function on the right to the value on the left. Or is there an > >> exception I don't know about? > >> > >> Thanks. > >> > >> Op 1 aug. 2017 18:58 schreef "Michael Kay" <[email protected]>: > >> In the case of singletons there's very little difference, but (as I now > >> see Christian has pointed out), with sequences the effect is quite > >> different. > >> > >> Also, of course, "!" changes the context item, so > >> > >> @address => replace(@postcode, "", "q") works, while > >> > >> @address ! replace(@postcode, "", "q") doesn't. > >> > >> Michael Kay > >> Saxonica > >> > >>> On 1 Aug 2017, at 13:27, W.S. Hager <[email protected]> wrote: > >>> > >>> Hi, > >>> > >>> Is there any advantage to using the 3.1 arrow operator over the simple > >>> map operator? > >>> > >>> $string => upper-case() => normalize-unicode() => tokenize("\s+") > >>> > >>> versus > >>> > >>> $string ! upper-case(.) ! normalize-unicode(.) ! tokenize(.,"\s+") > >>> > >>> Thanks, > >>> Wouter > >>> _______________________________________________ > >>> [email protected] > >>> http://x-query.com/mailman/listinfo/talk > >> > >> > >> _______________________________________________ > >> [email protected] > >> http://x-query.com/mailman/listinfo/talk > > > > > > > > _______________________________________________ [email protected] http://x-query.com/mailman/listinfo/talk
