可以在D代码中使用AST吗?

时间:2016-12-19 12:51:44

标签: d abstract-syntax-tree anonymous-function

我不是在谈论动态编程。我的愿望是在编译时使用以下结构:

obj.where(x => x.some_val >= 14); // <-- LINQ-style :D

有可能直接使用单表达式函数参数AST:

(>=)
  |--(14)
  +--(.)
      |--(x)
      +--(some_val)

现在我只想为所有运算符(如+ / - / * / . /使用x对象使用一些特殊类。 ..)以一些疯狂的脏方式强烈重写,以收集有关匿名函数AST结构的信息(当且仅当此类是此单表达式函数中使用的唯一类时)。

像单个r值的微小AST一样。

技术上有可能吗?

2 个答案:

答案 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。它们允许您生成几乎任何您可能想要的代码。他们只是不允许你操纵现有的代码。