From the looks of it this kind of stuff should be easy with
tokenzied strings ( q{ code } )+ mixins + some "auto-magic"
helpers being run for OpenCL behind the covers. The problematic
part is checking that the fragment is using the correct subset
of both languages.
Ideally API should work along the lines of this:
float[] arr1, arr2;
//init arr1 & arr2
assert(arr1.length == arr2.length);
length = arr1.length;
compute!q{
for(int i=0;i<length; i++)
arr1[i] += arr2[i];
}(arr1, arr2);
where compute works both with plain CPU and even without OpenCL
(by simply mixin stuff in) and for OpenCL with a bit of extra
binding magic inside compute template.
(compute is an eponymous template that alied to static function
inside, that in turn is generated by mixin, for concrete
example - take a look on how ctRegex template in std.regex does
it)
Of course, there are some painful details when you go for
deeper things and error messages but it should be perfectly
doable in normal D even w/o say CTFE parser.
Awesome, thanks! Will chew on this for a while :)