- From: Dimitre Novatchev <dnovatchev@gmail.com>
- Date: Wed, 2 Dec 2020 12:33:15 -0800
- To: Michael Kay <mike@saxonica.com>
- Cc: Christian Grün <cg@basex.org>, public-xslt-40@w3.org, Dimitre Novatchev <dnovatchev@gmail.com>
- Message-ID: <CAK4KnZfL0e5MmmyB-WdM3DGKYN0+D5hOdpkcMEQBSEujE00hYg@mail.gmail.com>
So, we already have two different existing ways for this, and now we are adding a 3rd one ! I don't see any specification for slice() in the F&O document, maybe it provides some useful functionality beyond what can be done with subsequence and predicates. For example, if: slice($seq, -1, -$N) produces the reversed subsequence (starting from the last item, then this may be useful. Thanks, Dimitre On Wed, Dec 2, 2020 at 9:29 AM Michael Kay <mike@saxonica.com> wrote: > The inspiration for slice() came from JSONPath, which itself appears to > have got it from Python. > > We could devise custom syntax for the operation, for example $input[start > ; end (; step)] but a function seems more powerful and just as usable. > > The main problem with relying on predicates for positional subscripting is > the fact that the context changes in the predicate, which means that when > you write things like > > (1 to $N) ! (first-names[.] || last-names[.]) > > it doesn't do at all what you intended. > > Similarly $input[$N] doesn't do what you intended if $N is a node that > needs to be atomized (classic pitfall in XSLT when you do > <xsl:variable><xsl:value-of select="$N+1"/></xsl:variable> - though we > won't train them out of that if we haven't already). > > In addition doing commonly-needed things like $input[position() mod 2 = 0] > is just really clumsy. > > subsequence() doesn't have the problems of the context changing, but > writing subsequence($input, $N, 1) to get the item at position N is > terribly long-winded compared with the equivalent in other languages, and > the fact that it allows non-integer values also complicates the > implementation no end, as well as making errors harder to debug. > > Typical example today: > > <xsl:for-each select="first-names"> > <xsl:variable name="p" select="position()"/> > <xsl:value-of select=". || last-names[$p]"/> > </xsl:for-each> > > With slice: > first-names ! (. || last-names => slice(position())) > > (OK, there's another solution using for-each-pair - but the more you use > higher-order-functions, the more useful it is to deliver functionality > using functions rather than custom syntax.) > > Michael Kay > Saxonica > > On 2 Dec 2020, at 15:27, Dimitre Novatchev <dnovatchev@gmail.com> wrote: > > > slice($seq, -1) to get the last item > > > slice($seq, $N) to get the Nth item > > > slice($seq, 1 to count($seq)-1) to get all but the last > > -10 ! > > $seq[last()] > > $seq[$n] > > $seq[position() lt last()] > > All of these are shorter than the proposed expressions containing slice() > ! Why bother learn a new name and why pollute the function-name space? > > This is just an example where we are going counter - Exupery and with > close to no justification. > > We also have another good friend: > subsequence() > > > Thanks, > Dimitre > > > On Wed, Dec 2, 2020 at 3:16 AM Michael Kay <mike@saxonica.com> wrote: > >> The latest version allows >> >> slice($seq, -1) to get the last item >> >> slice($seq, $N) to get the Nth item >> >> slice($seq, 1 to count($seq)-1) to get all but the last >> >> and I thought that was probably good enough to make the individual >> functions unnecessary. >> >> Would you agree? >> >> Michael Kay >> Saxonica >> >> On 2 Dec 2020, at 10:30, Christian Grün <cg@basex.org> wrote: >> >> Hi Michael, >> >> In your first public XQFO proposal [1], I have found seen three >> functions (fn:foot, fn:truncate, fn:item-at) that have not made it >> into the latest specification documents. Are you still working on it, >> or did you deliberately decide not to include them in the new draft? >> >> Thanks, >> Christian >> >> [1] https://www.saxonica.com/qt4specs/FO/Overview-diff.html >> >> >> > > > On 2 Dec 2020, at 15:29, Dimitre Novatchev <dnovatchev@gmail.com> wrote: > > > slice($seq, -1) to get the last item > > > slice($seq, $N) to get the Nth item > > > slice($seq, 1 to count($seq)-1) to get all but the last > > -10 ! > > $seq[last()] > > $seq[$n] > > $seq[position() lt last()] > > All of these are shorter than the proposed expressions containing slice() > ! Why bother learn a new name and why pollute the function-name space? > > This is just an example where we are going counter - Exupery and with > close to no justification. > > We also have another good friend: > subsequence() > > > Thanks, > Dimitre > > On Wed, Dec 2, 2020 at 3:16 AM Michael Kay <mike@saxonica.com> wrote: > >> The latest version allows >> >> slice($seq, -1) to get the last item >> >> slice($seq, $N) to get the Nth item >> >> slice($seq, 1 to count($seq)-1) to get all but the last >> >> and I thought that was probably good enough to make the individual >> functions unnecessary. >> >> Would you agree? >> >> Michael Kay >> Saxonica >> >> On 2 Dec 2020, at 10:30, Christian Grün <cg@basex.org> wrote: >> >> Hi Michael, >> >> In your first public XQFO proposal [1], I have found seen three >> functions (fn:foot, fn:truncate, fn:item-at) that have not made it >> into the latest specification documents. Are you still working on it, >> or did you deliberately decide not to include them in the new draft? >> >> Thanks, >> Christian >> >> [1] https://www.saxonica.com/qt4specs/FO/Overview-diff.html >> >> >> > > >
Received on Wednesday, 2 December 2020 20:33:41 UTC