D编译时评估的用例是什么?

bob*_*ang 8 compiler-construction ocaml d

我将此功能集成在我喜欢的语言OCaml中,我知道这是D中的性感功能,但除了一些优化之外,编译时评估的用例是什么?越多越好,极客越好:-)

eco*_*eco 12

当然,优化是一个很大的用例.像ctRegex这样的东西比它们的运行时编译的正则表达式(通常)更好.解析器生成器也很有趣(参见Pegged),并将受到越来越多的关注.人们刚刚开始接受可以做的事情.

你可以做一些事情mixin(import_c("header.h"))来解析和构建任意C头的D接口文件(当然,你需要在D中为C编写解析器来执行此操作).

由于格式字符串(例如"%0.2f")通常在编译时已知,因此可以进行极快的字符串格式化.您可以读取格式字符串,只生成格式化所需的代码,去掉各种不必要的部分.

vibe.d实际上支持编译时模板.模板文件(基于Jade/HAML)可以包含D代码.它读取它并生成一个自定义的D代码块(想象它就像""~title~"......").我不相信作者已经做过基准测试,但它应该非常快.

您基本上可以获得专业手动优化代码的优势,同时保持高水平.很难回答你的问题,因为我们只是不知道它将用于什么.它让我想起了C++模板.他们的设计者没有预料到它所启用的先进的元编程技术.


Jus*_*n W 9

一些建议:

  • 如何在编译时解析PEG语法,组装PEG解析器,然后使用所述解析器?这是Pegged项目.
  • 构建大型静态查找表.
  • 为正则表达式生成最佳本机代码:std.regex.StaticRegex
  • 从定义文件实现protobufs.
  • 许多函数,如果它们的输入在编译时是已知的,那么可以在运行时而不是在运行时进行评估 - 所有这些函数都不会改变函数的实现.


Ida*_*rye 5

使用时mixin,它可以提供很大的灵活性.

请考虑以下示例:

template StructFromFile(string fileName){
    string makeStructMembersCode(string[] s){
        if(0==s.length){
            return null;
        }
        string memberName=s[0].strip;
        return q{
            string }~memberName~q{;
            }~makeStructMembersCode(s[1..$]);
    }
    struct StructFromFile{
        mixin(makeStructMembersCode(import(fileName).splitLines));
    }
}
Run Code Online (Sandbox Code Playgroud)

这会创建一个结构,它的成员是文本文件的行.现在,假设您在数据库中有一个表,并且您想要创建一个D结构来存储该表中的行.您可以编写一个shell脚本来读取该表的模式并将其写入文件,然后使用它StructFromFile来自动创建一个可以保存该表行的结构.如果更改架构,则不会更改struct的代码.但是,您必须更改依赖于旧模式的任何代码 - 但这是一件好事,因为它会将运行时错误转换为编译错误.

当然,您也可以使用此方法添加getter + setter属性,并将其用于XML DTD和Web服务.