他们认为​​__metadata​​​字段不能从​​外部访问​​​实现​​引用计数​​​的对象.这样,​​强纯​​​函数不会改变​​__metadata​​​字段,因此可基于​​纯​​来优化(除了释放函数).

​析构器​​在​​限定符​​上遇到与​​postblits​​相同​​问题​​.如果可调用​​不变​​析构器,我会感到惊讶.加上不能​​重载​​析构器,这更糟.

然而,为了支持​​不变​​分配器,确实要考虑如何​​分配和释放​​.

这里问题是把​​高级​​(​​纯​​)与​​低级​​(​​分配/释放​​)混为一谈了.​​后一类​​本质上不是​​纯​​的,因为它修改了操作系统的​​数据结构​​,可按​​系统|而不是不安全​​对待它们,且因为需要​​操作系统​​帮助.

现在,该函数即使签名是​​强纯​​,最多应是​​弱纯​​的(这就是​​可变​​函数).

一种方法是无论​​签名​​​如何,把​​@系统/@trusted​​​纯函数视为​​弱纯​​​函数.​​构造器/析构器​​​最多是​​弱纯​​​.如果函数是​​@safe​​​且​​纯​​​的,则应分析​​签名​​​来确定是​​强纯还是弱纯​​​.此外,从​​另一语言​​​调用​​函数​​​最多为​​@trusted​​​.这样,​​@trusted​​​充当​​优化阻止​​程序.


在开发分配器时.我在思考​​映射内存​​是否应按​​纯​​对待.

最终认为,已按纯定义​​new​​形式的​​映射内存​​.我不同意这样,但它​​一直是​​.

因此,我把​​映射内存​​归类为一组"​​神​​"功能.因此,修改​​执行环境​​但不修改​​执行逻辑​​,可当作​​纯​​的.


:他们认为​​__metadata​​字段不能从​​外部访问​​实现​​引用计数​​的对象

不是真的,如,只是​​公开​​它的指针.不必有​​可见性​​规则.

​注意​​,​​引用计数​​不是唯一用例.如​​懒初化​​等.

:​​强纯​​函数不会改变​​__metadata​​字段.

并不真地.

:因此可基于​​纯​​来优化(除了释放函数).

那是倒退.基于​​纯​​优化决定了可对​​__metadata​​字段做什么.因为不应在那干活,所以它应是​​@系统​​,应由​​程序员​​而不是​​编译器​​保证.这是​​低级​​特征.

:(除了释放函数)

注意,必须专门​​标记​​从​​析构器​​中使用的函数.

:​​析构器​​在​​限定符​​上遇到与​​postblits​​相同​​问题​​.如果可调用​​不变​​析构器,我会感到惊讶.加上不能​​重载​​析构器,这更糟.

好吧,如果破坏​​不变​​对象会怎样.需要有​​语言规则​​允许内存​​暂时不变​​,否则​​引用计数​​方案对​​不变​​内存不适用.

:这里问题是把​​高级​​(​​纯​​)与​​低级​​(​​分配/释放​​)混为一谈了.​​后一类​​本质上不是​​纯​​的,因为它修改了操作系统的​​数据结构​​,可按​​系统|而不是不安全​​对待它们,且因为需要​​操作系统​​帮助.

这并不是​​混淆​​,而是你在​​低级​​操作中实现了​​高级概念​​.这没问题,总是这样工作的.

它们是不安全的,因为需要​​按某种方式​​表现才能将它们视为"​​纯​​".

我认为与​​弱纯和强纯​​没太大关系.这是不同领域.

​@trusted​​或​​@系统​​并不阻止​​优化​​.这是​​正交​​语言设计.


:在开发分配器时.我在思考​​映射内存​​是否应按​​纯​​对待.

:最终认为,已按纯定义​​new​​形式的​​映射内存​​.我不同意这样,但它​​一直是​​.

那只是​​错误​​的​​抽象级别​​.显然,创建​​新值​​应是纯的,可在基本上所有​​纯函数式编程语言​​中创建​​任意树结构​​.它一般是​​此类代码​​运行方式的核心.

​D​​中"​​纯​​"的理由是可与​​此类语言竞争​​.

​分配/映射内存​​自身是否应是"​​纯​​"是有争议的.如果​​分配失败​​不是致命的,或​​返回​​可访问的​​未初化内存​​,则当然不是"​​纯​​"的.

然而,​​new​​(​​映射内存+初化+构造​​)并未为此设置​​先例​​,它更高级.

:因此,我把​​映射内存​​归类为一组"​​神​​"功能.因此,修改​​执行环境​​但不修改​​执行逻辑​​,可当作​​纯​​的.

只要不泄漏​​分配器状态​​到​​可观察的行为​​中,​​分配加构造​​就没有问题.(如,​​窥探指针位​​应是​​不纯​​的).始终要特殊对待​​释放​​.


令我震惊的是,该​​DIP​​​与正在最后审查的​​DIP1035@系统​​​中描述的​​变量​​​类似.完全可以合并​​__metadata​​​描述特征与​​DIP​​​中的​​@系统​​变量特征.

效果是,除了不能在​​@safe​​​代码中访问它们,可对​​@系统​​​变量做任何事情,这正是重点.可​​违反​​​类型系统.你有​​完全​​的自由.就是这样.

我想​​缺点​​​是你可能​​不希望​​​拥有所有自由.但是我正在考虑希望​​@系统​​​变量​​不变​​​.​​@系统|__metadata​​​这两个​​DIP​​​的全部意义在于​​@系统|__meta​​​数据是​​可变​​​的.(对​​DIP1035​​​,​​可变性​​​很危险,必须标记为​​@系统​​​.​​__metadata​​​整个要点是强制​​可变性​​​绕过​​类型系统​​.)

:上行.

不完全正确.​​DIP1035​​还指定按​​@系统​​推导在​​@safe​​代码中​​禁止​​初始值的变量,对​​可变​​和​​不变​​变量同样适用.

所以,指向​​未定义​​内存已经​​够危险​​了,但它仍然需要​​不变​​保护的,因为一些​​@系统​​程序员可能希望它指向别的,我们禁止这样,因为禁止​​@系统​​程序员这样做吗?

即,如果​​@系统​​一开始就足够​​危险​​,那么使它​​可变​​,会增加了多少额外的危险?


并不​​增加​​​额外危险,但是在​​类型​​​系统中,让变量​​@系统​​​属性像​​如此交互​​​是不明显的特例.如​​DIP1035​​​目前提及,​​不变​​​,与他们​​相互独立​​.