schrieb am So., 11. Sep. 2016 um 16:56 Uhr: > Philipp Stephani writes: > > > emacs_env::make_function lacks the following features supported by > > `defun': > > > > 1. Functions with both optional and rest arguments. > > 2. Specification of parameter names. > > 3. Integration with `help-function-arglist'. > > 4. Specification of interactive forms. > > 5. Specification of declare forms. > > 6. Docstrings containing null or non-Unicode characters. > > > > (6) is probably rather unimportant. (5) is probably not implementable > > (would require wrapping `defun', not `lambda'). (1)–(4) are more severe > > and quite limit the usefulness of make_function right now; for a > > truly generic `defun'-like construct one currently has to eval a `defun' > > form wrapping another function. > > Shouldn't modules be providing a DEFUN-like construct instead? That is, > I thought the idea of modules was to enable writing primitive > subroutines. > I don't know what the idea of modules originally was. However, defun and DEFUN are composite operations: They create a function object (lambda) and provide an alias for it. Therefore they can't replace the more primitive operations. The current module interface design chooses to provide the primitive operation to make a function object and have the caller call defalias. That's a reasonable choice. > > > > > To solve (1)–(3), I'd propose replacing the "arity" arguments with a > > true arglist specification. This could either be at the C level, e.g. > > > > ptrdiff_t num_mandatory_args, char** mandatory_arg_names, > > ptrdiff_t num_optional_args, char** optional_arg_names, > > char* rest_arg_name > > > > or by requiring to pass a Lisp argument list. > > > > To solve (4) I'd propose to pass another value for the interactive form, > > probably as emacs_value* (to support non-interactive functions). > > > > As an alternative, if people feel this would require too many > > parameters, I'd propose reverting the change that adds the documentation > > string. A docstring without arglist is not very useful. We could also > > remove the arity parameters and have the C function check the arity > > itself. > > I think adding "(fn ARG1 ARG2...)" to the docstring would solve (1)-(3). > That doesn't work, because Emacs ignores this syntax when the arguments are provided explicitly, and since a module function is just a (lambda (&rest args) ...) under the hood, the arglist is always just (&rest args). > What's lacking is a way to add this automagically like DEFUN does. And > getting the parameters in C variables like DEFUN would also be nice. > Maybe, but not for the module interface. The module interface explicitly only provides basic primitives, without macro magic or high-level functions. High-level functionality built on top of the primitives is out of scope.