我将此功能集成在我喜欢的语言OCaml中,我知道这是D中的性感功能,但除了一些优化之外,编译时评估的用例是什么? 越多越好,极客越好: - )
答案 0 :(得分:12)
优化当然是一个很大的用例。像ctRegex这样的东西比它们的运行时编译的正则表达式(通常)更好。解析器生成器也很有趣(见Pegged)并且会受到越来越多的关注。人们刚刚开始接受可以做的事情。
您可以执行mixin(import_c("header.h"))
之类的操作来解析和构建任意C头的D接口文件(当然,您需要在D中为C编写解析器来执行此操作)。
可以进行极快的字符串格式化,因为格式字符串(例如,"%0.2f"
)通常在编译时是已知的。您可以读取格式字符串,只生成格式化所需的代码,删除各种不必要的部分。
vibe.d实际上支持编译时模板。模板文件(基于Jade / HAML)可以包含D代码。它读取它并生成一个自定义的D代码块(想象它就像“”~title~“......”)。我不相信作者已经做过基准,但它应该非常快。
您基本上可以获得专业手动优化代码的优势,同时保持高水平。很难回答你的问题,因为我们只是不知道它将被用于什么。它让我想起了C ++模板。他们的设计者没有预料到它所启用的先进的元编程技术。
答案 1 :(得分:9)
一些建议:
答案 2 :(得分: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
自动创建一个可以保存该表行的结构。如果更改架构,则不会更改struct的代码。但是,您必须更改依赖于旧模式的任何代码 - 但这是一件好事,因为它会将运行时错误转换为编译错误。
当然,您也可以使用此方法添加getter + setter属性,并将其用于XML DTD和Web服务。
答案 3 :(得分:4)
以下是我能想到的编译时评估的最常见应用:以函数string f(string code)
的形式为您自己的编程语言编写编译器,它将您的编程语言的源代码作为参数并吐出D代码。然后写点像
mixin( f( import("my_code_file") ) );
进入main.d
文件。这样,您可以滥用D编译器及其后端为您生成可执行文件。如果需要,可以编写一个shell脚本(或类似的东西),创建main.d
文件并在其上运行D编译器。这样您就可以获得半个编译器来支持您的语言。至少你不需要关心后端。 ;)
来自那里的公寓,我已经读过D.中的编译时光线跟踪器。