让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 : gc_allocates;
// 内置的nogc注解因此可成为库别名
alias nogc = denied_effect!gc_allocates;
import std.typecons : AliasSeq;
// 也可以声明组合
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
主要思想
是,如果用户
可定义它的,则可做任何需要
做的事情.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现