Xquery: передача функций в качестве аргумента - PullRequest
1 голос
/ 24 марта 2011

Я работаю над проектом xml в Xquery (используя Exist), и мне было интересно, как я могу добиться следующего:
Я хочу создать функцию оценки:
оценить (аргумент, функция)
аргумент здесь может быть любым и должен быть совместим с функцией.
функция является ссылкой на функцию.
некоторые примеры:
оценивать (6, nextPrime) -> newtPrime (6) = 7
define ("text", toCaps) -> toCaps ("text") = TEXT

Возможно ли это или что-то очень похожее в Xquery?И если да, то как?

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 06 апреля 2011

Я не могу рассказать вам о существовании, но у MarkLogic есть функциональные указатели:

xquery version "1.0-ml";

declare function local:upper($str)
{
  fn:upper-case($str)
};

let $function := xdmp:function(xs:QName("local:upper"))
return xdmp:apply($function, "blah")

Оценка этого возвращает BLAH.

1 голос
/ 26 апреля 2011

Дейв был прав, аналогичная поддержка функций высшего порядка найдена в Exist.http://en.wikibooks.org/wiki/XQuery/Higher_Order_Functions Я не использовал существующие механизмы, поскольку QName поддерживает только строковые литералы, и я не смог добиться динамического поведения, которое требовалось для моего приложения.Вместо этого я использовал этот трюк:

declare function moviestat:call1($name, $param){
    let $query := concat($name, "($param)")
    return util:eval($query)
}; 

обратите внимание, что универсальная функция для любого количества аргументов также может быть сделана (но в приложении она не нужна)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...