Like you, I try to eliminate unnecessary semicolons and RUN statements. I always cringe a bit when I see unnecessary semicolons after macro calls. So you might be surprised that I begin many of my macros with a semicolon. When I write a macro that consist of full steps (as opposed to a macro that generates a fragment of a statement or a partial step), I begin it with a semicolon:

%macro test( );; --- macro code --- %mend;

Note the double semicolon. If a user of my macro leaves out a semicolon before calling my macro, he or she might get a puzzling error message from code deep inside my macro if I leave out the leading semicolon. With the leading semicolon, a more interpretable SAS error message typically comes out in this error situation.