Skip to content

Instantly share code, notes, and snippets.

@xquery
Created May 4, 2011 05:57
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save xquery/954816 to your computer and use it in GitHub Desktop.
Save xquery/954816 to your computer and use it in GitHub Desktop.
Inline caching (memoization) for higher order xquery functions
xquery version "1.0-ml";
(: xquery memoization example for use with MarkLogic :)
declare variable $cache := map:map();
declare function local:factorial($n as xs:integer) as xs:integer {
if ($n < 0) then
(0)
else if ($n = 0) then
(1)
else
$n * local:factorial($n - 1)
};
declare function local:memoize($func,$var){
let $key := xdmp:md5(concat($func,string($var)))
return
if(map:get($cache,$key)) then
(map:get($cache,$key), xdmp:log('cache hit'))
else
let $result := xdmp:apply($func,$var)
return
(map:put($cache,$key,$result), $result)
};
let $memoize := xdmp:function(xs:QName("local:memoize"))
let $factorial := xdmp:function(xs:QName("local:factorial"))
let $a:= xdmp:apply($memoize, $factorial, 20)
let $b:= xdmp:apply($memoize, $factorial, 20)
let $c:= xdmp:apply($memoize, $factorial, 20)
let $d:= xdmp:apply($memoize, $factorial, 20)
let $e:= xdmp:apply($memoize, $factorial, 20)
return
$a
@freshie
Copy link

freshie commented Oct 5, 2013

neat. Makes me not feel so bad about using maps in functional programming. Is Marklogic's Xquery engine/compiler smart enough to know that its memorization?

@lsharada
Copy link

Does this work with marklogic without problems

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment