d递归和属性推导
原文
我遇见歧义了.
float recurse()(float val, float till)
{
return val < till? recurse(val * 2, till): val;
}
@safe void main()
{
import std;
writeln(recurse(1.5, 40.0));
writeln(typeid(&recurse!()));
}
//编译并打印:
48
float function(float, float) pure nothrow @nogc @safe*
但规范
说,不会按@安全或纯及不抛
推导递归
函数.
实现
和规范
,哪个对?
我倾向实现
是正确的,因为代码
并没有违反内存安全
.
丹尼斯
正在研究使@安全
推导对递归
函数也是正确的,所以未来可能会完全取消
该限制.
当函数
直接调用自身
时,忽略对该调用
的属性检查
.
然而,当两者
间有多个
函数时,推导
就会变成"我正在调用现在不能完成属性推导
函数,所以保守
地假设不能按@安全
推导所有属性
.",似乎规范
已修改为记录
实现的该缺点
.
我希望可简单
地假定已推导
所有属性,使如下工作:
void fun1()() { fun2(); }
void fun2()() { fun1(); }
void main() @safe pure nothrow @nogc
{
fun1(); // 当前失败
}
但这里有个更麻烦
情况:
@system void systemFunc();
void fun1()()
{
alias T = typeof(fun2());
systemFunc();
}
void fun2()()
{
fun1();
}
void main0() @system
{
fun1();
}
void main() @safe
{
fun2(); // 非系统!
}
编译器分析fun1
,然后fun2
,然后需要决定调用fun1
是否是安全
的.
如果它假定为是的,安全
.则稍后当它看到调用系统函数(systemFunc)()
时,需要返回
并标记函数2()
为@系统
,并重新分析
,T
现在是@系统
的fun1
.
DMD
不适合做该回溯
,会非常慢,所以一般
不会修复
.
但是,在缺少typeof()
和其他函数类型
依赖关系时,可维护每个函数
的被调
列表,以通过简单
函数调用来解决最常见相互函数依赖关系
.
我同意.我认为不应该有回溯
,因为即使对所有约束
有一致的方法,它也一般不会终止
.
这里,如果在推导
属性的同时,被迫决定
属性,那么没有明显的默认值
会很烦人
.我想可在继承类型``推迟
中解析
它们,并适当
地耦合推导,但不知道是否值得,似乎用模板实例化难以正确+高效
,因为可能以后会改参数类型
.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现