An experimental feature of Ren-C added by Shixin Zeng years ago has been getting some reworking since the new year, and it's really quite nice. It's the ability to code a Rebol function with what looks like an ordinary spec BLOCK!, but whose body is a textual string of C code.
As an example, here's a Fibonacci function:
c-fib: make-native [
"nth Fibonacci Number"
n [integer!]
]{
int n = rebUnboxInteger(rebArgR("n"));
if (n < 0) { return rebInteger(-1); }
if (n <= 1) { return rebInteger(n); }
int i0 = 0;
int i1 = 1;
while (n > 1) {
int t = i1;
i1 = i0 + i1;
i0 = t;
--n;
}
return rebInteger(i1);
}
There's an elegantly designed set of routines for picking apart and building up Rebol values--which deserve a whole discussion in its own right! But here you see a basic extraction of a C `int` from a parameter that's a Rebol value, and a few return statements that produce Rebol values from C integers.
This is achieved by way of an extension that integrates the TCC "TinyC" compiler. The extension is optional in the build settings when you compile Ren-C:
https://github.com/metaeducation/ren-c/tree/master/extensions/tcc
Although TCC isn't an optimizing compiler, the performance is not actually that bad. As users of Red/System have observed, GCC's optimizations get you maybe a factor of 2 or 3 advantage overall on the average code. For many things you won't notice, especially relative to the *much* slower speed of an interpreter. A single addition takes hundreds of CPU cycles instead of just a few!
Just as a random example, the user native above is about 60x faster or so than the equivalent Rebol code:
https://github.com/metaeducation/ren-c/blob/master/tests/misc/fib.r
Anyway, just one of the interesting things we'll be talking about at the conference. I'm already in Philadelphia--planning to take in the 4th-of-July events beforehand...