- From: Benito van der Zander <benito@benibela.de>
- Date: Sun, 6 Dec 2020 19:41:01 +0100
- To: Dimitre Novatchev <dnovatchev@gmail.com>, Michael Kay <mike@saxonica.com>
- Cc: Christian GrĂ¼n <cg@basex.org>, "Liam R. E. Quin" <liam@fromoldbooks.org>, public-xslt-40@w3.org
- Message-ID: <b1eef4ef-1fef-a093-18cc-881fee3a7340@benibela.de>
Hi, this also started as a way to simplify calling the serialize function with its parameters. Do we want a 23-arity serialize function? fn:serialize($arg as item()*, $allow-duplicate-names as ..., $byte-order-mark as ..., $cdata-section-elements as ..., $doctype-public as ..., $doctype-system as ..., $encoding as ..., $escape-uri-attributes as ..., $html-version as ..., $include-content-type as ..., $indent as ..., $item-separator as ..., $json-node-output-method as ..., $media-type as ..., $method as ..., $normalization-form as ..., $omit-xml-declaration as ..., $standalone as ..., $suppress-indentation as ..., $undeclare-prefixes as ..., $use-character-maps as ..., $version as ...) Although what really matters is the method. Perhaps it could be pulled out to create 4 functions: |fn:serializ||e-xml|(|$arg|| as ||item()*|, |$params|| as ||item()?|)| as ||xs:string| |fn:serialize||-html|(|$arg|| as ||item()*|, |$params|| as ||item()?|)| as ||xs:string| |fn:serialize||-xhtml|(|$arg|| as ||item()*|, |$params|| as ||item()?|)| as ||xs:string| || |fn:serialize||-json|(|$arg|| as ||item()*|, |$params|| as ||item()?|)| as ||xs:string||||| Or perhaps look at the map constructor again. When you write map { ... something .. } it is like passing the data between {} to "map". Map kind of behaves like a function turning the data into an actual map. That could be allowed for all functions. So you could write serialize { "method": "xml", ... } Not sure how that should get its $arg. Perhaps $arg => serialize { "method": "xml", ... } Cheers, Benito On 05.12.20 22:01, Dimitre Novatchev wrote: > What about something as simple as this: > > myFunction($arg1 as item()*, $arg2 as xs:integer default: 15, $arg3 as > xs:string default: "Hi") > > This isn't breaking the syntax and semantics of previous versions of > XPath. The arity is 3, not two or one. > > It can be called in these ways: > > myFunction(/*/name) (: will use the defaults for $arg2 and $arg3 :) > > myFunction(/*/name, 12) (: $arg2 is entered as a positional argument > (which is OK), will use the default for $arg3 :) > > myFunction(/*/name, 12, "Yes") (: Both $arg2 and $arg3 are entered as > positional arguments, this is OK :) > > myFunction(/*/name, $arg3: "Yes") (: the default will be used for > $arg2 :) > > myFunction(/*/name, $arg2: 12) (: the default will be used for $arg3 :) > > myFunction(/*/name, $arg3: "Yes", $arg2: 12) (: when an argument is > provided with name and value, order doesn't matter :) > > and even: > > myFunction($arg1: /*/name) (: we can provide a positional argument > using its parameter name :) > > myFunction($arg3: "Yes", $arg2: 12, $arg1: /*/name) (: when an > argument is provided with name and value, order doesn't matter, even > if this is a required, positional parameter :) > > I think this is more or less the ways for calling a method in C# > (https://docs.microsoft.com/en-us/dotnet/csharp/methods > <https://docs.microsoft.com/en-us/dotnet/csharp/methods>). > To quote the same document > (https://docs.microsoft.com/en-us/dotnet/csharp/methods#method-invocation > <https://docs.microsoft.com/en-us/dotnet/csharp/methods#method-invocation>) > > "/You can also use named arguments instead of positional arguments > when invoking a method. When using named arguments, you specify the > parameter name followed by a colon (":") and the argument. Arguments > to the method can appear in any order, as long as all required > arguments are present. /" > > Thanks, > Dimitre > > On Sat, Dec 5, 2020 at 1:16 AM Michael Kay <mike@saxonica.com > <mailto:mike@saxonica.com>> wrote: > >> >> So Mike's example is exactly what i was suggesting before in this >> regard, except i want the keywords to map to named arguments so there >> can be useful static type checking. We would need to allow optional >> arguments for transform() at least, though, and refer to it e.g. as >> fn:transform#* >> > > My only problem with this proposal is whether it can be made > backwards-compatible. I guess that in a strict sense, if a > parameter has to be declared optional before it can be used in > this way, then existing code that doesn't use optional parameters > won't be affected. But at a usability level, if different > functions follow different conventions, then it could make life > difficult for users. > > In the case of system-supplied functions, we've been very careful > in the design to ensure, for example, that format-date#2 and > format-date#5 have consistent syntax and semantics, so we could > simply make the last three parameters optional and turn it into a > single function, and a call with any number of supplied arguments > could bind to format-date#5 without difficulty. For compatibility, > dynamic references to format-date#2 and format-date#5 would still > need to work, and for strict compatibility, > function-arity(format-date#2) would still have to return 2, while > function-arity(format-date#5) returns 5, so they would still be > different functions. > > For user-written functions, it's possible that users haven't > followed the same conventions, and my:ftingle#2 might do something > completely different from my#ftingle#5, so that my:ftingle#2 isn't > equivalent to my:ftingle#5 with optional parameters. This means > that calls on user-defined functions wouldn't be able to use the > new mechanism unless the function definition is changed;. Some > function libraries such as the EXPath file and binary libraries > are unlikely to change in a hurry; and until they do, users would > have to be aware that the new calling mechanism is available for > some function libraries and not for others. > > By contrast, the mechanism I have been proposing of assembling > keyword arguments into a map requires no change to existing > function signatures or implementations. > > Another difference is that my proposal allows the set of accepted > keywords to be dynamic and/or extensible. It's possible with a > Record type definition in the signature to restrict the available > keywords, but you don't have to. The specification of a function > can make it extensible if it chooses (so an implementations might > accept vendor-defined keywords, as in fn:serialize()) and it's > also possible to design functions where the set of keywords is > completely open-ended, for example one could design a function > where the call > > new-element('p') => with-attributes(class: "note", role: > "footnote", date: current-date()) > > accepts any set of names for the attributes of a new element. > > Michael Kay > Saxonica > > > > -- > Cheers, > Dimitre Novatchev > --------------------------------------- > Truly great madness cannot be achieved without significant intelligence. > --------------------------------------- > To invent, you need a good imagination and a pile of junk > ------------------------------------- > Never fight an inanimate object > ------------------------------------- > To avoid situations in which you might make mistakes may be the > biggest mistake of all > ------------------------------------ > Quality means doing it right when no one is looking. > ------------------------------------- > You've achieved success in your field when you don't know whether what > you're doing is work or play > ------------------------------------- > To achieve the impossible dream, try going to sleep. > ------------------------------------- > Facts do not cease to exist because they are ignored. > ------------------------------------- > Typing monkeys will write all Shakespeare's works in 200yrs.Will they > write all patents, too? :) > ------------------------------------- > Sanity is madness put to good use. > ------------------------------------- > I finally figured out the only reason to be alive is to enjoy it.
Received on Sunday, 6 December 2020 18:41:24 UTC