我不是在谈论动态编程。我的愿望是在编译时使用以下结构:
obj.where(x => x.some_val >= 14); // <-- LINQ-style :D
有可能直接使用单表达式函数参数AST:
(>=)
|--(14)
+--(.)
|--(x)
+--(some_val)
现在我只想为所有运算符(如+
/ -
/ *
/ .
/使用x对象使用一些特殊类。 ..)以一些疯狂的脏方式强烈重写,以收集有关匿名函数AST结构的信息(当且仅当此类是此单表达式函数中使用的唯一类时)。
像单个r值的微小AST一样。
技术上有可能吗?
答案 0 :(得分:2)
没有,Walter过去一直反对它,例如AST宏。
答案 1 :(得分:2)
如果要在编译时生成代码,则可以使用带有字符串mixins的字符串。 e.g。
string foo(string name, int value)
{
return format("auto %s = %s;", name, value);
}
void bar()
{
mixin(foo("i", 42));
assert(i == 42);
}
这不是一个特别有趣的例子,但只要您可以将字符串操作到您想要的代码中,那么您可以将它们混合在一起,这允许各种代码生成可能性(有用和滥用)。
然而,没有办法在D中实际操纵AST。正如理查德的回答和评论所述,Walter强烈反对在语言中添加这些功能。因此,D不太可能拥有它们。但是考虑到你可以用字符串mixin做多少,很多人可能想用AST宏来完成字符串mixins。它们允许您生成几乎任何您可能想要的代码。他们只是不允许你操纵现有的代码。