Haskell 非C++;用于生成式编程的语言?

Haskell 非C++;用于生成式编程的语言?,haskell,lisp,clojure,metaprogramming,boo,Haskell,Lisp,Clojure,Metaprogramming,Boo,C++可能是和最流行的语言 P>除了C++之外,还有其他支持生成程序的语言(创建程序的程序)吗?< /P> < P> LISP支持一种“元编程”的形式,尽管与C++模板元编程不一样。此外,术语“static”在此上下文中可能有不同的含义,但如果您的意思是静态类型的话,Lisp也支持静态类型。模板式元编程的替代方法是在各种Lisp实现中看到的宏式元编程。如果您对在JVM上运行的带有宏的Lisp感兴趣,我建议您下载并查看一下 Lisp中的宏比C/C++风格的宏功能强大得多,它们本身就构成了一种语言

C++可能是和最流行的语言


<> P>除了C++之外,还有其他支持生成程序的语言(创建程序的程序)吗?< /P> < P> LISP支持一种“元编程”的形式,尽管与C++模板元编程不一样。此外,术语“static”在此上下文中可能有不同的含义,但如果您的意思是静态类型的话,Lisp也支持静态类型。

模板式元编程的替代方法是在各种Lisp实现中看到的宏式元编程。如果您对在JVM上运行的带有宏的Lisp感兴趣,我建议您下载并查看一下

Lisp中的宏比C/C++风格的宏功能强大得多,它们本身就构成了一种语言——它们是用于元编程的。

并且是我个人对这类东西的最爱。Nemerle有一个非常优雅的宏语法,尽管它的文档很差。Boo的文档非常优秀,但是它的宏有点不够优雅。然而,这两种方法都非常有效

这两种语言都以.NET为目标,因此它们可以轻松地与C#和其他.NET语言进行互操作——如果使用IKVM,甚至可以与Java二进制文件进行互操作

编辑:澄清一下,我指的是Lisp意义上的宏,而不是C的预处理器宏。这些允许在编译时定义新语法和大量元编程。例如,Nemerle附带的宏将在编译时根据SQL server验证SQL查询。

我推荐。下面是一个描述其编译时元编程功能的示例。

与C++类似,但具有更好的元编程支持。以下是仅使用编译时元编程编写的光线跟踪器示例:

此外,还有一个GCC分支,叫做“概念GCC”,它支持C++编程的元编程结构(至少还没有)。

对于这个特定的功能来说,“元编程”的确是一个坏名字,至少当您讨论多种语言时是这样,因为这个功能只适用于以下语言的一小部分:

  • 静止的
  • 编译成机器语言
  • 针对编译时的性能进行了大量优化
  • 可通过用户定义的数据类型扩展(C++中的OOP)
  • 大受欢迎
去掉其中任何一个,“静态元编程”都没有意义。因此,如果C++中的任何一种远程主流语言都有类似的内容,我将感到惊讶。
当然,动态语言和几种函数式语言支持完全不同的概念,也可以称为元编程。

当然,元语言(ML):

模板元编程本质上是对模板机制的滥用。我的意思是,你从一个功能中得到的基本上是你所期望的,这是一个意外的副作用——它是一团乱,而且(尽管工具越来越好)是一个真正的麻烦,因为语言不支持你这么做(我应该指出,我在这方面的最新经验已经过时,因为我基本上放弃了这种方法。不过,我还没有听说有任何重大进展。)

大约在98年,我就开始寻找更好的解决方案。我可以根据它编写有用的系统,但它们都是地狱般的。四处摸索最终让我找到了Common Lisp。当然,模板机制是图灵完成的,但intercal也是如此

Common Lisp的元编程功能是“正确的”。在进行元编程时,您可以使用该语言的全部功能,无需特殊语法,而且由于该语言非常动态,您可以使用它做更多的事情


当然还有其他选择。我使用的元编程语言中没有任何一种语言比Lisp做得更好,这就是为什么我在研究代码时使用它。虽然有很多原因你可能想尝试其他东西,但这都是一种折衷。你可以看看Haskell/ML/OCaml等。很多函数式语言都有一些类似的东西利用Lisp宏的强大功能。你可以找到一些针对.NET的东西,但它们都非常边缘化(在用户基础等方面)工业用语言中没有一个大玩家真的有这样的功能。

让我列出一些重要的细节关于元编程如何在lisp中工作(或者,或者,或者,选择你最喜欢的“动态”语言):

  • 在lisp中进行元编程时,您不必处理两种语言。。元级代码与生成的对象级代码使用相同的语言编写。元编程不仅限于两个级别,而且对大脑来说也更容易
  • 在lisp中,您可以在运行时使用编译器。事实上,编译时/运行时的区别在那里感觉非常人为,并且很大程度上取决于您的观点。在lisp中,只需调用函数,您就可以将函数编译为机器指令,从那时起,您可以将其用作第一类对象;i、 它们可以是未命名的函数,可以保存在局部变量或全局哈希表中,等等
  • lisp中的宏非常简单:一组函数填充在哈希表中并交给编译器。对于编译器要编译的每个表单,它都会参考该哈希表。如果它找到一个函数,然后在编译时用原始表单调用它,并编译此函数ret的表单,而不是原始表单URN。(对一些不重要的细节进行模化)因此lisp宏基本上是编译器的插件
  • 在lisp中编写一个lisp函数来计算lisp代码大约需要两页代码(通常称为eval)。在这样一个函数中,您可以在元级别上引入您想要的任何新规则。(让它快速运行需要一些努力。)
    // \ <module:hello>
    #include <stdlib.h>
    
    void main() {
    }
    
    // / <module:hello>