To be consistent across the lisp and c code, I just want to point out that the definition of the c code should be:
void zap(*action, *selector, *object) { ... }
compared to
(mac zap (op place . args) ... )
But I also think what the c code really represents is an abstraction. You still need to write out the definitions of the functions each time you call zap. With the lisp code you write one line, which is the whole point of macros: write a single line of code which expands to several lines.