W3C home > Mailing lists > Public > public-qt-comments@w3.org > January 2010

[Bug 8662] [XQuery 1.1] Need an easy way to define a recursive inline function

From: <bugzilla@wiggum.w3.org>
Date: Wed, 06 Jan 2010 18:26:08 +0000
To: public-qt-comments@w3.org
Message-Id: <E1NSaa8-00066d-Mf@wiggum.w3.org>

--- Comment #1 from John Snelson <john.snelson@oracle.com>  2010-01-06 18:26:08 ---
1) Construct to Define Local Recursive Functions

There are two related possibilities here:

a. Allow definition of named, scoped, local functions, ie:

declare function outer($a)
  declare function f1($b)
    $a, f2($b)

  declare function f2($b)
    $b, f1($b)


b. Many functional languages have a recursive "let" whose variables are all in
scope for any of the bound expressions:

letrec $f1 := function($b) { $a, $f2($b) },
       $f2 := function($b) { $b, $f1($b) }
return $f1

I think I'm personally in favour of a solution like this.

2) Reference to self

I dislike the idea of a special named function which is only in scope
sometimes, and has a different type signature depending on where it is in
scope. If we went this route, I would prefer a special variable like $this or
$self of type function(*), which contains a reference to the current function.

Of course as you point out, this would not solve the mutually recursive
function problem.

3) Recursive Global Variables

Another (possibly tangential but related) issue is the rules about not allowing
a global variable that references itself. It seems odd to allow this:

declare function f() { 1, f() };

but not this:

declare variable $f := 1, $f;

Both the function f() and the variable $f evaluate perfectly well on an
implementation using lazy evaluation.

Maybe we could make our prolog rules simpler by allowing variables to refer to

Configure bugmail: http://www.w3.org/Bugs/Public/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the QA contact for the bug.
Received on Wednesday, 6 January 2010 18:26:10 UTC

This archive was generated by hypermail 2.4.0 : Friday, 17 January 2020 16:57:29 UTC