Lots of macro options.
The ^C^C cancels both current command and selection.
From the link I posted above a ( )space or (;)semicolon issues enter in a macro separating actions in the macro.
The or function evaluates the expressions from left to right, looking for a non-nil expression so if C:bn is already defined and returns True the next expression (load "bnlispfile.lsp") isn't evaluated (reloaded).
^C^C(or C:bn (load "bnlispfile.lsp"));bn
If you wanted your lisp to work with preselected objects you would need to leave out the ^C^C.
To test if there is a current command you would need to use DIESEL in the macro.
For example I replaced the Ctrl+A macro in the CUI Keyboard Shortcuts → Shortcut Keys
^C^C_ai_selall
which cancels any active commands (not always what you want it to do) with
$M=$(if,$(getvar,cmdactive),_all,^P_ai_selall ^P)
Now Ctrl+A uses the selection option _all while in an active command and _ai_selall when there isn't an active command so it selects all either way.