Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Templates D模板:最酷的黑客_Templates_Metaprogramming_D - Fatal编程技术网

Templates D模板:最酷的黑客

Templates D模板:最酷的黑客,templates,metaprogramming,d,Templates,Metaprogramming,D,你在D编程语言中做过或看到过的最酷的、有点实用的元编程技巧是什么?有些实用的方法是排除编译时光线跟踪器。使用模板来操作D中的Cocoa对象。报废工具中的DParse是一个模板化的解析器生成器。然而,ldc是唯一一个具有运行编译时GC的D编译器(但即使如此,它也有一些奇怪的随机崩溃)。我玩了一点,你可以做一些有趣的事情,比如配置文件解析之类的,但是在编译时GC完全运行之前,你不能做大事。我最喜欢的是tools.base中的ElemType和KeyType: template ElemType(T)

你在D编程语言中做过或看到过的最酷的、有点实用的元编程技巧是什么?有些实用的方法是排除编译时光线跟踪器。

使用模板来操作D中的Cocoa对象。

报废工具中的DParse是一个模板化的解析器生成器。然而,ldc是唯一一个具有运行编译时GC的D编译器(但即使如此,它也有一些奇怪的随机崩溃)。我玩了一点,你可以做一些有趣的事情,比如配置文件解析之类的,但是在编译时GC完全运行之前,你不能做大事。

我最喜欢的是tools.base中的ElemType和KeyType:

template ElemType(T) {
  alias typeof((function() {
    foreach (elem; Init!(T)) return elem; assert(false);
  })()) ElemType;
}

template KeyType(T) {
  alias typeof((function() {
    foreach (key, elem; Init!(T)) return key; assert(false);
  })()) KeyType;
}

。您可以使用它来混淆代码中嵌入的字符串。只需搜索“散列”。该页面上还有许多其他有趣的示例。

a(它不允许您犯单元错误)。

它在编译时生成ASM代码(在编译器之前)

就最酷的而言,我不得不说是Kirk McDonald's(和其他类似的绑定)因为它们在检测和处理大量不同类型以及复杂代码生成方面做了大量的工作

也就是说,PyD之所以获胜,是因为技术上使用CTFE,而不是模板


就个人而言,D模板在我的一个研究项目中得到了广泛的使用。这是一个模拟框架,模块可以在其中定义自己的私有数据类型。向框架公开新的用户类型需要一行代码,为该类型创建一个XML解析器以及相关的网络序列化/反序列化代码。

我将回答我自己的问题,因为当我问这个问题时,这个问题并不存在。我为垃圾收集器编写了一个补丁,它使用模板和编译时自省为任意复杂的用户定义类型生成指针偏移量信息,以允许精确的堆扫描,而不是在编译器中完成此操作。

我编写了一个memoize()函数,其头是(此处粘贴的代码有点长):

自动记忆(TFunc)(TFunc功能)

它所做的是,给它一个函数的地址,它返回一个强类型委托(与原始函数的签名和返回类型相同),该委托缓存原始函数的返回值,因此使用同一参数调用它两次只调用底层函数一次以线性而非指数时间执行的斐波那契序列的定义:

单位纤维(单位n) {返回n>0?n>1?记忆化(&fib)(n-1)+记忆化(&fib)(n-2):1:0;}

您可以正常地调用它,如:fib(1000)


编辑:我发布的链接之前的代码相当可怕;

一个例子是D的标准库中的工具,它从用户指定的布局开始生成位字段操作代码

这是另一个例子。它根据用户提供的类型和可选名称生成元组。除了注入命名字段之外,这里没有太多生成性umph,但我认为这是一个说明性的例子

在不知道Lambert的漏洞的情况下,我只是将memoize添加到标准库中-有关文档、代码和相关新闻组讨论,请参阅

我工作的另一个工具是一个高阶函数,它将积分或实值函数制成表格(例如,提供快速指数)。这还没有准备好发布


一旦在编译期间允许创建对象,就可以很容易地创建正则表达式引擎,这些引擎在编译期间执行所有自动生成。

混合从对象读取和写入简单结构:

像这样使用它:

align (1) struct MyStruct {
        ... definitions here ...
        mixin TStructReader;
        mixin TStructWriter;
}

auto ms = MyStruct(stream);
ms.write(stream);
还广泛使用元编程与Lua无缝交互。
你可以用一个命令注册一个完整的类。

给它输入一个D大小的语法(~200个产品)“仅”需要7分钟和700MB来编译。(完全公开,我写了dparse)将代码发布到github并共享。好吧,如果你愿意的话。谢谢你的建议!是的,我确实想共享它。:)我从未听说过这个网站,但是我刚刚报名了。我对它的工作原理有点困惑,不过。。。我需要创建密钥对和所有东西吗?或者我在网站的一个不相关的部分?如果你想做任何工作,你自己的回购你将需要一个密钥对(我建议它)。但你也可以很容易地创造一个要点:酷!这是密码,如果有人感兴趣的话:@StefanMajewsky:啊,是的,我有,很抱歉<代码>自动记忆(F)(F)if(isCallable!(F)){alias ParameterTypeTuple!(F)P;返回委托(P args){static typeof(F(args))[Tuple!(F,P)]缓存;自动键=Tuple(F,args);返回缓存中的键?缓存[key]:(缓存[key]=F(args));};
align (1) struct MyStruct {
        ... definitions here ...
        mixin TStructReader;
        mixin TStructWriter;
}

auto ms = MyStruct(stream);
ms.write(stream);