这个版本实现了计划已久的数组直接量。
<!---->import std.stdio;
void main(){
{
static int[] arr = [1,2,3,4,5];
writefln(typeid(typeof(arr[0])));
writefln(arr);
}
{
static float[] arr = [1f,1,3,4,5];
writefln(typeid(typeof(arr[0])));
writefln(arr);
}
{
static char[][] arr = ["1","2","3","4","5"];
writefln(typeid(typeof(arr[0])));
writefln(arr);
}
}
数组类型由第1个元素类型决定,类型不匹配将会产生编译错误。
接着是多维数组:
<!---->import std.stdio;
void main(){
static int[][] arr = [[1,2,3,4], [4,5,6], [7,8]];
foreach(int[] sub; arr){
foreach(int i; sub){
writefln(i);
}
}
}
另一个特性是更强的typedef。原有的typedef强类型在某些情况下会产生混乱。
下面的代码摘自 http://www.digitalmars.com/pnews/read.php?server=news.digitalmars.com&group=digitalmars.D.bugs&artnum=3843
<!---->import std.stdio;
typedef int Int1;
typedef int Int2;
void show(Int1 v) {
writefln("Int1: %d", v);
}
void show(Int2 v) {
writefln("Int2: %d", v);
}
void show(int i) {
writefln("int: %d", i);
}
void show(long l) {
writefln("long: %d", l);
}
void main() {
Int1 value1 = 42;
Int2 value2 = 69;
show(value1 + value2);
show(value2 + value1);
show(2 * value1);
show(value1 * 2);
show(value1 + value1);
show(value2 - value2);
show(value1 + 2);
show(3 + value2);
long l = 23;
show(value1 + l);
show(l + value2);
short s = 105;
show(s + value1);
show(value2 + s);
}
如上面代码所示。typedef定义出来的类型和原有类型的相同形式重载函数可以共存,这可以完成更强类型的重载,C++的重载还不能实现这个。
这个强类型的typedef好像原本就支持,大概是运算结果类型比较模糊。
好处是显页易见的。比如有一个Time和TimeInterval类型,它用来表示绝对时间或相对时间间隔;另有一个输出函数用来显示结果。
<!---->import std.stdio;
import std.string;
typedef long Time;
typedef long TimeInterval;
void output(Time t){
writefln("Time: " ~ toString(cast(long)t));
}
void output(TimeInterval t){
writefln("Interval: " ~ toString(cast(long)t));
}
void main(){
Time time = cast(Time)100;
TimeInterval interval = cast(TimeInterval)100;
output(time);
output(interval);
}
是的,使用上麻烦了很多,因为我们试图用一个数值类型去表示多个矢量类型。
这里Time time = cast(Time)100不再只是100这个简单的数值,它还携带了Time这个类型。TimeInterval interval = cast(TimeInterval)100也不只是100这个数值,我们给它赋予了时间间隔的含义。
还可以想像得更开阔一些,用它定义时间、长度、面积、加速度、速度、温度等,重载一些计算函数(可惜D还不支持全局操作符重载),这样就方便完成一些物理量的运算了,而且类型得到检查,速度加一个整数值结果还是速度,速度乘时间得到的是长度,时间减时间得到的是时间间隔,速度加时间将产生编译错误。。。。。。神奇的是这些类型可能都是一些简单类型,我相信它至少可以保证运行效率不会太低。当然你用C++类也可以完成这些,并且利用编译器优化让它的效率保持最高,甚至内联的结果就是简单类型的运算,我还是更愿意使用这简单的类型来typedef。当然这可能需要写大量重复的函数重载形式,没有关系,我想使用模板和mixin应该可以简化这一过程,而且会有相当多的家伙们愿意使用这种麻烦的形式来获得更“正确”的编译检查。
所以说,D语言的typedef的意义其实就是实现了矢量类型。
又多想了一点。
强类型要,语法糖也应该要。是不是可以借鉴一下ruby的语法,实现这种调用呢?
<!---->Length l = 1.cm;
l = 1.m;
Time t = Time.now;
TimeInterval i = 3.hours;
免去了一些初始化的麻烦。
相关推荐
编译器源代码之:DMD(D语言)dmd.2.026。vc6编译通过
D语言编译器DMD 2.065已经发布了,D语言经过近年来的努力终于取得不错的成绩!这个版本包含了大量问题修复和改进,真是值得敬佩
D语言是结合了C#、Java和 C++以及PHP、Python等动态语言的特性于一身,且不依赖于虚拟机, 而是作为可执行程序单独来运行的,这样它的效率非常高。
NULL 博文链接:https://godspeedhu.iteye.com/blog/423419
Dynamic Mode Decomposition (DMD).zip
用于控制sim显微镜中的dmd部分。 此代码可以控制dmd产生规则的图形。以控制显微镜光源形状
Schematic-FLD3 DMD Board DLP TI
快照数据的动态模态分解,获得基模态和对应的特征值,包括频率和增长率,以及数据后处理。
用于了解DMD的文档。 dmd可以用于结构光超分辨显微镜。
Arduino dmd library for matrix display
DMD2-master_DMD_源码.zip
动态模式分解的matlab 代码,有注释
D 程序设计语言 DMD0.109 原英文版权属于Digital Mars 翻译的大部分文档版权属于uframer 其中有部分翻译文档版权属于qiezi 其中有部分翻译文档版权属于ideage
数字微镜DMD编程,包括设置帧频、画面大小和积分时间等参数
数据决策与模型工具模板 (DMD spreadsheets),用于决策分析一整套的工具表格,涵盖经济、营销、人力资源等
本资源为Visual D 1.0.1-beta1安装包,或者亦可以直接去GitHub下载其他的版本的安装包.https://github.com/dlang/visuald/releases
DMD回归模型PPT课件.pptx
Hi3798CV200硬件HDK 海思网络机顶盒方案硬件开发资料 硬件版本号:CV2DMD 包含原理图和PCB(PCB包含PADS和ALLEGRO两个版本)
DMD芯片显示原理详解.doc
Dynamic_Mode_Decomposition_DMD_源码.zip