On Thursday, 3 August 2017 at 19:05:47 UTC, Meta wrote:
On Thursday, 3 August 2017 at 19:03:55 UTC, Meta wrote:
`mixin vectorize!sin vsin; alias sin = vsin;` and see if it

Should be `alias sin = vsin.sin;`

Thanks, this pointed me in the right direction. I got the line below working.

    mixin vectorize!sin temp;
    alias vsin = temp.sin;
    auto z = vsin(x);

I couldn't give it the name of sin or the name of the identifier.

This is a little ugly and would require the user to make the adjustment themselves.

Below seems to work if the user doesn't import the relevant function, though it will still result in errors if they selectively import that function. I think the combination of the two will be sufficient.


private enum _vectorizeAlt(string mod, string func) = "
    auto " ~ func ~ "(SliceKind kind, size_t[] packs, Iterator)
(Slice!(kind, packs, Iterator) slice)
    {
        import mir.ndslice.topology : map;
        return slice.map!(" ~ mod ~ "." ~ func ~ ");
    }
";

mixin template vectorizeAlt(string mod, string func)
{
    mixin("static import " ~ mod ~ ";");
    import mir.ndslice.slice : SliceKind, Slice;

    mixin(_vectorizeAlt!(mod, func));
}

unittest
{
    import std.stdio : writeln;
    import mir.ndslice.slice : sliced;
    import mir.ndslice.topology : map;

    auto x = [0.0, 1.0, 2.0, 3.0].sliced;

    mixin vectorizeAlt!("std.math", "sin");
    auto y = sin(x);
}

Reply via email to