是否可以在 D 代码中使用 AST?
Is it possible to work with AST inside D code?
我不是在谈论动态规划。我的愿望是在编译时使用如下结构工作:
obj.where(x => x.some_val >= 14); // <-- LINQ-style :D
有可能直接使用单表达式函数参数的 AST:
(>=)
|--(14)
+--(.)
|--(x)
+--(some_val)
现在我只想对所有运算符的 x 对象使用一些特殊的 class(例如 +
/-
/*
/.
/...) 以某种疯狂肮脏的方式被强烈覆盖,以收集有关匿名函数 AST 结构的信息(当且仅当此 class 是唯一在此单一中使用的 class表达函数)。
类似于单个 r 值的微型 AST。
技术上是否可行?
不,沃尔特过去一直反对它,例如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 宏做的事情都可以用字符串混合来完成。它们允许您生成几乎任何您可能想要的代码。他们只是不允许您操纵现有代码。
我不是在谈论动态规划。我的愿望是在编译时使用如下结构工作:
obj.where(x => x.some_val >= 14); // <-- LINQ-style :D
有可能直接使用单表达式函数参数的 AST:
(>=)
|--(14)
+--(.)
|--(x)
+--(some_val)
现在我只想对所有运算符的 x 对象使用一些特殊的 class(例如 +
/-
/*
/.
/...) 以某种疯狂肮脏的方式被强烈覆盖,以收集有关匿名函数 AST 结构的信息(当且仅当此 class 是唯一在此单一中使用的 class表达函数)。
类似于单个 r 值的微型 AST。
技术上是否可行?
不,沃尔特过去一直反对它,例如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 宏做的事情都可以用字符串混合来完成。它们允许您生成几乎任何您可能想要的代码。他们只是不允许您操纵现有代码。