help-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Returning variable "references" under lexical binding


From: Sean McAfee
Subject: Re: Returning variable "references" under lexical binding
Date: Tue, 21 May 2013 09:38:15 -0700
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.1 (gnu/linux)

Barry Margolin <barmar@alum.mit.edu> writes:
> But it's not the same lexical variable in your example. Each time you 
> call start-my-timer you're creating a new closure over that variable. 
> The caller has to save that closure somewhere, so that it can pass it to 
> cancel-my-timer later. There's no functional difference between that and 
> saving the timer itself.

Sure there is.  OK, forget about timers, let's go even simpler:

;; -*- lexical-binding: t; -*-

(defun return-variable-n ()
  (let ((n 1))
    (in-five-seconds (lambda () (setq n 2)))
    SOMETHING))

(setq foo (return-variable-n))

I want to return SOMETHING such that if I inspect it immediately, I'll
get 1, but if I save it and inspect it after five seconds have passed,
I'll get 2.  SOMETHING can't be just "n", because the function returns
by value and foo would only ever contain 1.

Similarly, in my original code, I can't just return "timer", because the
calling code would only ever see the very first timer created, and would
not be able to see the new values for timer that the callbacks store
later.

Without lexical variables, I could do this:

(defun return-variable-n ()
  (let ((n (gensym)))
    (set n 1)
    (in-five-seconds (lambda () (set n 2)))
    n))

...and then get the current value of n using symbol-value.

Using lexical variables, SOMETHING can be (lambda () n), which can be
called to get the current value of n at all times.

My question was whether other methods exist, and which is best, for
reasonable definitions of "best."


reply via email to

[Prev in Thread] Current Thread [Next in Thread]