At work, I found myself needing to do a repetitive operation at compile time on a set of symbols. We all know what to do in that situation:
#define OPERATION(x) ... some big long thing in terms of x ... OPERATION(symbol1) OPERATION(symbol2) OPERATION(symbol3) ...
I’m doing two such operations in different places on the same set of symbols. And I’m about to add a third. My refactor alarm goes off: I need to abstract this.
How do you iterate over a list of symbols at compile time? Let’s take a technique from lambda calculus: the we define the list as a function which iterates over itself:
#define SYMLIST(f) \ f(symbol1) \ f(symbol2) \ f(symbol3)
Then to do three different operations on these symbols, I can simply define the operations and use the list like so:
#define OPERATION1(x) ... something involving x ... #define OPERATION2(x) ... something else involving x ... #define OPERATION3(x) ... you get the picture ... SYMLIST(OPERATION1) SYMLIST(OPERATION2) SYMLIST(OPERATION3)