2015d第3天
原文
先由AA
大神上场.主要由搞std.allocator
而得出的.高调的标记泛型编程
必须有.
先指出泛型
的优缺点.在泛型编程中,你目标是通用概念
.泛型
静态分发,无间接.
区间
试图通用
,定义InputRange
,但很快需要更细粒度控制.因而有hasLength,isInfinite
等,很好,可单独测试.然后联系分配器,他们有对齐,解除分配,重新分配等
可变独立项.
从最简单的分配器开始,保证对齐
.它只是分配
,其他成员都是可选
的.AA
提议内省
设计.即检查是否存在成员
并适配他们.
这样来实现最大通用性
,且可用很少代码查看其各个组件
来组合具不同能力
的分配器.
用返回切片到堆栈缓冲区
来显示简单的区域分配器,和基于malloc
的分配器,然后用回退
分配器组合他们来显示这点(内省设计)
.
回退分配器,通过查找需要的最少
方法,可适应输入分配器
的最佳组合,或强人所难时报错.
用户代码中,如果allocator(分配器)
没有deallocate(释放)
方法,就不必考虑了.如果有,则调用它.这是通过内省
来检查的.内省设计在此
展示了很多组合小片代码及static if
使代码更简单.
并详细说,代码检查allocate.length
而非null
,因为allocate(0)
可能合法地返回空数组
而不是null
.检查匹配长度
最简单.一位听众
询问如果过度分配会怎样?AA
回答说应返回大小为调用者要求
的切片,这样,成功后总会匹配长度.
AA
还说hasMember
也应检查签名
来确保取正确参数
.作者(我)不同意,除非仔细完成,可因不匹配常
等小事而忽略,但可用少量库代码正确完成它.如果存在成员
但签名错误,检查并静态断言
来拒绝它.如果不存在,则忽略它,因为它是可选
的.这样,保持最佳可用静态检查
同时获得了自省
的胜利.
概念和传统泛型编程
失败,是因为它们因大量输入的组合
而爆炸.
在static if
中带极约束
的静态自省
成功了.因而自省设计
是泛型
编程新方法.
我(亚当,作者)
,探讨D
中实现动态类型
.
要点是搞底层内核代码
的D
也可写动态风格
代码.我展示了组合语言特征来建造var
类型.
从类型
开始:内存保存数字
,由程序来解释
.然后分解类型系统为编译时检查与运行时标记
及隐式强制对比不匹配即错误
类型.
我解释说D
有个卓越的类型模型
,具有静态类型
,强大检查,推导和模板
的方便和强大
,及用于额外自定义检查
的静态断言(静断)
,都在编译时,且不断改进.然后讲相反的隐式强制,运行时标记
:
// 这是有效D代码!
var a = 10;
var b = "20";
var c = a + b;
var d = json!q{ "foo": { "bar": 10.2 } };
writeln(d.foo); // {"bar":10.2}
d.foo.bar = (var a) => a ~ b;
writeln(d.foo.bar()("hello! "));
我提出:D需要动态类型
吗?我得出:与外部API
交互,使用稳定的二进制运行时接口
,原型代码,脚本交互
我解释了基本技术:标记联
,并解释了std.variant
和我的arsd.jsvar
如何在之上用它的变体
,然后进入D
语法糖必须使其易用:主要是重载运算符和反射
.
展示了我遇到的两个主要问题
:1,用局部变量和结构变量
的结构中返回闭包.上下文指针应指向哪个,结构或堆栈
?为此,你可明确:创建静态嵌套
函数,来通过局部变量
访问它需要的一切.
2,返回引用
给无效
.为此,我构建了new var(null)
并返回它.虽然生成大量垃圾
,但在无需编写大量特例
时,是适用的.
还展示了循环遍历TypeTuple
来为许多类型
生成代码.方法是在运行时if
中插件代码
.我还想要隐式构造(C++的显)
.应谨慎使用,但有时很有用.如,当你想写构
来完全替换内置类型时,没有它,不能隐式转换null
为用户类型
.
显式转换更好,加上类型推导
,可替换静态类型
.代码很简洁
.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现