8

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

4

4 回答 4

12

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

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

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

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

您基本上可以在保持高水平的同时获得专门的手动优化代码的好处。很难回答您的问题,因为我们只是不知道它的用途。它让我想起了 C++ 模板。他们的设计者没有预料到它启用的高级元编程技术。

于 2012-07-12T15:45:26.953 回答
9

一些建议:

  • 在编译时解析一个 PEG 语法,组装一个 PEG 解析器,然后使用所述解析器怎么样?这是挂钩项目。
  • 大型静态查找表的构建。
  • 为正则表达式生成最佳本机代码:std.regex.StaticRegex
  • 从定义文件实现 protobufs。
  • 许多函数,如果它们的输入在编译时是已知的,那么就可以在运行时而不是在运行时进行评估——所有这些都不会改变函数的实现。
于 2012-07-12T15:34:29.710 回答
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));
    }
}

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

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

于 2012-07-13T23:10:38.703 回答
4

这是我能想到的最极客的编译时评估应用程序:以函数的形式为您自己的编程语言编写一个编译器,该函数string f(string code)将您的编程语言的源代码作为参数并输出 D 代码。然后写类似

mixin( f( import("my_code_file") ) );

到你的main.d文件中。这样您就可以滥用 D 编译器及其后端为您生成可执行文件。如果需要,您可以编写一个 shell 脚本(或类似的脚本)来创建main.d文件并在其上运行 D 编译器。这样,您就可以为您的语言获得一半的编译器。至少你不需要关心后端。;)

Appart 从那,我已经阅读了 D 中的编译时光线跟踪器。

于 2012-08-06T17:34:27.147 回答