aboutsummaryrefslogtreecommitdiffstats
path: root/etc
diff options
context:
space:
mode:
authorStefan Monnier2024-03-11 16:12:26 -0400
committerStefan Monnier2024-04-18 15:28:36 -0400
commit126be02077520a943252d0d219bb7677466d0168 (patch)
treef762237714f11b303c708f93f09a8dc72426bb2a /etc
parent7842af6095db4384898725fb4a14ebaa11379a34 (diff)
downloademacs-scratch/interpreted-function.tar.gz
emacs-scratch/interpreted-function.zip
Use a dedicated type to represent interpreted-function valuesscratch/interpreted-function
Change `function` so that when evaluating #'(lambda ...) we return an object of type `interpreted-function` rather than a list starting with one of `lambda` or `closure`. The new type reuses the existing PVEC_CLOSURE (nee PVEC_COMPILED) tag and tries to align the corresponding elements: - the arglist, the docstring, and the interactive-form go in the same slots as for byte-code functions. - the body of the function goes in the slot used for the bytecode string. - the lexical context goes in the slot used for the constants of bytecoded functions. The first point above means that `help-function-arglist`, `documentation`, and `interactive-form`s don't need to distinguish interpreted and bytecode functions any more. Main benefits of the change: - We can now reliably distinguish a list from a function value. - `cl-defmethod` can dispatch on `interactive-function` and `closure`. Dispatch on `function` also works now for interpreted functions but still won't work for functions represented as lists or as symbols, of course. - Function values are now self-evaluating. That was alrready the case when byte-compiled, but not when interpreted since (eval '(closure ...)) signals a void-function error. That also avoids false-positive warnings about "don't quote your lambdas" when doing things like `(mapcar ',func ...)`. * src/eval.c (Fmake_interpreted_closure): New function. (Ffunction): Use it and change calling convention of `Vinternal_make_interpreted_closure_function`. (FUNCTIONP, Fcommandp, eval_sub, funcall_general, funcall_lambda) (Ffunc_arity, lambda_arity): Simplify. (funcall_lambda): Adjust to new representation. (syms_of_eval): `defsubr` the new function. Remove definition of `Qclosure`. * lisp/emacs-lisp/cconv.el (cconv-make-interpreted-closure): Change calling convention and use `make-interpreted-closure`. * src/data.c (Fcl_type_of): Distinguish `byte-code-function`s from `interpreted-function`s. (Fclosurep, finterpreted_function_p): New functions. (Fbyte_code_function_p): Don't be confused by `interpreted-function`s. (Finteractive_form, Fcommand_modes): Simplify. (syms_of_data): Define new type symbols and `defsubr` the two new functions. * lisp/emacs-lisp/cl-print.el (cl-print-object) <interpreted-function>: New method. * lisp/emacs-lisp/oclosure.el (oclosure): Refine the parent to be `closure`. (oclosure--fix-type, oclosure-type): Simplify. (oclosure--copy, oclosure--get, oclosure--set): Adjust to new representation. * src/callint.c (Fcall_interactively): Adjust to new representation. * src/lread.c (bytecode_from_rev_list): * lisp/simple.el (function-documentation): * lisp/help.el (help-function-arglist): Remove the old `closure` case and adjust the byte-code case so it handles `interpreted-function`s. * lisp/emacs-lisp/cl-preloaded.el (closure): New type. (byte-code-function): Add it as a parent. (interpreted-function): Adjust parent (the type itself was already added earlier by accident). * lisp/emacs-lisp/bytecomp.el (byte-compile--reify-function): Adjust to new representation. (byte-compile): Use `interpreted-function-p`. * lisp/emacs-lisp/byte-opt.el (byte-compile-inline-expand): Adjust to new representation. (side-effect-free-fns): Add `interpreted-function-p` and `closurep`. * src/profiler.c (trace_hash, ffunction_equal): Simplify. * lisp/profiler.el (profiler-function-equal): Simplify. * lisp/emacs-lisp/nadvice.el (advice--interactive-form-1): Use `interpreted-function-p`; adjust to new representation; and take advantage of the fact that function values are now self-evaluating. * lisp/emacs-lisp/lisp-mode.el (closure): Remove `lisp-indent-function` property. * lisp/emacs-lisp/disass.el (disassemble-internal): Adjust to new representation. * lisp/emacs-lisp/edebug.el (edebug--strip-instrumentation): Use `interpreted-function-p`. * lisp/emacs-lisp/comp-common.el (comp-known-type-specifiers): Add `closurep` and `interpreted-function-p`. * test/lisp/help-fns-tests.el (help-fns-test-lisp-defun): Adjust to more precise type info in `describe-function`. * test/lisp/erc/resources/erc-d/erc-d-tests.el (erc-d--render-entries): Use `interpreted-function-p`. * test/lisp/emacs-lisp/macroexp-resources/vk.el (vk-f4, vk-f5): Don't hardcode function values. * doc/lispref/functions.texi (Anonymous Functions): Don't suggest that function values are lists. Reword "self-quoting" to reflect the fact that #' doesn't return the exact same object. Update examples with the new shape of the return value. * doc/lispref/variables.texi (Lexical Binding): * doc/lispref/lists.texi (Rearrangement): * doc/lispref/control.texi (Handling Errors): Update examples to reflect new representation of function values.
Diffstat (limited to 'etc')
-rw-r--r--etc/NEWS25
1 files changed, 25 insertions, 0 deletions
diff --git a/etc/NEWS b/etc/NEWS
index 78a1307b6a4..7c390d43fa3 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1741,6 +1741,23 @@ documentation and examples.
1741* Incompatible Lisp Changes in Emacs 30.1 1741* Incompatible Lisp Changes in Emacs 30.1
1742 1742
1743+++ 1743+++
1744** Evaluating a 'lambda' returns an object of type 'interpreted-function'.
1745Instead of representing interpreted functions as lists that start with
1746either 'lambda' or 'closure', Emacs now represents them as objects
1747of their own 'interpreted-function' type, which is very similar
1748to 'byte-code-function' objects (the argument list, docstring, and
1749interactive forms are placed in the same slots).
1750Lists that start with 'lambda' are now used only for non-evaluated
1751functions (in other words, for source code), but for backward compatibility
1752reasons, 'functionp' still recognizes them as functions and you can
1753still call them as before.
1754Thus code that attempts to "dig" into the internal structure of an
1755interpreted function's object with the likes of 'car' or 'cdr' will
1756no longer work and will need to use 'aref' used instead to extract its
1757various subparts (when 'interactive-form', 'documentation', and
1758'help-function-arglist' aren't adequate).
1759
1760+++
1744** 'define-globalized-minor-mode' requires that modes use 'run-mode-hooks'. 1761** 'define-globalized-minor-mode' requires that modes use 'run-mode-hooks'.
1745Minor modes defined with 'define-globalized-minor-mode', such as 1762Minor modes defined with 'define-globalized-minor-mode', such as
1746'global-font-lock-mode', will not be enabled any more in those buffers 1763'global-font-lock-mode', will not be enabled any more in those buffers
@@ -1879,6 +1896,14 @@ unibyte string.
1879 1896
1880* Lisp Changes in Emacs 30.1 1897* Lisp Changes in Emacs 30.1
1881 1898
1899** New types 'closure' and 'interpreted-function'.
1900'interpreted-function' is the new type used for interpreted functions,
1901and 'closure' is the common parent type of 'interpreted-function'
1902and 'byte-code-function'.
1903Those new types come with the associated new predicates
1904'closurep' and `interpreted-function-p' as well as a new constructor
1905'make-interpreted-closure'.
1906
1882** New function 'help-fns-function-name'. 1907** New function 'help-fns-function-name'.
1883For named functions, it just returns the name and otherwise 1908For named functions, it just returns the name and otherwise
1884it returns a short "unique" string that identifies the function. 1909it returns a short "unique" string that identifies the function.