是否可以使用AST内部的D代码?

是否可以使用AST内部的D代码?,d,abstract-syntax-tree,anonymous-function,D,Abstract Syntax Tree,Anonymous Function,我不是说动态规划。我希望在编译时使用以下结构: obj.where(x => x.some_val >= 14); // <-- LINQ-style :D 现在我只想到使用一些特殊的x-objects类和所有操作符(如+/-/*//…)以某种疯狂肮脏的方式被强烈覆盖,以收集有关匿名函数AST结构的信息(当且仅当此类是此单一表达式函数中使用的唯一类时) 就像单个r值的微小AST 这在技术上是可能的吗?不,Walter在过去相当反对它,例如AST宏。不,Walter在过去相当反

我不是说动态规划。我希望在编译时使用以下结构:

obj.where(x => x.some_val >= 14); // <-- LINQ-style :D
现在我只想到使用一些特殊的x-objects类和所有操作符(如
+
/
-
/
*
/
/…)以某种疯狂肮脏的方式被强烈覆盖,以收集有关匿名函数AST结构的信息(当且仅当此类是此单一表达式函数中使用的唯一类时)

就像单个r值的微小AST


这在技术上是可能的吗?

不,Walter在过去相当反对它,例如AST宏。

不,Walter在过去相当反对它,例如AST宏。

如果你想在编译时生成代码,那么你可以将字符串与字符串混合使用。例如

string foo(string name, int value)
{
    return format("auto %s = %s;", name, value);
}

void bar()
{
    mixin(foo("i", 42));
    assert(i == 42);
}
这不是一个特别有趣的示例,但只要您可以将字符串操纵到所需的代码中,就可以将它们混合在一起,这就允许各种代码生成可能性(有用的和滥用的)


然而,没有办法在D中实际操作AST。正如Richard的回答和评论中所提到的,Walter强烈反对将此类功能添加到语言中。因此,D不太可能拥有这些功能。但是考虑到您可以用字符串混合来做很多事情,有人可能想用AST宏来做很多事情可以通过字符串混合来完成。它们允许您生成几乎任何您可能想要的代码。它们只是不允许您操作现有代码。

如果您想在编译时生成代码,那么您可以将字符串与字符串混合使用。例如

string foo(string name, int value)
{
    return format("auto %s = %s;", name, value);
}

void bar()
{
    mixin(foo("i", 42));
    assert(i == 42);
}
这不是一个特别有趣的示例,但只要您可以将字符串操纵到所需的代码中,就可以将它们混合在一起,这就允许各种代码生成可能性(有用的和滥用的)


然而,没有办法在D中实际操作AST。正如Richard的回答和评论中所提到的,Walter强烈反对将此类功能添加到语言中。因此,D不太可能拥有这些功能。但是考虑到您可以用字符串混合来做很多事情,有人可能想用AST宏来做很多事情可以通过字符串混合来完成。它们允许您生成几乎任何您可能想要的代码。它们只是不允许您操作现有代码。

您要求的不是简单的使用lambda的过滤器吗?您是否坚持使用基于D的解决方案来操作ast for D代码,或者您是否有兴趣使用D sourc的解决方案e代码,但不是在D中实现的?@DejanLekic使用lambda进行过滤是标准库中的一个非常基本的工具(不,这不是我想要的)。遗憾的是,你做出了这样的假设,这意味着我的问题似乎不是很聪明:)Dejan,我想他想要的是.NET的表达式树或Nim节点。不幸的是,这在D中是不可能的。考虑到D惊人的编译时间,这有点令人难过,因为AST将使它变得完美,并且代码生成更容易。不幸的是,它可能永远不会到来。你可以通过创建一个解析器来完成它,然后创建一个包含你的树的模块,这是一个很简单的方法。但是这是一个很长的过程,并且不是很灵活。@Bauss-D社区中有人(包括我)认为AST操作和宏是通往地狱的高速公路。。。AST操作在所有支持它的语言中都被滥用。关于宏。。。我甚至不会去想它,它只是让我想起我和C++的痛苦,还有C.的痛苦。Walter坚决反对他们是对的。你所要求的不只是一个使用lambda的过滤器吗?你是坚持使用基于D的解决方案来处理D代码的AST,还是对一个可以使用D源代码的解决方案感兴趣,但是不是在D中实现的吗?@DejanLekic使用lambda进行过滤是标准库中的一个非常基本的工具(不,这不是我想要的)。很遗憾,你做出了这样的假设,这意味着我的问题似乎不是很聪明:)Dejan,我认为他想要的是.NET的表达式树或Nim节点。不幸的是,这在D中是不可能的。考虑到D惊人的编译时间,这有点令人难过,因为AST将使它变得完美,并且代码生成更容易。不幸的是,它可能永远不会到来。你可以通过创建一个解析器来完成它,然后创建一个包含你的树的模块,这是一个很简单的方法。但是这是一个很长的过程,并且不是很灵活。@Bauss-D社区中有人(包括我)认为AST操作和宏是通往地狱的高速公路。。。AST操作在所有支持它的语言中都被滥用。关于宏。。。我甚至不会去想它,它只是让我想起我和C++的痛苦,还有C.的痛苦。沃尔特坚决反对他们是对的。