`
hqs7636
  • 浏览: 220931 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

D2 的 range设计

阅读更多
betty_betty2008  2009-04-08

转自圈子:http://dlang.group.iteye.com/group/topic/10615

Hello,

Walter, Bartosz and myself have been hard at work trying to find the
right abstraction for iteration. That abstraction would replace the
infamous opApply and would allow for external iteration, thus paving the
way to implementing real generic algorithms.
Walter, Bartosz和我一直致力于试图寻找合适的迭代器抽象模型。这种抽象模型能够取代名声狼籍的opApply并且允许从外部迭代,从而为实现真正的泛型算法铺路。

We considered an STL-style container/iterator design. Containers would
use the newfangled value semantics to enforce ownership of their
contents. Iterators would span containers in various ways.
我们曾考虑过STL类似的容器/迭代器设计。容器可以用最新式的语法对其包含的内容行使所有权。迭代器可以多种方式遍历容器。

The main problem with that approach was integrating built-in arrays into
the design. STL's iterators are generalized pointers; D's built-in
arrays are, however, not pointers, they are "pairs of pointers" that
cover contiguous ranges in memory. Most people who've used D gained the
intuition that slices are superior to pointers in many ways, such as
easier checking for validity, higher-level compact primitives,
streamlined and safe interface. However, if STL iterators are
generalized pointers, what is the corresponding generalization of D's
slices? Intuitively that generalization should also be superior to
iterators.
这个初步的想法最大的问题就是如何将D语言内置的数组整合到该设计之中。STL的迭代器是泛型指针;D的内置数组则不是指针,而是拥有一段连续内存的“指针对”。大多数用过D的同学都觉得数组切片好过指针体现在很多地方,比如更简单的有效性检测、高级精简原语、更加自然和安全的接口。既然STL的迭代器是泛型指针,那么在D中什么才是相对应的泛型切片呢?直觉上这个泛型的东东也应该优于迭代器才对。

In a related development, the Boost C++ library has defined ranges as
pairs of two iterators and implemented a series of wrappers that accept
ranges and forward their iterators to STL functions. The main outcome of
Boost ranges been to decrease the verboseness and perils of naked
iterator manipulation (see
http://www.boost.org/doc/libs/1_36_0/libs/range/doc/intro.html). So a
C++ application using Boost could avail itself of containers, ranges,
and iterators. The Boost notion of range is very close to a
generalization of D's slice.
相似的开发是,C++Boost 库定义的“区间”(range)为一对迭代器,并对其实现了一系列的包装使之能接受区间并且能够传递给STL的方法。Boost “区间”最大收获就是简化了显式使用迭代器编写的冗长的代码且降低了危险性(参见http://www.boost.org/doc/libs /1_36_0/libs/range/doc/intro.html)。所以应用了Boost的C++程序能够从容器、区间、迭代器当中获益。 Boost 的区间(range)概念非常接近D的泛型切片。

We have considered that design too, but that raised a nagging question.
In most slice-based D programming, using bare pointers is not necessary.
Could then there be a way to use _only_ ranges and eliminate iterators
altogether? A container/range design would be much simpler than one also
exposing iterators.
我们也曾考虑过这个设计。但是同样存在一个比较挑剔的问题:在大多数基于切片的D程序中没有必要显式使用指针。有没有办法实现一个不用迭代器的单纯的区间技术呢?一个容器/区间的设计比那个同时暴露迭代器在外的设计用起来要简单得多。

All these questions aside, there are several other imperfections in the
STL, many caused by the underlying language. For example STL is
incapable of distinguishing between input/output iterators and forward
iterators. This is because C++ cannot reasonably implement a type with
destructive copy semantics, which is what would be needed to make said
distinction. We wanted the Phobos design to provide appropriate answers
to such questions, too. This would be useful particularly because it
would allow implementation of true and efficient I/O integrated with
iteration. STL has made an attempt at that, but istream_iterator and
ostream_iterator are, with all due respect, a joke that builds on
another joke, the iostreams.
除了这些问题,STL还存在着其它的一些缺陷,当中很多都是由底层的语言造成的。比如,STL不能够区分输入/输出迭代器与前向迭代器。这是由于 C++不能合乎情理地实现析构复制这样一个语义,而这正是区分前述问题所必需的[译注:限于俺对Boost及C++的菜鸟级认知,此处翻译得很烂,请大牛指正]。我们希望Phobos能够很好地解决这个问题。这在实现整合了迭代器的,真正、高效的I/O非常有用。STL在这方面做了尝试,但是,恕我冒
昧,istream_iterator 和ostream_iterator是一个建立在iostream这个笑话之上的另一个笑话而已。

After much thought and discussions among Walter, Bartosz and myself, I
defined a range design and reimplemented all of std.algorithm and much
of std.stdio in terms of ranges alone. This is quite a thorough test
because the algorithms are diverse and stress-test the expressiveness
and efficiency of the range design. Along the way I made the interesting
realization that certain union/difference operations are needed as
primitives for ranges. There are also a few bugs in the compiler and
some needed language enhancements (e.g. returning a reference from a
function); Walter is committed to implement them.
诸多考量,加之与Walter和Bartosz商讨,我设计了区间(range)并重新实现了std.algorithm和相当一部分与 range相关的std.stdio的实现。这是一次彻底的尝试,原因是算法完全迥异,尝试更着重于range的表达能力和性能。在整个期间有意思的是我意识到这种合并/差异等操作的特性应该是区间最原生的需求。目前编译器尚有些许bugs,语言本身在某些方面也有待增强(比如返回一个方法的引用);Walter已答应实现它们。

I put together a short document for the range design. I definitely
missed about a million things and have been imprecise about another
million, so feedback would be highly appreciated. See:

http://ssli.ee.washington.edu/~aalexand/d/tmp/std_range.html
放在一起的还有区间设计的一个简短文档。毫无疑问,我肯定漏掉了许许多多本该有的;而那些已有的里面也肯定有许许多多不够准确的地方,所以非常感激您能够给予反馈。参见:
http://ssli.ee.washington.edu/~aalexand/d/tmp/std_range.html

Andrei
----------------------全文完-----------------------
来源:
http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D.announce&article_id=12922

补充材料:从Andrei的另外一篇文章中找一二例供大概了解range的用法及它的能力:

import std.range;  // 包含chain的模块,但该模块俺在现在的D2中尚未发现
int[] a,b,c;
…
foreach(e;chain(a,b,c))
{
…use e   //用e 来做一些事情
}

上例只用了三个range就可以一次遍历三个容器,如果用迭代器写一个函数的话,则需要六个迭代器(三对)。另请留意上述代码并没有将三个容器a ,b 和 c 连接在一起。chain所做的仅仅是一个一个地遍历。再请看下面对三个容器排序的代码:

sort(chain(a,b,c));


std.range尚有更多的用法。
分享到:
评论

相关推荐

    基于D2D的车联网MCRR算法.pdf

    2. 车联网通信协议和标准:讨论当前车联网的通信协议,例如DSRC(Dedicated Short-Range Communications)和C-V2X(Cellular Vehicle-to-Everything),以及这些标准如何与D2D技术相结合。 3. 路由策略与移动性管理...

    CST旗下品牌Crydom D2D系列 态继电器.pdf

    这一系列的产品主要是为直流负载设计,具有从7A到40A的额定电流以及高达500VDC的负载电压。 D2D系列固态继电器特点包括: 1. 直流控制(DC Control),意味着它们通过直流电压来开启和关闭,而不是交流电压。 2. ...

    立体声D类放大器TPA2016D2的性能特点及应用范围.docx

    ### 立体声D类放大器TPA2016D2的性能...综上所述,TPA2016D2凭借其出色的性能、灵活的设计选项和广泛的适用性,成为了便携式音频解决方案中的佼佼者,对于寻求高性能、高效率音频输出的制造商来说是一个理想的选择。

    tr012-1-0-0-multicast-d2d-communication.pdf

    5. **协议设计**:文档可能提供了关于构建组播D2D通信协议的指导原则,但不提供完整的、可互操作的实现细节,这意味着开发者需要根据这些指南来构建自己的解决方案。 6. **知识产权声明**:文档指出,LoRa Alliance...

    goftdi:FTDI D2XX 驱动程序的 Pure Go 接口

    总的来说,`goftdi`库为Go开发者提供了一种高效、易于使用的接口来访问和控制FTDI D2XX系列的USB转串行芯片,大大简化了嵌入式系统和硬件原型设计中的通信工作。通过这个库,你可以编写出更加简洁、可维护的代码,...

    实验四 多位十进制计数器的设计与实现.docx

    - **笔画接口**:包括A1、A2、B、C、D1、D2、E、F、G、H、J、K、M、N、O、P、DP等。 - **位选接口**:包括sel0、sel1、sel2、sel3等,用于选择不同的数码管进行显示。 #### 8位7段数码管(共阴) - **笔画接口**:...

    IRF7326D2TRPBF-VB一款2个P-Channel沟道SOP8的MOSFET晶体管参数介绍与应用说明

    综上所述,IRF7326D2TRPBF-VB作为一款高性能的双通道P沟道MOSFET,以其优异的技术指标和广泛的应用场景,在电子设备的设计中发挥着重要作用。通过对该器件的技术规格、特点及应用领域的详细介绍,可以更好地理解和...

    电信设备-处理用于装置对装置通信的开放直接发现的装置.zip

    3. 发现协议:如蓝牙的低功耗(BLE)广告和扫描机制,或者基于IEEE 802.11p的DSRC(Dedicated Short Range Communications)广播等。 4. 安全管理:直接通信增加了安全风险,因此需要有效的安全机制来保护通信内容不...

    Unity插件体积雾最新版Fog Volume 3.4.5

    FogVolume3版本3.4.5,是一个体积雾渲染器,设计用于模拟各种大气效果。Fog Volume 3 is a volumetric fog renderer designed to model a wide range of atmospheric effects. It offers a great deal of control to...

    Excel-VBA宏编程实例源代码-获取计算机中硬盘的信息.zip

    .Range("D2").Value = freeBytes End With Else MsgBox "无法获取硬盘信息!" End If End Sub ``` 在这个例子中,我们创建了一个新的工作表名为“硬盘信息”,并填充了硬盘的相关数据。`ThisWorkbook`引用当前...

    二级减速器课程设计说明书reducer design specification.doc

    二级减速器课程设计说明书,全英文书写 《Machine Parts Design》 Design Specification Topic Designation of Reducer College College of Mechanical and Electrical Engineering Major Mechanical ...

    基于Lyapunov优化的基于D2D的V2V通信的无线电资源分配

    然而,现有的V2V通信技术——专用短程通信(Dedicated Short Range Communications, DSRC),由于其有限的传输范围和缺乏基础设施支持,只能提供间歇性和短期的连接,这使得DSRC无法满足所需的高可靠性和高效性需求...

    VHDL语言实例.doc

    d0, d1, d2, d3, d4, d5, d6, d7 : IN BIT; s : INTEGER RANGE 0 TO 7; out1 : OUT BIT ); END sels; ``` 架构`sels_arc`中,`WITH SELECT`语句根据`s`的值来决定`out1`应该等于哪个输入数据。例如,当`s = 1`...

    用Excel建立模拟考试系统

    Sheets("单选题").Range("A:D").Sort Key1:=Sheets("单选题").Range("D2"), ``` 通过以上步骤,我们已经成功地利用Excel构建了一个能够自动出题、验证考号、答题后自动评分并保存记录的模拟考试系统。这样的系统...

    VHDL4renDIANLU

    虽然题目提供的代码片段不完整,但是可以推测其核心逻辑会涉及时钟信号的处理以及内部计数器的设计,以便在达到预定时间后触发报警信号。 综上所述,这六个模块共同构成了一个完整的四人抢答系统,每个模块都有其...

    VANET_toolbox_18a_18b_19b.zip

    这个工具箱的主要目标是帮助研究人员和工程师在设计、模拟和分析VANET系统时,能够快速构建街道模型,实现车辆间(V2V)以及设备到设备(D2D)的通信。在车载通信与导航课程中,VANET_toolbox是一个不可或缺的教育...

    2009 达内Unix学习笔记

    (注 删除没有写权限的文件可以用 rm -f ,这是为了操作方便,是人性化的设计)。 x 执行权限;对目录,是进入该目录 - 表示没有权限 形式 - rw- r-- r-- 其中 第一个是文件类型(-表普通文件,d表目录,l表软...

    Python3.5.0 32位和64位的

    "python-3.5.0-amd64(64位).exe"是为64位Windows系统设计的,而"python-3.5.0(32bit).exe"适用于32位Windows系统。安装过程中,你可以选择自定义安装路径、是否添加Python到系统路径、是否创建桌面快捷方式等...

    SSG4953A-VB一款2个P-Channel沟道SOP8的MOSFET晶体管参数介绍与应用说明

    - **Operating Junction and Storage Temperature Range** (T_J, T_Stg): 工作结温和存储温度范围为-55℃至150℃。 ##### 2. 动态特性 - **R_DS(on)** (R_DS(on)): 漏源导通电阻在V_GS=-10V时为0.035Ω,在V_GS=-...

    Python合并两个字典的常用方法与效率比较

    ### Python合并两个字典的常用方法与效率比较 在Python编程中,经常需要将两个字典合并成一个。本文将详细介绍几种常用的字典合并方法及其效率对比,通过实际示例来...希望本文所述对大家的Python程序设计有所帮助。

Global site tag (gtag.js) - Google Analytics