编译生成的代码的时间错误?

时间:2016-09-20 00:41:08

标签: types clojure f# functional-programming metaprogramming

是否有一个类型系统可以扩展宏并为生成的代码提供最终会执行的类型错误?

一个实际的例子可能是动态生成一些SQL,但是根据一些约束(在执行代码之前)从编译器接收语法错误。

另一个例子可能是生成一个带有n个嵌套for循环的函数来生成n个组合。

经常生成源代码是不受欢迎的,因为它将被"字符串键入",所以我想知道是否有类型系统可以使用约束来为您提供有价值的反馈,同时编写代码生成代码。

1 个答案:

答案 0 :(得分:2)

最让你想到的是typed tagless final approach。虽然严格来说它不是一个宏观特征,但它的行为与宏扩展非常相似(我认为在很多方面都会更好。)与你相关的是扩展/转换的目标是强类型 by构造 - 目标表达式类型直接表示为元语言类型,并由编译器检查。

这种方法假设您在元语言中有一个足够表达的类型系统,涵盖了目标语言的类型。作为has been demonstrated,您可以通过这种方式覆盖SQL的一大部分(实际上是嵌套的关系演算,它直接转换为SQL,与最终无标记方法的所有应用程序一样,通过构造强类型化。)

如果您查看上面的参考文献,您会在ML中找到大量示例,因此您可以毫无困难地使用F#来实现此目的。

相关问题