- From: Benito van der Zander <benito@benibela.de>
- Date: Mon, 31 Mar 2025 01:40:50 +0200
- To: public-xslt-40@w3.org
- Message-ID: <8bc39b71-404b-47f8-81f2-46b9073e0541@benibela.de>
Hi, there are also xidel <https://videlibri.de/cgi-bin/xidelcgi> example <https://videlibri.de/cgi-bin/xidelcgi?&data=%3Cinput%2F%3E&=%3Cinput%2F%3E&extract=%0Alet%20%24fact-base%20%3A%3D%20function(%24n%20as%20xs%3Ainteger%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24f1%20as%20function(xs%3Ainteger%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20function(*))%20as%20xs%3Ainteger%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%20as%20xs%3Ainteger%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%7Bif(%24n%20eq%200)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20then%201%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%20%24n%20*%20%24f1(%24n%20-1%2C%20%24f1)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%24Fact%20%3A%3D%20function(%24n%20as%20xs%3Ainteger)%20as%20xs%3Ainteger%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24fact-base(%24n%2C%20%24fact-base)%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20return%0A%20%20%20%20%20%20%20%20%20%20%20%24Fact(5)%0A&=&input-format=auto&printed-node-format=text&output-format=adhoc&compatibility=Standard%20XQuery&dot-notation=off&extract-kind=xpath3.1&no-extended-strings=true&no-json=true&no-json-literals=true&only-json-objects=true&strict-type-checking=true&strict-namespaces=true&case-sensitive=true> Sincerely, Benito On 29.03.25 15:52, Martin Honnen wrote: > > > Am 29.03.2025 um 15:39 schrieb Dimitre Novatchev: >> There is a way to use recursion with anonymous (inline) functions in >> pure XPath 3, and I reported it in my blog and at the Balisage 2013 >> conference. >> Since then, I have built my own, pure XPath 3.1 function libraries >> using this technique. >> >> Here is a simple example: >> >> let $fact-base := function($n as xs:integer, >> $f1 as function(xs:integer, >> function(*)) as xs:integer >> ) as xs:integer >> {if($n eq 0) >> then 1 >> else $n * $f1($n -1, $f1) >> >> }, >> $Fact := function($n as xs:integer) as xs:integer >> { >> $fact-base($n, $fact-base) >> } >> >> return >> $Fact(5) >> >> One can run it with BaseX or with Oxygen, or directly online with >> BaseX Fiddle: https://fiddle.basex.org/. > > > XPath 3.1 online evaluation is also possible at the SaxonJS powered > XPath 3.1 fiddle <https://martin-honnen.github.io/xpath31fiddle/>, > example fiddle > <https://martin-honnen.github.io/xpath31fiddle/?xpath=let+%24fact-base+%3A%3D+function%28%24n+as+xs%3Ainteger%2C%0D%0A+++++++++++++++++++%24f1+as+function%28xs%3Ainteger%2C%0D%0A+++++++++++++++++++function%28*%29%29+as+xs%3Ainteger%0D%0A+++++++++++++++++++%29+as+xs%3Ainteger%0D%0A+++++++++++++%7Bif%28%24n+eq+0%29%0D%0A+++++++++++++++++then+1%0D%0A+++++++++++++++++else+%24n+*+%24f1%28%24n+-1%2C+%24f1%29%0D%0A%0D%0A++++++++++++++%7D%2C%0D%0A++++%24Fact+%3A%3D+function%28%24n+as+xs%3Ainteger%29+as+xs%3Ainteger%0D%0A++++++++++++%7B%0D%0A++++++++++++++++%24fact-base%28%24n%2C+%24fact-base%29%0D%0A++++++++++++%7D%0D%0A%0D%0A+++return%0D%0A+++++++++++%24Fact%285%29&input=&input-type=None>, > and the CheerpJ and Saxon 12 powered XML workbench > <https://martin-honnen.github.io/cheerpj3-saxonhe12-fiddle/>, example > fiddle > <https://martin-honnen.github.io/cheerpj3-saxonhe12-fiddle/?code=let+%24fact-base+%3A%3D+function%28%24n+as+xs%3Ainteger%2C%0D%0A+++++++++++++++++++%24f1+as+function%28xs%3Ainteger%2C%0D%0A+++++++++++++++++++function%28*%29%29+as+xs%3Ainteger%0D%0A+++++++++++++++++++%29+as+xs%3Ainteger%0D%0A+++++++++++++%7Bif%28%24n+eq+0%29%0D%0A+++++++++++++++++then+1%0D%0A+++++++++++++++++else+%24n+*+%24f1%28%24n+-1%2C+%24f1%29%0D%0A%0D%0A++++++++++++++%7D%2C%0D%0A++++%24Fact+%3A%3D+function%28%24n+as+xs%3Ainteger%29+as+xs%3Ainteger%0D%0A++++++++++++%7B%0D%0A++++++++++++++++%24fact-base%28%24n%2C+%24fact-base%29%0D%0A++++++++++++%7D%0D%0A%0D%0A+++return%0D%0A+++++++++++%24Fact%285%29&input=&code-type=XPath&input-type=None>. >
Received on Sunday, 30 March 2025 23:40:58 UTC