1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2026-01-05 19:31:02 -08:00

New generic function oclosure-interactive-form

It's used by `interactive-form` when it encounters an OClosure.
This lets one compute the `interactive-form` of OClosures
dynamically by adding appropriate methods.
This does not include support for `command-modes` for Oclosures.

* lisp/simple.el (oclosure-interactive-form): New generic function.

* src/data.c (Finteractive_form): Delegate to
`oclosure-interactive-form` if the arg is an OClosure.
(syms_of_data): New symbol `Qoclosure_interactive_form`.
* src/eval.c (Fcommandp): Delegate to `interactive-form` if the arg is
an OClosure.

* src/lisp.h (VALID_DOCSTRING_P): New function, extracted from
`store_function_docstring`.
* src/doc.c (store_function_docstring): Use it.

* lisp/kmacro.el (kmacro): Don't carry any interactive form.
(oclosure-interactive-form) <kmacro>: New method, instead.

* test/lisp/emacs-lisp/oclosure-tests.el (oclosure-interactive-form)
<oclosure-test>: New method.
(oclosure-test-interactive-form): New test.

* doc/lispref/commands.texi (Using Interactive):
Document `oclosure-interactive-form`.
This commit is contained in:
Stefan Monnier 2022-04-26 10:36:52 -04:00
parent 756b7cf5d9
commit bffc4cb39d
10 changed files with 166 additions and 53 deletions

View file

@ -106,6 +106,27 @@
(and (eq 'error (car err))
(string-match "Duplicate slot: fst$" (cadr err)))))))
(cl-defmethod oclosure-interactive-form ((ot oclosure-test))
(let ((snd (oclosure-test--snd ot)))
(if (stringp snd) (list 'interactive snd))))
(ert-deftest oclosure-test-interactive-form ()
(should (equal (interactive-form
(oclosure-lambda (oclosure-test (fst 1) (snd 2)) () fst))
nil))
(should (equal (interactive-form
(oclosure-lambda (oclosure-test (fst 1) (snd 2)) ()
(interactive "r")
fst))
'(interactive "r")))
(should (equal (interactive-form
(oclosure-lambda (oclosure-test (fst 1) (snd "P")) () fst))
'(interactive "P")))
(should (not (commandp
(oclosure-lambda (oclosure-test (fst 1) (snd 2)) () fst))))
(should (commandp
(oclosure-lambda (oclosure-test (fst 1) (snd "P")) () fst))))
(oclosure-define (oclosure-test-mut
(:parent oclosure-test)
(:copier oclosure-test-mut-copy))