From: Wolfgang M. <wol...@ex...> - 2012-04-17 16:17:38
|
Hello everybody, since last week eXist trunk has complete support for higher-order functions as defined by XQuery 3.0, including nifty things like inline functions, closures and partials. Even though I first had problems to find practical examples for some of those features, I quickly encountered a few situations in my own code where higher-order functions really helped me out ;-) I have thus written an article on the (new) wiki to provide an introduction to each feature, together with an example which actually uses them all: http://demo.exist-db.org/exist/apps/wiki/blogs/eXist/HoF Wolfgang P.S.: the article is on the new wiki, which is still in testing phase. If you find problems accessing the text or mistakes in the code, please email me. |
From: Hungerburg <pc...@my...> - 2012-04-17 22:31:04
|
Am 2012-04-17 18:17, schrieb Wolfgang Meier: > > http://demo.exist-db.org/exist/apps/wiki/blogs/eXist/HoF Thank you Wolfgang, this is great news. Your post reminded me of when I read Higher-Order Perl http://hop.perl.plover.com/ - In my application then it made me immediately spot a bug, that I had not realised before and helped me code a complicated part, I did not have a clear picture of, very concisely. Regards Peter |
From: Florent G. <li...@fg...> - 2012-04-18 21:22:54
|
Wolfgang Meier wrote: Hi, > http://demo.exist-db.org/exist/apps/wiki/blogs/eXist/HoF Great article, thanks Wolfgang! Just one note, about the example for currying: let $f := string-join(?, " ") return $f(("Hello", "world!")) I'm not sure this is the best example possible, because of the "one param sequence with two strings" gotcha. One has to spot (and understand) the meaning of the embedded parens, which is not always abvious to (even not so-) beginners. If one fails to spot it (or to understand it), then one can see two params there... Maybe one of the following could be more clear? let $f := contains(?, 'world') return $f('Hello, world!') or: declare function my:add($lhs as xs:integer, $rhs as xs:integer) as xs:integer { $lhs + $rhs }; let $f := my:add(10, ?) return $f(32) It's good to see articles about new XQuery/XPath/XSLT 3.0 features, especially about first-class citizen functions and higher-order functions! (and to see them implemented in eXist :-p) Regards, -- Florent Georges http://fgeorges.org/ http://h2oconsulting.be/ |
From: Wolfgang M. <wol...@ex...> - 2012-04-19 20:30:39
|
Hi Florent, thanks for your suggestion. I changed the article to use your second example. Actually, the example with contains helped me hit a bug, because fn:contains is rewritten by eXist's optimizer into an expression which is not a subclass of function. I'll need to change this. Wolfgang |