函数式编程语言内省

时间:2010-09-07 17:12:49

标签: haskell f# functional-programming ocaml introspection

我正在描绘某种设计(功能的机器学习),它最好是想要一种函数式编程语言,还有内省,特别是以一种易于处理的格式检查程序自己的代码的能力,最好还有能力得到机器生成的代码在运行时编译,我想知道什么是最好的语言来编写它.Lisp当然具有强大的内省功能,但静态类型语言也有优势;我正在考虑的是:

F# - .Net平台在这里有一个很好的故事,你可以在运行时读取字节码,也可以发出字节码并进行编译;我假设从F#访问这些设施没有问题。

Haskell,Ocaml - 通过字节码或解析树,它们有类似的功能吗?

我还应该关注其他语言吗?

7 个答案:

答案 0 :(得分:10)

Ocaml:

  • Camlp4在Ocaml中操作Ocaml具体语法树。 Camlp4的维护实施是Camlp5

  • MetaOCaml用于全面的多阶段编程。

  • Ocamljit在运行时生成本机代码,但我认为它最近没有被维护。

  • Ocaml-Java为Java虚拟机编译Ocaml代码。我不知道是否有很好的反射能力。

答案 1 :(得分:9)

Haskell的内省机制是Template Haskell,它支持编译时元编程,并且当与...结合时。 llvm,提供运行时元编程功能。

答案 2 :(得分:6)

不是真正的答案,但请注意F#Quotations功能和library,以获取更多homoiconicity内容。

答案 3 :(得分:5)

您可以查看typed variant Racket(以前称为PLT计划)。它保留了Scheme的大部分语法简洁性,但提供了静态类型系统。由于Racket是一个Scheme,因此元编程是课程的标准,运行时可以通过a JIT发出本机代码。

答案 4 :(得分:3)

Haskell方法将更多地解析源代码。 Haskell平台包含一个完整的源解析器,或者您可以使用GHC API以此方式访问。

答案 5 :(得分:2)

我还会看看Scala或Clojure,它们随附了所有为Java开发的库。如果库不存在,您永远不必担心。但更重要的是,这些语言为您提供了与Java相同的反射(或更强大的类型)。

答案 6 :(得分:1)

  

我正在描绘某种设计(功能的机器学习),它最好是想要一种函数式编程语言,还有内省,特别是以一种易于处理的格式检查程序自己的代码的能力,最好还有能力得到机器生成的代码在运行时编译,我想知道什么是最好的语言来编写它.Lisp当然具有强大的内省功能,但静态类型语言也有优势;我正在考虑的是:

你能不能像普通的解释器或编译器一样解析源代码?你为什么需要内省?

  

F# - .Net平台在这里有一个很好的故事,你可以在运行时读取字节码,也可以发出字节码并进行编译;我假设从F#访问这些设施没有问题。

F#有一个基本的引用机制,但你只能引用一些表达式而不是其他类型的代码,最明显的是类型定义。此外,它的评估机制比正版编译慢几个数量级,所以它基本上完全没用。您可以使用反射来分析类型定义,但同样,这是非常基本的。

您可以读取字节代码但已编译,因此丢失了许多信息和结构。

F#还具有lexing和解析技术(最值得注意的是fslex,fsyacc和FParsec),但它并不像OCaml那样成熟。

  

Haskell,Ocaml - 通过字节码或解析树,它们有类似的功能吗?

Haskell有模板Haskell,但我从来没有听说有人使用它(放弃软件?)。

OCaml有它的Camlp4宏系统,有些人确实使用它,但它是poorly documented

至于lexing和解析,Haskell有一些库(最着名的是Parsec),OCaml有many libraries

  

我还应该关注其他语言吗?

像Mathematica这样的术语重写语言将是一个明显的选择,因为它们使操作代码变得微不足道。可能会感兴趣Pure语言。

您可能还会考虑MetaOCaml的运行时编译功能。