Re: Bounded-variadic functions and focus-dependence

Indeed, it's an open question what the context for evaluation of a default parameter value expression should be.

We've started implementing core functions in XSLT (for portability), so we would like to eliminate the situation where core functions can depend on the context in a way that is not allowed for user-defined functions. A common case is an argument whose default value depends on the default collation in the static context of the caller. 

A simple rule that default value expressions are evaluated in the context of the caller doesn't work, however: we wouldn't want to allow it to reference local variables in the caller's context, or (thinking XSLT packages) private functions in the calling package.

Michael Kay
Saxonica

> On 12 Dec 2020, at 11:33, Reece Dunn <msclrhd@googlemail.com> wrote:
> 
> A ·focus-dependent· function is a function that accepts the current path focus (context item `.`) as a parameter to the function. Currently this is only supported for built-in functions, but could be useful for user-defined functions.
> 
> Bounded-variadic functions offer a way of doing this succinctly without any extension to the existing syntax. The logic would be:
> 
> > If an argument has a default expression equal to the context item, or an expression using the context item (e.g. `./test`), the context item is evaluated at the point at which that argument is evaluated (either from a function call, or a partial function application).
> 
> This would allow the Functions and Operators specification to use this to define the ·focus-dependent· functions like:
> 
>     fn:string($arg as item()? := .) as xs:string
> 
> Note #1: I'm not restricting this to just the context item to support things like:
> 
>     declare function to-xsdate($year := ./year, $month := ./month, $day := ./day) {};
> 
> so the following is possible:
> 
>     to-xsdate(2020, 12, 10), $doc//date/to-xsdate()
> 
> Note #2: I think it makes sense to have the static context bind at the function declaration, and the dynamic context bind at the call site (where the argument is passed to the parameter).
> 
> Note #3: I'm not sure whether defaults that depend on parameters declared earlier should be valid or not. For example:
> 
>     declare function f($a, $b := $a * 2) {};
> 
> Kind regards,
> Reece

Received on Saturday, 12 December 2020 21:56:13 UTC