我正在描绘某种设计(功能的机器学习),它最好是想要一种函数式编程语言,还有内省,特别是以一种易于处理的格式检查程序自己的代码的能力,最好还有能力得到机器生成的代码在运行时编译,我想知道什么是最好的语言来编写它.Lisp当然具有强大的内省功能,但静态类型语言也有优势;我正在考虑的是:
F# - .Net平台在这里有一个很好的故事,你可以在运行时读取字节码,也可以发出字节码并进行编译;我假设从F#访问这些设施没有问题。
Haskell,Ocaml - 通过字节码或解析树,它们有类似的功能吗?
我还应该关注其他语言吗?
答案 0 :(得分:10)
Ocaml:
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的运行时编译功能。