[xquery-talk] arrow operator

Christian Grün christian.gruen at gmail.com
Wed Aug 2 07:30:14 PDT 2017


> 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 <gfourny at 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 <wshager at 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 <wshager at 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 <gfourny at 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 <gfourny at 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 <wshager at 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" <mike at 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 <wshager at 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 at x-query.com
>> > >>> http://x-query.com/mailman/listinfo/talk
>> > >>
>> > >>
>> > >> _______________________________________________
>> > >> talk at x-query.com
>> > >> http://x-query.com/mailman/listinfo/talk
>> > >
>> >
>> >
>> >
>> >
>> >
>> >
>>
>
>
>
> _______________________________________________
> talk at x-query.com
> http://x-query.com/mailman/listinfo/talk


More information about the talk mailing list