> This I understand, but the only thing that bothers me is that the implicit > binding of the first argument prevents the use of other arguments, whereas > an explicit context would've allowed for the more flexible option of > designating the argument yourself, while the arity would read more clearly: > > $position => array:remove($array, .)
A similar proposal was discussed in the W3 Bugzilla tracker some time ago: https://www.w3.org/Bugs/Public/show_bug.cgi?id=26889 The majority of the W3 members voted for the initial proposal. Here is yet another related idea that ended up in the 3.2 backlog: https://www.w3.org/Bugs/Public/show_bug.cgi?id=29393 > 2017-08-02 16:08 GMT+02:00 Ghislain Fourny <gfou...@inf.ethz.ch>: >> >> 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 <wsha...@gmail.com> 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 <wsha...@gmail.com>: >> > 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 <gfou...@inf.ethz.ch>: >> > ... 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 <gfou...@inf.ethz.ch> 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 <wsha...@gmail.com> 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" <m...@saxonica.com>: >> > >> 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 <wsha...@gmail.com> 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 >> > >>> _______________________________________________ >> > >>> talk@x-query.com >> > >>> http://x-query.com/mailman/listinfo/talk >> > >> >> > >> >> > >> _______________________________________________ >> > >> talk@x-query.com >> > >> http://x-query.com/mailman/listinfo/talk >> > > >> > >> > >> > >> > >> > >> > >> > > > > _______________________________________________ > talk@x-query.com > http://x-query.com/mailman/listinfo/talk _______________________________________________ talk@x-query.com http://x-query.com/mailman/listinfo/talk