【问题标题】:Compile time errors for generated code?生成代码的编译时错误?
【发布时间】:2017-01-27 18:51:33
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我不确定这是否是您想要的,但您是否查看过 F# 类型的提供程序?
  • 我对使用 SQL 并不是特别感兴趣。我有兴趣在编写生成代码的代码时获得编译器反馈。
  • 一个例子可能是编写一个转译器到 javascript,你将生成 JS,如果你的函数在执行时会生成无效代码,那么用你给定的语言获得编译器反馈会很好.
  • 我怀疑您正在寻找“编译器即服务”。这正是用于 C# 和 VB.NET 的 Roslyn 编译器。 F# 不使用 Roslyn,但可以通过 F# Compiler Service 包获得编译器服务

标签: types clojure f# functional-programming metaprogramming


【解决方案1】:

最接近您想到的内容是typed tagless final approach。虽然严格来说它不是一个宏特性,但它的行为与宏扩展非常相似(我会在许多方面提出更好的观点。)与您相关的是扩展/转换的表达式是强类型构造 - 目标表达式类型直接呈现为元语言类型并由编译器检查。

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

如果您查看上面的参考资料,您会发现很多 ML 示例,因此您应该可以轻松使用 F# 来实现此目的。

【讨论】:

    猜你喜欢
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多