键入的元编程语言

时间:2010-06-14 13:39:14

标签: metaprogramming static-typing

我想在静态类型语言中进行一些元编程,我的程序和我的元程序都将被输入。我的意思是强烈意义:如果我的程序生成器编译,我希望类型系统足够强大,只能生成类型正确的程序。

据我所知,只有metaocaml可以做到这一点。 (不,模板Haskell和C ++模板都不符合要求 - 请参阅this paper)。问题:其他语言/系统允许的是什么?

编辑:据我所知,metaocaml已经死了。 Oleg tried to resurrect it,但这仍然是OCaml本身背后的几个版本。如果一个人想要使用实验语言(即比metaocaml更多,似乎Ur并且很可能Idris符合该法案。该字段的任何其他新条目?

5 个答案:

答案 0 :(得分:8)

要做到这一点,你必须确保元编程本身直接尊重/检查基础语言的类型系统。实际上,这几乎迫使元编程成为基础语言......所以我想我也不会惊讶你可以在metaocaml中做到这一点。

我们大多数人都没有在底层语言中构建元编程工具(C ++是一个例外,我拒绝它,基于反射的系统太弱而不能进行任意转换)。

可以在代码上执行任意转换(或由那些组合组成的元程序)的系统是DMS Software Reengineering Toolkit。 DMS具有许多实际语言的前端,在解析时构建编译器数据结构(包括AST)。 DMS提供source-to-source program transformations,表示使用目标语言的表面语法将转换表示为AST重写。它在一定程度上满足您的要求:如果您的转换规则在语法上是正确的(并且它们由DMS检查),那么转换的程序在语法上是正确的。它不能达到您的类型正确性要求,因为类型检查机制是在目标语言之外实现的。原则上,可以使用类型安全的检查器来增强程序转换;在实践中,我们发现我们可以足够可靠地编码转换。

即使您有类型安全的转换,您也无法保证原始程序的语义安全性。所以,你仍然需要调试元程序。

答案 1 :(得分:6)

F#也可以通过Code Quotations执行此操作。

答案 2 :(得分:6)

答案 3 :(得分:1)

Scala中的编译时元编程。

Our flavor of macros is reminiscent of Lisp macros, adapted to incorporate type safety and rich syntax. Unlike infamous C/C++ preprocessor macros, Scala macros: 1) are written in full-fledged Scala, 2) work with expression trees, not with raw strings, 3) cannot change syntax of Scala.

答案 4 :(得分:0)