Reforming the def-* macros

Much of the detail can be removed or made optional in the macro
definition.