From: Efraim F. <efr...@gm...> - 2012-04-22 19:13:22
|
Hi, Wolfgang's article on HOF in eXist 2.0/XQuery 3.0 is quite helpful. I have one syntax question. If I declare a function: declare function local:f($func as function(xs:string) as item()?) I think I'm declaring a function local:f with parameter $func of type "function that returns zero or one item()s." How do I declare a function local:f with a parameter $func of type "zero or one functions that returns an item()" or "zero or one functions returning zero or one item()s?" Thanks, -- --- Efraim Feinstein Lead Developer Open Siddur Project http://opensiddur.net http://wiki.jewishliturgy.org |
From: Wolfgang M. <wol...@ex...> - 2012-04-22 20:09:14
|
Hi, > How do I declare a function local:f with a parameter $func of type "zero > or one functions that returns an item()" or "zero or one functions > returning zero or one item()s?" An interesting question. I haven't thought about it before, but according to the grammar, I would write it as follows: declare function local:f($func as function(xs:string) as item()??) This works with eXist and saxon. Wolfgang |
From: Efraim F. <efr...@gm...> - 2012-04-22 20:22:36
|
Hi, On 04/22/2012 04:09 PM, Wolfgang Meier wrote: > Hi, > >> How do I declare a function local:f with a parameter $func of type "zero >> or one functions that returns an item()" or "zero or one functions >> returning zero or one item()s?" > An interesting question. I haven't thought about it before, but > according to the grammar, I would write it as follows: > > declare function local:f($func as function(xs:string) as item()??) I'm glad that works! How would the grammar tell the difference between "zero or one functions returning an item()" and "one function returning zero or one item()s"? -- --- Efraim Feinstein Lead Developer Open Siddur Project http://opensiddur.net http://wiki.jewishliturgy.org |
From: Wolfgang M. <wol...@ex...> - 2012-04-22 20:33:56
|
> How would the grammar tell the difference between "zero or one functions > returning an item()" and "one function returning zero or one item()s"? I would say the function() test takes precedence (since the expression is parsed from left to right), so if there's only one occurrence indicator, it would be interpreted as being part of the function test. I would thus read "one function returning zero or one item()s". Here's the corresponding section from the XQuery EBNF. A function test is a SequenceType: [166] SequenceType ::= ("empty-sequence" "(" ")") | (ItemType OccurrenceIndicator?) [167] OccurrenceIndicator ::= "?" | "*" | "+" [168] ItemType ::= KindTest | ("item" "(" ")") | FunctionTest | AtomicOrUnionType | ParenthesizedItemType [189] FunctionTest ::= Annotation* (AnyFunctionTest | TypedFunctionTest) [190] AnyFunctionTest ::= "function" "(" "*" ")" [191] TypedFunctionTest ::= "function" "(" (SequenceType ("," SequenceType)*)? ")" "as" SequenceType Wolfgang |
From: Efraim F. <efr...@gm...> - 2012-04-22 23:16:04
|
On 04/22/2012 04:33 PM, Wolfgang Meier wrote: >> How would the grammar tell the difference between "zero or one functions >> returning an item()" and "one function returning zero or one item()s"? > I would say the function() test takes precedence (since the expression > is parsed from left to right), so if there's only one occurrence > indicator, it would be interpreted as being part of the function test. > I would thus read "one function returning zero or one item()s". Thanks. It looks like there is then no way to uniquely specify "zero or one functions returning exactly one item." I guess you could kluge it as "function() as item()+?" since it won't result in a runtime error, but it's not quite correct. Is this a bug in the XQuery 3.0 spec? -- --- Efraim Feinstein Lead Developer Open Siddur Project http://opensiddur.net http://wiki.jewishliturgy.org |
From: Efraim F. <efr...@gm...> - 2012-04-24 21:10:45
|
Hi, On 04/24/2012 10:56 AM, Gunther Rademacher wrote: > Efraim Feinstein wrote >> It looks like there is then no way to uniquely specify "zero or >> one functions returning exactly one item." >> > That's what a ParenthesizedItemType is for: > > (function() as item())? > > Also note that the 3.0 spec has an "extra-grammatical constraint" on > occurrence indicators covering this: > > http://www.w3.org/TR/xquery-30/#parse-note-occurrence-indicators > Thanks! That would seem to solve the problem from the spec's perspective. As far as I can tell, the syntax is not supported in eXist (as of 2.0 preview r16247). (Example test code: xquery version "3.0"; declare function local:f($a as (function() as xs:string)?) { if (exists($a)) then $a() else "b" }; local:f(()) ) -- --- Efraim Feinstein Lead Developer Open Siddur Project http://opensiddur.net http://wiki.jewishliturgy.org |
From: Efraim F. <efr...@gm...> - 2012-04-24 21:13:30
|
On 04/24/2012 05:10 PM, Efraim Feinstein wrote: > > Thanks! That would seem to solve the problem from the spec's > perspective. As far as I can tell, the syntax is not supported in > eXist (as of 2.0 preview r16247). By which I mean r16274 (typo!) -- --- Efraim Feinstein Lead Developer Open Siddur Project http://opensiddur.net http://wiki.jewishliturgy.org |
From: Wolfgang M. <wol...@ex...> - 2012-04-24 21:47:50
|
> Thanks! That would seem to solve the problem from the spec's > perspective. As far as I can tell, the syntax is not supported in eXist > (as of 2.0 preview r16247). That's because I must have overlooked the parenthesized sequence type rule when reading the spec ;-) It is only mentioned in one short sentence in the text, so it never came to my attention. Thanks for pointing this out. Wolfgang |