> I get the following variations; all should check \@ifdefinable without
> \@ifundefined, but differ in the other respects:
> new If undefined, then define, else error.
> renew If defined, then define, else error.
> provide If undefined, then define, else do nothing.
> override If define, then define, else do nothing.
I don't have an opinion on cleaning up the internals of \@ifdefinable;
I have been able to write a large number of defining commands without
running into any problems in this regard (the moredefs package). But
I would add the following to your list. The first is already in the
kernel, the second is in moredefs:
check Compare given with existing definition;
warn if not identical.
require If undefined, define, else check.
When considering new defining commands, there are also (at least) four
1) "robust" or not "robust"
2) \long or not \long
3) \global or not \global
4) advanced syntax that lets you compute the macro name and/or write a
complex parameter specification.
I've organized and normalized some new defining commands to a small
extent in moredefs, but certainly not with the completeness and
efficiency that might be achieved by starting from scratch.