On Wednesday, 1 February 2017 at 11:53:09 UTC, Stefan Koch wrote:
On Tuesday, 31 January 2017 at 16:21:27 UTC, Stefan Koch wrote:
function pointer support is coming!
This is more difficult then I expected,
since the argument handling system was build without
considering that we could have functions as arguments,
therefore when trying to evaluate the function-argument it will
overwrite the data-structures that are supposed to hold the
information for the function we currently processing the
arguments for.
maybe this can be fixed by handling the arguments before
handling the function itself.
I have not fixed the bug with top-level function arguments yet,
However I have enabled function-pointer support for non-toplevel
use
such as in :
int[] filterBy(int[] arr , bool function(uint) fn)
{
int[] result;
uint resultLength;
result.length = arr.length;
foreach(i;0 .. arr.length)
{
auto e = arr[i];
bool r = true;
r = fn(e);
if(r)
{
result[resultLength++] = e;
}
}
int[] filterResult;
filterResult.length = resultLength;
foreach(i; 0 .. resultLength)
{
filterResult[i] = result[i];
}
return filterResult;
}
bool isDiv2(uint e)
{
bool result_;
result_ = (e % 2 == 0);
return result_;
}
bool isNotDiv2(uint e)
{
bool result_;
result_ = (e % 2 != 0);
return result_;
}
int[] run(int[] arr, bool div2)
{
return filterBy(arr, div2 ? &isDiv2 : &isNotDiv2);
}
static assert(run([3,4,5], true) == [4]);
static assert(run([3,4,5], false) == [3,5]);
//static assert(filterBy([3,4,5], &isDiv2) == [4]);
// top-level function arguments do currently not work with newCTFE
Enjoy!