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++模板.他们的设计者没有预料到它所启用的先进的元编程技术.
一些建议:
使用时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服务.