键入的元编程语言

Jac*_*tte 15 static-typing metaprogramming

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

据我所知,只有metaocaml才能做到这一点.(不,模板Haskell和C++模板都不符合要求 - 参见本文).问题:其他语言/系统允许哪些内容?

编辑:据我所知,metaocaml已经死了.奥列格试图恢复它,但这仍然是OCaml本身背后的几个版本.如果一个人想要使用实验语言(即甚至比metaocaml更多),看起来Ur和很可能是Idris符合这个要求.还有其他新的参赛作品吗?

Ira*_*ter 8

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

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

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

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


Str*_*ger 6

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

  • 是的,类型检查应用程序,如果这是你要求的.例如`let x = <@square 5 @>`,这里的x有`Expr <int>`类型.表达评估通过AST重写完成. (2认同)