您能说出具有静态类型检查(类似于Java)并且代码是数据(就像在LISP中一样)的语言吗? 我的意思是指一个语言同时拥有这两点。
您能说出具有静态类型检查(类似于Java)并且代码是数据(就像在LISP中一样)的语言吗? 我的意思是指一个语言同时拥有这两点。
Qi是一种静态类型的Lisp方言。此外,许多其他Lisp方言也具有(可选的)静态类型。
Java本身在这方面的能力非常有限。
有趣的问题不是你是否可以拥有元编程和静态类型,而是你是否可以实现静态类型安全的动态元编程。
有Template Haskell这个工具可以进行元编程并且是类型安全的,但它是静态的元编程。
目前我无法想到任何一种语言实现了我所知道的允许动态元编程以及动态元编程静态类型安全的语言。Qi可能可以实现,但我不能确定。
F#具有引用表达式。以下是MSDN页面上的内容:
// typed
let e : Expr<int> = <@ 1 + 1 @>
// untyped
let e' : Expr = <@@ 1 + 1 @@>
// splicing with %
// similar to Lisp's unquote-splicing, but type-checked:
// you can only splice expressions of the appropriate type
<@ 1 + %e @>
我认为这些在C#中是可用的,但是(1)我不知道语法是什么(2)数据结构是不同的。
这些语言允许在编译时将代码作为数据,就像Lisp宏一样:
免责声明:我实际上没有使用过任何一个。据我所知,它们都比Lisp的quote
更加复杂。
然而,90%的“代码作为数据”使用quote
可以通过闭包来完成,因为它们也会延迟评估。许多语言都有方便的语法来创建闭包(例如C#,Clojure,Scala和Ruby),并且不需要太多使用quote
。即使在Scheme中,它是一个明确的Lisp,流行的风格也倾向于传递函数而不是编写宏。
quote
所用之处,而闭包也同样具备,尽管不太方便。我所说的不仅仅是宏,因为宏只是代码即数据的受限使用方式。 - Nathan Shively-Sanders模板 Haskell 是一种静态类型语言,但它允许您将代码作为数据进行操作,也就是所谓的元编程。相关的语言包括 MetaML 和 MetaOCaml。请查看 Tim Sheard 的工作。
http://www.javaworld.com/javaworld/jw-06-2006/jw-0612-dynamic.html
如果你需要更多的功能(例如将方法和类作为一等对象),那么你最好使用像Haskell或C#(如其他答案中提到的)这样的编程语言。