0
点赞
收藏
分享

微信扫一扫

让d用户定义效果系统


​std.conv.octal​​​中还有​​字面​​​.
不应删除,内置​​​二进制​​​字面.​​cgi.d​​​比​​vibe.d​​​更快.
模板化​​​druntime​​​,简单调用​​dom.d​​,就够了.

如果可以在​​库代码​​​中定义​​@nogc,pure​​​甚至像​​@vibe_fiber_safe​​​等等,而不是在编译器中添加,会怎么样?
我反对​​​@nogc​​​的(许多)​​批评​​​之一是,它是你想要不解决就能​​避免​​​的​​特例​​​,类似情况下​​还会​​​出现​​类似​​​问题.我一直认为某种​​用户定义系统​​​会很好,这样它可能会​​检查​​​多个因素,甚至组合成​​集合​​​,不必在每个​​函数​​​上重复​​十几个属性​​​.​​AA​​​曾经提出函数的​​复杂度​​​注解.
D的​​​内置注解​​​倾向于以​​禁止列表​​​形式出现.如​​@nogc​​​函数禁止调用可能调用​​GC​​​函数的内容,及禁止​​纯​​​函数读取​​静态变量​​​.
可以想象,标记函数允许及禁止做的事情的​​​系统​​​.内置语言会有一些​​core.attribute​​​神奇注解说明它们的​​作用​​​,但也可​​自定义​​​.
​​​四种​​​类型的注解:​​@effect!(...),@denied_effect!(...),@exclusively_allowed_effect!(...)​​​和​​@allowed_hidden_effect!(...)​​​.
用​​​D符号​​​标记​​效果​​​.这允许通过正常​​模块​​​系统来消歧​​名空间​​等.如下:

// 这是用户定义效果
enum writes_to_console;

// 函数上声明用户定义效果
void writeln(string s) @effect!writes_to_console { ... }

// 从编译器访问效果
import core.effects :;

// 内置的nogc注解因此可成为库别名
alias nogc = denied_effect!gc_allocates;

import std.typecons :;

// 也可以声明组合

alias no_combined = AliasSeq!(denied_effect!gc_allocates, denied_effect!writes_to_console);

void cant_write_to_console_nor_gc_allocate() @no_combined {
/*
编译错误:
writeln具有writes_to_console效果,但拒绝该效果
*/
writeln("hi");
}

如果用矛盾东西来​​标记函数​​​,则是​​编译错误​​.

enum thing;

// 错误!
void contradiction() @denied_effect!thing @exclusively_allowed_effect!thing {}

可用​​@allowed_hidden_effect​​​来模拟类似​​内置​​受信任的东西.

enum thing;

void foo() @effect!thing {}

//由于调用了`foo()`,它也有与`foo()`相同效果
void inferred_effect() {
foo();
}

//函数调用`foo`,但由于它是允许隐藏的效果`effect!thing`是隐藏的!
void baz() @allowed_hidden_effect!thing {
foo();
}

void error() @denied_effect!thing {
/*
这是拒绝效果,但在`推导效果`
(从调用foo一层深的调用)
*/
inferred_effect();
}

void bar() @denied_effect!thing {
/*
无误,bar允许隐藏效果
*/
baz();
}

​允许和拒绝​​​效果必须与​​继承​​​一起使用.子类可以拒绝父母允许的事情,但不能允许​​父母拒绝​​​的事情,就像可添加​​@nogc​​​到​​覆盖​​​,但不能删除它一样.
就像​​​内置属性​​​,也希望参数有某种​​依赖效果​​.

//用相对`正常`语法转发效果,神奇的是,它不是在`声明`时静态确定的,而是在`使用`时确定的.
void map(void delegate() dg) @effect!(__traits(getEffectsOfArgument, dg)) {
dg();
}

价值在:

alias fiber_compatible = @denied_effect!blocking

​主要思想​​​是,如果​​用户​​​可定义它的,则可做任何​​需要​​做的事情.


举报

相关推荐

0 条评论