On Fri, Mar 14, 2003 at 04:32:17PM -0500, John Tobey wrote:
> On Fri, Mar 14, 2003 at 03:49:21PM -0500, Dan Sugalski wrote:
> > At 10:14 AM -0500 3/14/03, Andrew Pimlott wrote:
> > >
> > >A6 says that, as in Perl 5, only anonymous subs are closures. I've
> > >always thought of the fact that Perl 5 named subs are not closures
> > >as a bug kept for compatibility.
> >
> > Well... there's always the issue that closures are done by
> > instantiating the sub at runtime, while named subs are instantiated
> > at compile time, which causes some difficulties. (As the enclosing
> > sub's lexicals instantiate at runtime, thus giving the contained sub
> > nothing to close over)
> >
> > Now, if the named lexically scoped sub actually got re-instantiated
> > every time, *that* would be different.
>
> YES. That's what we want. That is how Scheme and Common Lisp work.
> That would make for cleaner code.
Well, Common Lisp and Scheme don't work quite the same.
(define (f n)
(define (g) n))
in Scheme creates a lexically scoped function g. If it is called
within the body of f, it uses the current (lexical) value of n.
(defun f (n)
(defun g () n))
in Common Lisp greates a globally visible function g when f is run,
and re-defines it every time f is run. So wherever you run it, you
get n from the most recent call to f. If we have
(defun f (n)
(defun g () n)
(if (> n 0)
(f (1- n)))
(g))
then (f 4) returns 0.
To get Scheme behaviour in Lisp, you have to use a different
function:
(defun f (n)
(labels ((g () n))
(if (> n 0)
(f (1- n)))
(g)))
Now (f 4) return 4.
I wouldn't recommend the Lisp behavior. I'm sure the Lisp people
would get rid of it if they didn't have bigger compatibility issues
than Perl. :-)
Andrew
_______________________________________________
Boston-pm mailing list
[EMAIL PROTECTED]
http://mail.pm.org/mailman/listinfo/boston-pm