2407d,D2024三月会议

原文

第1项:ulong串字面和NUL终止

Martin说,他一直在为LDC开发新的ulong串字面,并想知道是否应该像普通串字面一样以无效结尾.沃尔特问他是什么意思,因为串字面总是秘密地以无效结尾.

丹尼斯问同样规则是否适合十六进制串字面,这就是马丁的意思.沃尔特说不.Dennis说内部可按串式表达十六进制数组串其他数组.

即使它是个整数数组,编译器仍在数据段中分配一个空字节.
Walter说编译器按二进制数据转换十六进制串字面,并问你为何要空字节.Dennis说,这并不是你想要的,而是编译器在生成代码中,看到串式时,只是在生成代码中添加了一个零终止符.

串式不必是串字面.可以是数组,import语句或十六进制串字面.在内部,有多种方法可以创建不是串字面串式.

Walter说,应该只对实际的串字面,隐式无效.马蒂亚斯问在其他地方这样做是否有坏处.因为在数组后面放置它,所以仅当取指针时才重要.

史蒂夫说这是对的.测试应该是"编译器是否显式按符指针转换它",此时,它应该添加终止符.

Paul说,他非常确定有些代码依赖终止零符当前行为,或针对CTFE生成的串,因此他会谨慎地更改它.Walter同意,但表示这些正在创建串字面,因此都应该总是加终止符.

丹尼斯说他不确定它.有时你可从一个字符数组创建一个内部仍是一个字符数组的串.不确定编译器是否此时添加了终止符.

Martin说,在LDC中实现新的64位十六进制串字面时,他有两个特例.第一个是他不是零终止他们.第二个是他不打算缓存它们.

所有其他串字面都可跨目标文件合并.因为这些十六进制串旨在表示二进制数据,所以不会对空终止符感兴趣,他假设它们会比平均串字面大.

他快速浏览了一下DMDPR,似乎无特例.因此,在DMD中,它们可能仍是零终止的,并像其他串字面一样跨目标文件合并.

Walter问,如果它要进入静态数据,为什么不想它合并.马丁说,测试会很贵,因为他按缓存键使用串自身.他不知道Phobos中使用此函数的新统一表,但它们可能非常大,比如几兆字节左右.

此时,成本会很贵.假设你不太可能在目标文件复制这些十六进制串.

沃尔特说这是对的.Martin说,他的主要观点是他期望会改变规范,但这在更新日志中,甚至没有提到.它提到你可按ulong文本转换任意串字面,但编译器已更改,串式的符大小现在可为8字节.

沃尔特问丹尼斯能不能处理好这件事.丹尼斯说他会的.

第2项:弃用Nullable上的区间API函数

丹尼斯链接到乔纳森提交但后来关闭的公关.PR弃用了按区间对待Nullable.他想知道对此的看法.

他说他在C#中经常使用nullables,并且很喜欢它们.

但是C#有特殊的符号可与System.Nullable一起使用.在这些符号出现前,人们还没有真正在C#中使用过Nullable.

如,当有Nullable并且它是无效时,则问题就是默认值应该是什么,且在赋值给它时有个符号可用它.所以他想知道是否可在D中完成,Jonathan给了他一个列表,说明为什么这在D中不管用.

他说的Nullable实际上还不是nullable.也许它是一个可选的,或只是一个类型,弄错了名字.因为没用它做nullable可做的事情.

所以Nullable应该是个区间,他不这么认为.nullable只是说该数据可附加一个无效值,而数据自身不是null.

Paul同意的NullableC#不同,它实际上是一个可选的类型,或是一个有误导性名的类型.在Phobosv3中,应该重命名它并添加一个实际的C#风格的nullable,但这与本次讨论无关.

至于Phobosv2,试用与C#nullable的比较按其设计的指导原则是有限的.

蒂蒙说,他也想提出类似的观点.显然,NullableOptional或其他容器,如果你弹出它,区间接口会改变区间.当调用popFront时,不想更改动态数组底层静态数组.

atila说这很简单:只需在object.d放置数组区间API即可.但他想D数组隐式是区间,而不必显式地说它们是区间.

这样事情更简单.阿蒂拉同意了.这里

这是他对DMD代码基的一个大目标:查看其中的一部分,弄清楚它在做什么,然后覆盖它,使其非常简单.

Paul说,小概率,当你在编写某种低级代码时,或当你已单独完成了检查时,应该可在不检查时访问nullable的值.

但它可能应该叫uncheckedGetunsafeGet之类名,而不仅是get.

检查char数组的内容都应叫"chars",如果期望为零终止,则应叫"charz".他说这是对的.应该停止在标准库中组合"串"和"符数组".
Jonathan反驳说,大多数串处理并不关心数组是可变的还是不变的.沃尔特同意,但坚持认为可变的符数组完全不同.

罗伯特说这似乎太像C++概念了,他不想这样.Dennis提到了Rust的特征.atila提出了Haskell类型的类.
Paul说,在D语言中检查模板类型的方式类似在Python,js,Ruby等动态语言中,检查代码类型的方式.

使用这些语言的在处理类型检查引起的问题时达成的共识是带强大的单元测试规则.这是D前进的最佳路径.

然后,atila带回了Phobos文档,说最好有更通用的指导方针,如"避免分配"或"避免异常",而不是API应该是什么样子的细节.这里面有太多的味道.

v3中不需要它.不会在上做太多的重载,因为专注于char数组而不是dchar.无论是否保留它,在v3中,Phobos都不必.

史蒂夫说,最小更好.一旦一个特征在那里,它就在那里,就会被它困住.他说,那些可用is式替换的简单特征,Dennis在聊天中提出了一个很好的观点,即你不能调用is式或把__traits传递给模板.

这是另一件需要考虑的事情.

丹尼斯说,也许人们更喜欢__traits,因为他们不喜欢导入std.traits来使用它们.沃尔特说,另一个很好的区别是,没有增加内置的成本.

标准库的特征,按模板,是有成本的.

拉兹万建议,或是,如果某些__traits有用,则应该考虑美化它们,并为它们制作一些额外的语法,让他们变成一等公民.

相关推荐
fqbqrr6 个月前
2403d,d的com哪里错了
d
fqbqrr8 个月前
2402d,d的变参
d
fqbqrr9 个月前
2401d,ddip1027如何支持sql
d
fqbqrr9 个月前
2401d,讨论d串滑动参数
d
fqbqrr9 个月前
2312d,D语言单元测试等
d
fqbqrr10 个月前
2312d,d语言作为胶水,用C++调用rust
c++·rust·d
fqbqrr10 个月前
2312d,把alloca注入调用者域
d
fqbqrr10 个月前
2312d,d语言来绑定C++和rust
c++·rust·d
fqbqrr10 个月前
2311ddip1000不能从函数返回域引用
d