超猛的代码,刚才逛新闻组刚看到的,随便记录一下。
出自:
http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D&article_id=68681
import std.stdio;
import std.traits;
//检测整数操作溢出,不过对性能的影响比较大,lazy 关键字的标准运用。
Integral checked(Integral)(lazy Integral dg)
{
static assert(isIntegral!(Integral));
...
前几天 Ubuntu Linux 8.04 (Hardy) 刚放出了 Beta1,昨天没事就下载了下来尝尝鲜。
习惯性的输入 sudo apt-get install gdc,居然给我装上了 GDC 0.25,这个还没发布的版本。
D1.0 代码
/** TupleMixin 演示程序, DMD2.007/GDC0.24 测试通过
Written in the D programming language 1.0
作者: oldrev
Copyrights: BSD
*/
import std.stdio;
//PredT 参数的作用是让你能够在每个模板混入之前对它进行处理,
//比如可以在混入前用 static assert 检查是否有特定的成员
//总而言 ...
今天晚上费了点脑筋写了一个简单的 C2D 转换脚本,大致实现了函数申明、全局变量、typedef、enum、struct 和数组的转换,但是还不支持预处理、union、调用约定等。
ruby 代码
#!/bin/ruby
require 'rexml/document'
#TODO:
# * 调用约定
# * union &n ...
通过1.0的代码完全模拟了 D 2.0 __traits(hasMember...) 和部分 getMember 的功能:
import std.stdio;
template HasMember(T, string member)
{
const bool HasMember = is(typ ...
作为 C++ 狂热的粉丝,你在多年使用C++的过程中是否有过以下症状:
Boost 和 STL 真不错,但是编译太慢,让我想砸电脑!
我讨厌一个程序写两次,干嘛要头文件?编译器不会自动提取声明吗?
经常有大师教导你不要用宏,但是现实是没有那个程序不用!
我从来不喜欢指针,但我也不想失去它
我想要垃圾回收!!!
C++的元编程真酷,我也想试试,但我是凡人。
多继承、虚继承太复杂,我想要 interface,但是有能保持多继承的威力。
羡慕 C# 的Property、delegate...?
...
刚在 D语言的新闻组里看到了D模板&元编程顶尖高人 Don Clugston 的新作——Compile time lex + parse + semantic = 300 lines of code 一个用300行代码就实现的D语言编译时词法解析、语法解析、语义分析器,换句话说就是一个非常简单的编译器前端。
当然了,这也不是什么新技术,C++ 借助一些模板递归也能实现出像 boost.spirit/boost.phoenix 这样的语法分析器,但是这个语法分析器只是在编译时生成,却不能在编译时运行。而 Don 的实现,借助了D 编译时函数执行(CT ...
Range Coding 是算术编码的变种,二者的效率几乎没有差别,Range Coding 速度更快,且没有专利问题。下面的程序移植和改进自一个非常清晰简洁的C++实现。当然,直接使用下面的代码去压缩文件效果并不好,速度慢压缩率也低,Range Coding 更适合作为其他算法的后端,比如 LZ77、Block Sorting。
如果你看到这里一头雾水的话,可以上 wikipedia 参考“算术编码”,不过更好的选择是找一篇名为《笨笨数据压缩教程》的系列文章来入门。
D1.0 Code
/** Code for range co ...
Dotmars 实例之:容器、迭代器与算法框架
这几天 Mr. Bright 老是不放新版本,圈子里太冷清了,我来发篇程序凑个数。
这是一个类似 C++ STL 的容器、迭代器和算法框架,迭代器的设计参考了 C++ boost 库中的"new-style" 迭代器,把迭代器的遍历和读写操作分开,内置数组处理参考了 qiezi 的文章: 仿STL的vector,写了一组array操作方法。容器方法的命令没有遵循 STL 的风格,而是采用 .Net 范型容器的名称。
借助于 D 威力强大的模板和模板混入,代码虽然大量用到了模板,但是十分地简短易读。
目前仅仅 ...
一个模仿 Ruby Test::Unit 的 Quick & Dirty 单元测试框架,托 __traits 的福,看起来已经有那么点意思了。提取行号在目前还没法实现,估计等 macro 出来就能解决这个问题。
SVN里的最新版在下面的链接处:
dotmars.googlecode.com/svn/trunk/sandbox/2.0/test.d
D2.0 代码
/**
A D 2.0 unit test framework inspired by Ruby's Unit::Test
// Wr ...
D 2.0 Const/Final/Invariant 概念简介
D 2.0 specs 里的相关文档可读性不佳,因此我总结了一个简单的 const/final/invariant 概念简介,更详细的用法还请参考 D 2.0 specs。
在2.0中,invariant 和 const 有作存储类、定义类型和定义成员函数三种用途,深刻地改变了D程序编写的方式,跟C++一样,使用const/final/invariant 需要更仔细地设计和编码,回报是提供了更好的类型安全性并能让编译器产生出更高效的代 ...
DotMars 已经具有初步的样子了,特别发帖庆祝。
DotMars 第一个范例程序(dotmars/samples/io/console.d):
D 代码
module samples.io.console;
import dotmars.io.console;
void main()
{
  ...
刚才写字符串格式化的由于要处理所有内置类型,而且只有 TypeInfo 可用,为了避免恐怖的 if 链,发明了下面这个有趣的switch模拟。
D语言真是太好玩了。
D代码
import std.stdio;
alias void delegate() Case;
void Switch2(T)(T cond,  ...
基础类库的东西看起来容易做起来难,今天花时间实现了一点点 .Net 风格的字符串格式化函数,贴出来娱乐一下。
注意:目前仅支持占位符索引号而已...
import std.stdio;
import std.string;
import std.conv;
alias void delegate(char c) Sink;
alias void* Argument;
const size_t MaxArguments = 16;
...
dsource 上的 juno 是一个很不错的 Windows 封装库,可惜的是作者似乎已经放弃了开发,已经近5个月没有更新了。
由于时间的原因,juno 无法在现在的 DMD 下编译,因此我修改并提取了 juno 库最有价值的 COM 库部分,让它能顺利编译。这么做的目的在于我们现在可以通过 juno 中的 tlbimpd.exe 为 COM 类型库生成接口代码,自己手工转换了。
附件中的 combase.d 是 juno.com.base 的修改版,mshtml.d 是 MSHTML 的接口代码。
需要注意的是当用 tlbimpd 生成代码以后需要将第一行 i ...
一个类似 C# 的 DllImport 实现,用于“半”动态加载 DLL。用起来比我以前写的 DLLWrapper 要麻烦一些,但是 DLLWrapper 由于使用一个 Tuple 来存储函数声明,会造成超长的标识符导致编译错误,这个 DllImport 避免了这个问题。
这个实现有一个缺陷是每次调用API函数的时候都会执行一次 GetProcAddress,效率比较低.... 谁能告诉我怎么避免该死的 CTFE?
代码
// DllImport - A C#-like DLL Wrapper
// written by ...
昨晚我写了一个非常简单的 VIM 的D语言缩写插件,希望能让用VIM编辑D程序的指头轻松一点。
请看下图,当在VIM的插入模式键入“'main”这个字符序列时,该插件能自动将文本替换为一个完整的 main() 函数定义,并且能自动选中 <+ body +> 部分等待输入替换。Ctrl+j 键可以跳转到下一个由 <+ ????? +> 标记的地方,同样会自动选定。
插件中的代码片段由 d_imaps.vim 文件定义,此文件应当放到 ~/.vim/ftplugin(Windows 用户推荐放到 $VIMRUNTIME/ftplu ...
参考 STL 实现的 Quick & Dirty 双向链表模板类,勉强看的过去。参考了 boost 的新概念迭代器,遵循D的命名风格,只实现了几个简单的成员函数。
迭代器使用 i.current属性或i()读取当前指向的元素,使用 i = x; 设置当前指向的元素
update:
添加了 ReverseIterator, rbegin, rend, insert, erase, popBack, popFront
D 的函数模板特化还是有问题(或者我不知道?)
D 代码
// The STL-Like Template Class of Li ...
上回说到 Rank 这个 Ruby 世界最广泛使用的构建工具在 Windows 下有大bug,根本不能运行。Python的scons太慢、自动得过了头,造成定制起来很麻烦.....
最终,我找到了一个叫 Rant 的Ruby构建工具,用起来几乎与 Rank一样,而且特性更多,最重要的是能在 windows 下面正常运行。因此我强烈推荐各位D语言的粉丝使用Rant作为软件构建工具,放弃那些不成熟的IDE。用Rant的好处是还能顺带学习一下Ruby语言,对于像我一样的Ruby&&D双料菜鸟,这是不可多得的学习机会。
如果没有Ruby,请先下载安装 Ruby。 然后在控制台中 ...
在一个日文网站上发现的通用 Rakefile for GDCrequire "rake/clean"NAME = "hogehoge" # プロジェクト名 ##可执行文件名PROG = "#{NAME}"PROG_DEBUG = "#{NAME}_debug"SRC = "src"SRCS = FileList["./src/**/*.d"]OBJS = SRCS.ext "o"OBJS_DEB ...
在正文之前,先佩服一下伟大的GFW——又把 blogspot.com 的二级域名给封了。
如果你和我一样经常为了测试D语言的某个特性而写一些小程序来验证想法,而且恰好也使用 VIM 的话,那么本文就是为你准备的。
首先,VIM7 中自带的D语言语法文件版本很老,请替换为 http://www.vim.org/scripts/script.php?script_id=379 这个支持0.178的。
下面的代码是 VIM 的DMD编译器支持,将其放入 ~/.vim/complier/dmd.vim (for unix-like, Windows 为 $VIMRUN ...
cpp 代码
ubyte a[3] = [2, 3, 4]; //OK!
void main()
{
ubyte b[3] = [2, 3, 4]; //编译错误
}
一只很大的 ...
boost.variant 是安全、范型、基于栈的可识别联合容器,下面的代码是其在D语言中的等价实现。借助D语言强大的元编程能力,其与C++的版本相比,代码清晰,对类型安全有更大的保证。
boost.variant 文档:http://www.boost.org/doc/html/variant.html
boost.any 和 boost.variant 的区别与比较: http://www.boost.org/doc/html/variant/misc.html#variant.versus-any
cpp 代码
// ...
D语言的 TypeTuple既然可以按数组的方式操作,我觉得应该可以对其增加更多的算法,下面的 RemoveIf就是一个例子:
1 module dust.meta.tuple; 2 3 import std.typetuple; 4 5 6 template RemoveIf(alias PredTempl, TList...) 7 { 8 static if (TList.length == 0) 9 alias TList RemoveIf;10 else static if (PredTempl!(TList[0]))11 ...
昨天Walter 发布了D语言编译器 DMD 1.005版,添加了有史以来最Cool的语言特性:mixin/import 语句。
mixin(字符串常量表达式) 语句可以在编译时把字符串常量表达式的结果作为源程序的一部分插入到当前作用域中,举个例子来说:
int a = 2;
mixin("int x = 2; x = 3;");
int y = 6;
x = 4;
就等价于你亲手写:
int a = 2;
int x = 2; x = 3;
int y = 6;
x = 4;
更cool的是import语句,import(字符串差常量表达 ...
- 浏览: 93765 次
- 性别:

- 来自: 昆明

- 详细资料
搜索本博客
我的相册
Screenshot
共 1 张
共 1 张
最近加入圈子
最新评论
-
Range Coding 的 D 实现 ...
引用oldrev 2008-01-12LZMA SDK 只是一个 LZMA 算法 ...
-- by oldrev -
D 静态数组初始化大bug ...
看看日期好伐?
-- by oldrev -
D新闻组里的天才代码
没看过产生的汇编代码,测试了是可行的。如果用宏来实现就完美了
-- by oldrev -
D新闻组里的天才代码
这里的lazy根本没推后evaluate吧? 这个的优化我看在于用了一条指令来决 ...
-- by DavidL -
D 静态数组初始化大bug ...
dmd 1.028编译成功!
-- by honglang13






评论排行榜