> I get the following variations; all should check \@ifdefinable without > \@ifundefined, but differ in the other respects: > define > 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 Boolean variations: 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.