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

问题描述:

是否有一个类型系统扩展宏,并给你生成的代码,最终将被执行的类型错误?为生成的代码编译时间错误?

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

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

经常生成源代码是因为它会被“字符串类型”而不赞同,所以我想知道是否有一个类型系统可以使用约束在编写生成代码的代码时提供有价值的反馈。

+1

我不确定这是你想要的,但你看过F#类型的提供者吗? – TeaDrivenDev

+0

我对与SQL交谈不是特别感兴趣。我有兴趣在编写生成代码的代码时获得编译器反馈。 –

+1

一个例子可能是将编译器编写为javascript,您将生成JS,如果您的函数在执行时将生成无效代码,那么使用给定语言编译器反馈会很好。 –

与您想到的轮廓最接近的是typed tagless final approach。虽然它不是严格意义上的宏观特征,但它的表现与宏观扩展非常相似(我会在很多方面进行更好的讨论)。与您相关的是扩展/转换的目标表达式,由施工 - 目标表达式类型直接呈现为元语言类型并由编译器检查。

该方法假定您的元语言中包含足够表现力的类型系统,其中涵盖了目标语言的类型。作为has been demonstrated,你可以用这种方式覆盖SQL的大部分子集(实际上是嵌套关系演算,它直接转换为SQL,并且与最终无标记方法的所有应用程序一样,通过构建强制类型化。)

如果您检查以上参考你会在ML中找到大量的例子,所以你应该没有使用F#来达到这个目的。