Ilya Zakharevich on Thu, 18 Jan 2024 04:54:38 +0100 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: Is it possible to implement closures in PARI? |
On Sun, Jan 14, 2024 at 01:05:41PM +0100, Bill Allombert wrote: > > Currently, PARI supports anonymous subroutines memoizing values of > > lexical variables (at the moment of creation). Is it theoretically > > possible to implement¹⁾ closures instead? — In other words: are > > closures compatible with the PARI⸣s memory model? > > Probably not. The problem is well-documented: > <https://en.wikipedia.org/wiki/Funarg_problem> > > The problem is that the variable scope might end before the closure scope, > so the closure would have a reference to a freed variable, so we would need > smarter memory management than the stack. Sorry, but this situation is quite delicate, so it makes very little sense to discuss matters unless one switches to a pedantic mode. — Which I do now. In this mode, a variable scope CANNOT END before the closure’s scope. By definition of closure! And: in this pedantic mode, one must distinguish scopes of the variable’s name resolution, and the scope of the variable’s “identity”. When a variable can no longer be resolved by name¹⁾, the “scope of its identity” (or: “reachability of its content”) does not end. ¹⁾ Here I ignore the yet-more-delicate question of “how should eval() resolve names”! This scope ends only when a variable’s content cannot be reached via a chain of closures-mentioning-other-closures-etc.-…-mentioning␣this␣variable. ⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜ So I see now: as far as the things come-and-go to/from stack without any warning, one cannot trace when the “scope of the variable’s identity ends” — if it ever was mentioned from a closure. ⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜ > Also it would not be compatible with parallelism, which require closures to > be immutable. In what sense a closure-in-the-sense-of-CS is “mutable”? Thanks, Ilya