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用户类型.
显式转换更好,加上类型推导,可替换静态类型.代码很简洁.

posted @   zjh6  阅读(12)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示