I had a bit of time today to do some more work on that which is soon to be called something other than csnake. I’ve added a couple of features:
- You can now define custom pragmas, providing a Python handler function. Unfortunately Boost Wave, which csnake uses for preprocessing, only provides callbacks for pragmas that start with “#pragma wave”.
- Built-in pragmas and macros to support defining Python macros inline in C/C++ code.
- A main program in the csnake package. So you can now do “python3.2 -m csnake ”, which will print out the preprocessed source.
So for example, you can do something like as follows, entirely in one C++ file:
// factorial macro.
py_def(factorial(n))
import math
f = math.factorial(int(str(n)))
return [Token(T_INTLIT, f)]
py_end
int main()
{
std::cout << factorial(3) << std::endl;
return 0;
}
This works as follows: py_def and py_end are macros, which in turn use the _Pragma operator with built-in pragmas. Those pragmas are handled by csnake, and signal to collect the tokens in between. When the py_end macro is reached, the tokens are concatenated and a Python function macro is born.
I’m intending to do additonal “Python blocks”, including at least a py_for block, which will replicate the tokens within the block for each iteration of a loop.
There’s one big problem with the py_def support at the moment, which is that the tokens go through the normal macro replacement procedure. I think I’ll have a fix for that soon.