Warning: this post is for entertainment purposes only and explains a hack that everybody may hate you for actually using, as well as post-hoc justification for the hack. Proceed with caution.
Sometimes I have a piece of code where I want to toggle between two variants frequently.
int a = do_one_thing();
// int a = do_another_thing();
Commenting one out and uncommenting the other is a pain.
A sensible person might introduce a conditional:
int a = true
? do_one_thing()
: do_another_thing();
However, toggling that in the obvious way* also requires typing multiple characters. I’m too lazy for that! Also, it introduces more indentation and it just doesn’t sit very well with my aesthetic preferences.
Plus I like that syntax highlighting makes it really clear which piece of code is currently active. Maybe we can implement a toggle using comments?
We have at our disposal:
//
to introduce a single-line comment/*
to start a multiline comment*/
to end a multiline comment
Let’s start by commenting out do_one_thing
with its own multiline comment:
/*
int a = do_one_thing();
*/
Now, if we want to bring it back we can comment out the multiline comment opening:
//*
int a = do_one_thing();
*/
Unfortunately that introduces a syntax error, so we need to comment out the end of the multiline comment too:
//*
int a = do_one_thing();
//*/
Now we can toggle do_one_thing
on and off by adding/removing the extra /
at the beginning: when it’s there, the multiline comment beginning is commented out by the single-line comment, and when it’s not there the single-line comment that terminates the multiline comment doesn’t cause any problems because it itself is commented out.
So far so good!
Now what about do_another_thing
? Let’s start by commenting it out in the same way:
//*
int a = do_one_thing();
//*/
/*
int a = do_another_thing();
//*/
This is ugly. Can’t we reuse that /*
we have in the line before? Of course we can!
//*
int a = do_one_thing();
/*
int a = do_another_thing();
//*/
Now all we need to do is add another /
to ensure that if we toggle out do_one_thing
by removing the /
at the beginning, the comment is still closed:
/*
int a = do_one_thing();
/*/
int a = do_another_thing();
//*/
Perfect! Now we can switch between the two variants simply by adding/removing that one /
, and syntax highlighting makes it clear which variant is active:
//*
int a = do_one_thing();
/*/
int a = do_another_thing();
//*/
This pattern should work in any language which:
- Supports
/* */
-style multiline comments, - Has single-line comments,
- and doesn’t ruin the fun by having nested comment syntax.
For example, Nix:
let
a =
#/*
do_one_thing/*/
do_another_thing
#*/
;
b =
/*
do_one_thing
/*/
do_another_thing#*/
;
or PHP:
#/*
$stmt = "SELECT *";
/*/
$stmt = "DELETE";
#*/
$stmt .= " FROM customers;";
/*
$stmt = "SELECT *";
/*/
$stmt = "DELETE";
#*/
$stmt .= " FROM outstanding_invoices;";
Isn’t it beautiful? Don’t @ me.