1. Save a.el and b.el to the same dir. 2. Open b.el, type M-x eval-buffer. 3. Evaluate (b-foo), see 4 in the echo area. Note that the assertion in `b-bar' succeeds, and so while `a-a' is not globally bound, it's visible from `b-bar'. If I replace the definition of b-bar with ``` (defvar a-a) (defun b-bar () (cl-assert (= a-a 4)) (let ((a-a 5)) (a-bar))) ``` or even with ``` (defun b-bar () (defvar a-a) (cl-assert (= a-a 4)) (let ((a-a 5)) (a-bar))) ``` (which apparently doesn't make `a-a' globally defined in that file, ref. http://debbugs.gnu.org/18059) then, as I'd expect, after M-x eval-buffer, (b-bar) evaluates to 5. Why does this happen? Is (defvar foo) the recommended option to use with lexical-binding on? -- Dmitry