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

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

Re: Real-life examples of lexical binding in Emacs Lisp


From: Andreas Röhler
Subject: Re: Real-life examples of lexical binding in Emacs Lisp
Date: Fri, 29 May 2015 19:16:58 +0200
User-agent: Mozilla/5.0 (X11; Linux i686; rv:31.0) Gecko/20100101 Thunderbird/31.4.0


Am 29.05.2015 um 14:28 schrieb Pascal J. Bourguignon:
Marcin Borkowski <mbork@mbork.pl> writes:

Hi all,

I googled a bit, and could not find /real-world/ examples of using
lexical binding and its advantages /in Emacs Lisp/.  I understand that
it's a nice thing to be able to create closures, and that lexical
binding is in general faster than dynamic binding (which is a bonus in
itself), but could anyone show me a real /text editing/ problem that
lexical binding solves, like something that is easier done with
l.b. than with d.b.?  (Examples of general-purpose programming problems
made easier with l.b. are more or less obvious/easy to find, but Emacs
is a text editor, after all, and this is its primary area.)
Lexical binding matters for two things:

- it allows the creation of closures.
- it prevents the clobbering of variables.


Closures:

     A typical example, is visible in the thread "~`symbol-function' to
     get code as list even when byte-compiled?":

     ;;;; -*- mode:emacs-lisp;lexical-binding:t;coding:utf-8 -*-
     (defun add-one-shot-meat (hook fun)
       (let ((name (gensym)))
         (setf (symbol-function name)
               (lambda ()
                 (remove-hook hook name)
                 (funcall fun)))
         (add-hook hook name)))

     Without lexical binding, fun and hook would be dynamic, and
     therefore their bindings would disappear when add-one-shot-meat
     returns.  Therefore they would be undefined variable when the
     function is called, or worse, they may be bound at that time by some
     other function to something different.

     Compare:

         (setf lexical-binding t)

         (defun e (f)
           (let ((v 42))
              (funcall f)))

         (let ((v 33))
           (e (lambda () v)))

         --> 33


         (setf lexical-binding nil)

         (defun e (f)
           (let ((v 42))
              (funcall f)))

         (let ((v 33))
           (e (lambda () v)))

         --> 42



Thanks a lot all! Will take some time to work through the examples given.

Cheers,

Andreas



reply via email to

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