D语言中的Ada风格范围类型

3

在阅读了this关于Ada和C++的有趣文章并了解到D语言支持CTFE和函数常量参数专业化之后,我想知道是否可以更轻松/高效地在D语言中实现Ada风格的范围类型,而不是在C++中。也许已经有人编写了这样的库吗?

如果这样的范围能够在D语言中高效且开发者友好地实现,它可以被用作推广D语言在需要确定性、类型和内存安全(D语言已经很出色)的领域,如航空航天和汽车行业。D语言将因此获得更多开发者的兴趣和更强大的财务支持。

2个回答

4
在 D 语言中,定义标量变量(有界)只需使用模板即可轻松实现。实际上,我记得以前看到过某人已经编写了此类代码。不幸的是,我不记得在哪里看到的。尽管如此,在我看来,这不需要成为语言本身的一部分,而应该成为标准库的一部分。
(编辑:Adam 提醒我这段代码在这里:http://arsdnet.net/dcode/ranged.d
区间(Ranges)是 Andreas 文章中很好解释的更广泛的概念 - http://www.informit.com/articles/printerfriendly.aspx?p=1407357&rll=1。这种类型的区间现在是 D 语言的核心概念。D 的切片是最强大的范围实现 - 随机访问范围(RandomAccessRange)之一。
例子:
import std.stdio;
import std.algorithm;

void main()
{
    int[] values = [ 1, 20, 7, 11 ]; // values is a RandomAcessRange
    writeln(filter!(value => value > 10)(values));
}

好书推荐:

  1. http://ddili.org/ders/d.en/ranges.html
  2. http://www.drdobbs.com/architecture-and-design/component-programming-in-d/240008321
  3. http://dlang.org/phobos/std_range.html

1
不是那种范围,而是一个有界(标量)变量(类似于具有最小值和最大值的实数) - ratchet freak

3
我写了一些小代码,用于检查整数的最小值和最大值是否溢出: http://arsdnet.net/dcode/ranged.d 虽然这只是一个概念性的证明,但我怀疑它的性能不会很好,但如果内联可能会更好。

谢谢Adam - 我记得我在某个地方看到过它! :) 这正是我想要的代码。 :) - DejanLekic
这个能扩展到浮点类型吗(有或没有汇编辅助)? - Nordlöw
1
是的,这应该是可能的。我不知道是否有像汇编检查这里那样的浮点溢出标志,但我们可以做一些类似的事情,比如如果结果<max(addends),其中两者都是正数,我们就知道它溢出了。范围检查本身是有效的,因为那只是一个>比较....我改变了文件(刷新链接)在asm上进行静态处理,所以现在它应该在简单情况下适用于float。 - Adam D. Ruppe
我认为你不能这样做,因为编译器无法保证在生成的代码中设置标志,或者干扰代码不会破坏标志,正如关于+=1不设置进位标志的注释所指出的那样。还要考虑一个未经证明的极端假设情况,即传递常量并且编译器甚至在编译时简化表达式会发生什么。 - Cecil Ward
我写了一些非常相似但远不如通用的代码,并在x86 SETcc指令旁边编写算术运算以返回一个布尔第二个结果,但当然可以使用条件分支。我使用了更强大的GDC扩展asm。 - Cecil Ward
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接