W3C home > Mailing lists > Public > public-qt-comments@w3.org > April 2013

[Bug 21797] New: Ordering of parameters in '16.2 Basic higher-order functions'

From: <bugzilla@jessica.w3.org>
Date: Tue, 23 Apr 2013 17:45:04 +0000
To: public-qt-comments@w3.org
Message-ID: <bug-21797-523@http.www.w3.org/Bugs/Public/>
https://www.w3.org/Bugs/Public/show_bug.cgi?id=21797

            Bug ID: 21797
           Summary: Ordering of parameters in '16.2 Basic higher-order
                    functions'
    Classification: Unclassified
           Product: XPath / XQuery / XSLT
           Version: Candidate Recommendation
          Hardware: All
                OS: All
            Status: NEW
          Severity: minor
          Priority: P2
         Component: Functions and Operators 3.0
          Assignee: mike@saxonica.com
          Reporter: adam@exist-db.org
        QA Contact: public-qt-comments@w3.org

At present the following functions all apply a function to each item in a
sequence, which yields a new sequence (NOTE - fn:map-pairs applies the function
to two sequences).

fn:map
fn:filter
fn:fold-left
fn:fold-right
fn:map-pairs

However, the first argument is always the function at the moment. This is fine
for named functions, however for anonymous/inline functions this can perhaps
make your XQuery code harder to read. I propose moving the function argument
from the first argument of each of the above functions to the last argument.


Example 1, function argument first (current approach in spec.) -

map(function($x) {$x * 2 }, $sequence)


Example 2, function argument last (proposal) -

map($sequence, function($x) {$x * 2 })


There is not perhaps not too much discernible difference above, but as the
anonymous/inline functions become longer and more complex, it gets harder to
see what you are operating on using the current approach in the spec:

Example 3, function argument first (current approach in spec.) -

map(
  function($pos as element(pos)) {
    let $y := sin($pos/angle),
    $dy := $y * $pos/angular-distance,
    $all := ($dy, $known-distances),

    $mean := avg($all),
    $sq-diff := map(
       function($x) {
          let $res := $x - $mean
            return $x * $x
       },
       $all

    ) return
      mean($sq-diff)
  },
  $sequence
)

Example 4, function argument last (proposal) - 

map($sequence, function($pos as element(pos)) {
    let $y := sin($pos/angle),
    $dy := $y * $pos/angular-distance,
    $all := ($dy, $known-distances),

    $mean := avg($all),
    $sq-diff := map($all, function($x) {
       let $res := $x - $mean return
          $x * $x
    }) return
       mean($sq-diff)
})

Having the function argument last leads to a much more natural way of writing
code IMHO and also easier to read code. I can always see very quickly what I am
mapping because its the first argument in the map function. Also when using
anonymous functions in other functions, its easier to see where they finish and
similar to languages such as Scala and Javascript, because you have a final
"})"

-- 
You are receiving this mail because:
You are the QA Contact for the bug.
Received on Tuesday, 23 April 2013 17:45:06 UTC

This archive was generated by hypermail 2.3.1 : Wednesday, 7 January 2015 15:45:52 UTC