diff options
| author | Stefan Monnier | 2024-03-11 16:12:26 -0400 |
|---|---|---|
| committer | Stefan Monnier | 2024-04-18 15:28:36 -0400 |
| commit | 126be02077520a943252d0d219bb7677466d0168 (patch) | |
| tree | f762237714f11b303c708f93f09a8dc72426bb2a /doc/lispref/objects.texi | |
| parent | 7842af6095db4384898725fb4a14ebaa11379a34 (diff) | |
| download | emacs-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 'doc/lispref/objects.texi')
| -rw-r--r-- | doc/lispref/objects.texi | 38 |
1 files changed, 25 insertions, 13 deletions
diff --git a/doc/lispref/objects.texi b/doc/lispref/objects.texi index aa1e073042f..cf703aba9c8 100644 --- a/doc/lispref/objects.texi +++ b/doc/lispref/objects.texi | |||
| @@ -244,7 +244,7 @@ latter are unique to Emacs Lisp. | |||
| 244 | * Macro Type:: A method of expanding an expression into another | 244 | * Macro Type:: A method of expanding an expression into another |
| 245 | expression, more fundamental but less pretty. | 245 | expression, more fundamental but less pretty. |
| 246 | * Primitive Function Type:: A function written in C, callable from Lisp. | 246 | * Primitive Function Type:: A function written in C, callable from Lisp. |
| 247 | * Byte-Code Type:: A function written in Lisp, then compiled. | 247 | * Closure Type:: A function written in Lisp. |
| 248 | * Record Type:: Compound objects with programmer-defined types. | 248 | * Record Type:: Compound objects with programmer-defined types. |
| 249 | * Type Descriptors:: Objects holding information about types. | 249 | * Type Descriptors:: Objects holding information about types. |
| 250 | * Autoload Type:: A type used for automatically loading seldom-used | 250 | * Autoload Type:: A type used for automatically loading seldom-used |
| @@ -1458,18 +1458,24 @@ with the name of the subroutine. | |||
| 1458 | @end group | 1458 | @end group |
| 1459 | @end example | 1459 | @end example |
| 1460 | 1460 | ||
| 1461 | @node Byte-Code Type | 1461 | @node Closure Type |
| 1462 | @subsection Byte-Code Function Type | 1462 | @subsection Closure Function Type |
| 1463 | 1463 | ||
| 1464 | @dfn{Byte-code function objects} are produced by byte-compiling Lisp | 1464 | @dfn{Closures} are function objects produced when turning a function |
| 1465 | code (@pxref{Byte Compilation}). Internally, a byte-code function | 1465 | definition into a function value. Closures are used both for |
| 1466 | object is much like a vector; however, the evaluator handles this data | 1466 | byte-compiled Lisp functions as well as for interpreted Lisp functions. |
| 1467 | type specially when it appears in a function call. @xref{Byte-Code | 1467 | Closures can be produced by byte-compiling Lisp code (@pxref{Byte |
| 1468 | Objects}. | 1468 | Compilation}) or simply by evaluating a lambda expression without |
| 1469 | compiling it, resulting in an interpreted function. Internally, | ||
| 1470 | a closure is much like a vector; however, the evaluator | ||
| 1471 | handles this data type specially when it appears in a function call. | ||
| 1472 | @xref{Closure Objects}. | ||
| 1469 | 1473 | ||
| 1470 | The printed representation and read syntax for a byte-code function | 1474 | The printed representation and read syntax for a byte-code function |
| 1471 | object is like that for a vector, with an additional @samp{#} before the | 1475 | object is like that for a vector, with an additional @samp{#} before the |
| 1472 | opening @samp{[}. | 1476 | opening @samp{[}. When printed for human consumption, it is printed as |
| 1477 | a special kind of list with an additional @samp{#f} before the opening | ||
| 1478 | @samp{(}. | ||
| 1473 | 1479 | ||
| 1474 | @node Record Type | 1480 | @node Record Type |
| 1475 | @subsection Record Type | 1481 | @subsection Record Type |
| @@ -2042,10 +2048,7 @@ with references to further information. | |||
| 2042 | @xref{Buffer Basics, bufferp}. | 2048 | @xref{Buffer Basics, bufferp}. |
| 2043 | 2049 | ||
| 2044 | @item byte-code-function-p | 2050 | @item byte-code-function-p |
| 2045 | @xref{Byte-Code Type, byte-code-function-p}. | 2051 | @xref{Closure Type, byte-code-function-p}. |
| 2046 | |||
| 2047 | @item compiled-function-p | ||
| 2048 | @xref{Byte-Code Type, compiled-function-p}. | ||
| 2049 | 2052 | ||
| 2050 | @item case-table-p | 2053 | @item case-table-p |
| 2051 | @xref{Case Tables, case-table-p}. | 2054 | @xref{Case Tables, case-table-p}. |
| @@ -2056,9 +2059,15 @@ with references to further information. | |||
| 2056 | @item char-table-p | 2059 | @item char-table-p |
| 2057 | @xref{Char-Tables, char-table-p}. | 2060 | @xref{Char-Tables, char-table-p}. |
| 2058 | 2061 | ||
| 2062 | @item closurep | ||
| 2063 | @xref{What Is a Function, closurep}. | ||
| 2064 | |||
| 2059 | @item commandp | 2065 | @item commandp |
| 2060 | @xref{Interactive Call, commandp}. | 2066 | @xref{Interactive Call, commandp}. |
| 2061 | 2067 | ||
| 2068 | @item compiled-function-p | ||
| 2069 | @xref{Closure Type, compiled-function-p}. | ||
| 2070 | |||
| 2062 | @item condition-variable-p | 2071 | @item condition-variable-p |
| 2063 | @xref{Condition Variables, condition-variable-p}. | 2072 | @xref{Condition Variables, condition-variable-p}. |
| 2064 | 2073 | ||
| @@ -2098,6 +2107,9 @@ with references to further information. | |||
| 2098 | @item integerp | 2107 | @item integerp |
| 2099 | @xref{Predicates on Numbers, integerp}. | 2108 | @xref{Predicates on Numbers, integerp}. |
| 2100 | 2109 | ||
| 2110 | @item interpreted-function-p | ||
| 2111 | @xref{What Is a Function, interpreted-function-p}. | ||
| 2112 | |||
| 2101 | @item keymapp | 2113 | @item keymapp |
| 2102 | @xref{Creating Keymaps, keymapp}. | 2114 | @xref{Creating Keymaps, keymapp}. |
| 2103 | 2115 | ||