Today I discovered that if you re-evaluate a defun using eval-defun
(C-M-x) in a buffer with lexical-binding
set to t
, the defun is recreated as an ordinary lambda, not a closure.
For example, after you evaluate this file:
;;; -*- lexical-binding: t; -*-
(defun foo (x) (lambda (y) (+ x y)))
Then (symbol-function 'foo)
returns
(closure (t) (x) (function (lambda (y) (+ x y))))
But if you put point in the body of the function, press C-M-x, and evaluate (symbol-function 'foo)
again, you get:
(lambda (x) (function (lambda (y) (+ x y))))
Certainly not the same thing, and in fact it throws a void-variable
error when you call the returned function, if x
is not globally bound.
Is this the intended behavior? Do I just need to remember not to use eval-defun
but rather eval-buffer
whenever I modify a function in a file where lexical-binding
is t
?
I'm using Emacs 25.0.50.2.
-*- lexical-binding: t; -*-
cookie after you opened the file, by any chance?