On Tuesday, 18 December 2018 at 13:52:29 UTC, Steven Schveighoffer wrote:
On 12/18/18 6:29 AM, Simen Kjærås wrote:
On Tuesday, 18 December 2018 at 10:14:50 UTC, Per Nordlöw wrote:
What's the preferred way of creating a temporary @trusted scope without writing a separate  function?

Jonathan's idea might also be encapsulated in a function, just like assumeUnique in Phobos:

import std.stdio;

template unsafe(alias fn) {
     @trusted auto unsafe(T...)(T args) {
         return fn(args);
     }
}

@system void fun(int n) {
     writeln("foo!");
}

@safe unittest {
     unsafe!({
         fun(2);
     });

     unsafe!fun(2);
}

Wow, I really like this. The only real problem is that one generally searches for @trusted when looking for unsafe code, but unsafe is pretty obvious too. Also, args should be auto ref.

Only thing better I can think of (for the second example) is to define a prototype with the correct information, only with @trusted (and specify the mangle). But any decent compiler should get rid of any overhead there.

-Steve

I've been gathering assume related stuff like this in a lib under an "assume" template. You can generalize further with multiple attributes inside a non-eponymous thing and use them like:

assume!fun.safe_(2);
assume!fun.nogc_(2);

I guess it's no very idiomatic D though, but I feel it reads better ... ok well maybe 🤷‍♂️: https://aliak00.github.io/bolts/bolts/assume/assume.html

Easier to be more specific with searches for "assumeSafe" instead of just "assume!" though.

Cheers,
- Ali


Reply via email to