I bumped into some surprising function behavior. I have the following query:
declare namespace math = "java:java.lang.Math"; declare function local:choose-phrase ( $phrase as xs:string ) as xs:string { let $prefix := local:choose( ("Absolutely, ", "It's likely that ", "The odds are good that ", "There's a fairly good chance that ", "There's a light chance that ", "It's uncertain that ", "Chances are not good that ", "It's doubtful that ", "It's unlikely that ", "There's no way that ") ) return fn:concat($prefix,$phrase) }; declare function local:choose ( $arg as xs:string* ) as xs:string { let $count := fn:count($arg) let $random := math:floor(math:random() * $count) + 1 return $arg[xs:integer($random)] }; local:choose( ( "Phrase 1", "Phrase 2" ) )
When I execute this (say in the GUI tool) it's supposed print either "Phrase 1" or "Phrase 2". Instead it prints a random choice from the function 'choose-phrase' as if it was called with an empty string as argument, which is very strange.
When I remove the 'choose-phrase' function altogether, the query behaves correctly. If I then paste the 'choose-phrase' after the 'choose' function, it also behaves correctly. But declaring 'choose-phrase' before 'choose' gives me an unexpected result.
The only thing I can think of is that 'choose-phrase' calls 'choose' which is declared later. I don't know if that's actually allowed. But even so, it should give an error instead of seemingly doing something random.
Hi Mark,
I've tried your query, and it returns the correct result on my machine ("Phrase1" or "Phrase 2").
If you are working with version 6.1, please have a look at the latest version as well. The link to version 6.3.2 can now be found at:
The next official version (along with all OS flavors and an overall updated homepage) will definitely be released in January '11.
Christian
On Tue, Nov 30, 2010 at 2:39 AM, Mark Boon mboon@avatar-reality.com wrote:
I bumped into some surprising function behavior. I have the following query:
declare namespace math = "java:java.lang.Math"; declare function local:choose-phrase ( $phrase as xs:string ) as xs:string { let $prefix := local:choose( ("Absolutely, ", "It's likely that ", "The odds are good that ", "There's a fairly good chance that ", "There's a light chance that ", "It's uncertain that ", "Chances are not good that ", "It's doubtful that ", "It's unlikely that ", "There's no way that ") ) return fn:concat($prefix,$phrase) }; declare function local:choose ( $arg as xs:string* ) as xs:string { let $count := fn:count($arg) let $random := math:floor(math:random() * $count) + 1 return $arg[xs:integer($random)] }; local:choose( ( "Phrase 1", "Phrase 2" ) )
When I execute this (say in the GUI tool) it's supposed print either "Phrase 1" or "Phrase 2". Instead it prints a random choice from the function 'choose-phrase' as if it was called with an empty string as argument, which is very strange.
When I remove the 'choose-phrase' function altogether, the query behaves correctly. If I then paste the 'choose-phrase' after the 'choose' function, it also behaves correctly. But declaring 'choose-phrase' before 'choose' gives me an unexpected result.
The only thing I can think of is that 'choose-phrase' calls 'choose' which is declared later. I don't know if that's actually allowed. But even so, it should give an error instead of seemingly doing something random.
basex-talk@mailman.uni-konstanz.de