• Stefan Monnier's avatar
    eval.c: New functions `defvar-1` and `defconst-1` (bug#55156) · 80ba4c17
    Stefan Monnier authored
    The bytecode interpreter can't directly call special forms, so
    the byte-compiler usually converts special forms into some sequence of
    byte codes (basically, providing a duplicate definition of the special
    form).  There are still two exceptions to this: `defconst` and `defvar`,
    where the compiler instead generates a convoluted chunk of code like:
    
        (funcall '(lambda (x) (defvar <sym> x <doc>)) <value>)
    
    where the quote makes sure we keep the function non-compiled, so as
    to end up running the special form at run time.
    
    Get rid of this workaround by introducing `defvar-1` and `defconst-1`
    which provide a *functional* interface to the functionality of the
    corresponding special form.
    
    * src/eval.c (defvar, Fdefvar_1, Fdefconst_1): New functions, extracted from
    `Fdefvar` and `Fdefconst`.
    (Fdefvar, Fdefconst): Use them.
    (syms_of_eval): `defsubr` the new functions.
    
    * lisp/emacs-lisp/bytecomp.el (byte-compile-tmp-var): Delete const.
    (byte-compile-defvar): Simplify using the new functions.
    
    * doc/lispref/variables.texi (Defining Variables): Adjust the doc of
    `defvar` to reflect the actual semantics implemented.
    80ba4c17
bytecomp.el 230 KB