您可以使用静态类型检查(如Java)命名语言,代码是数据(如LISP中)吗?我的意思是两种语言。
答案 0 :(得分:14)
Qi是一种静态类型的Lisp方言。此外,许多其他Lisp方言有(可选)静态类型。
Java本身的功能非常有限。
有趣的问题不在于您是否可以进行元编程和静态类型,而是您是否可以将动态元编程静态类型安全。
有进行元编程的模板Haskell, 类型安全,但它是静态元编程。
目前我无法想到我所知道的任何语言允许动态元编程和动态元编程是静态类型安全的。齐可能很难做到,但我不确定。
答案 1 :(得分:11)
Racket(以前的PLT Scheme)有一个statically typed dialect,它可以很好地与Scheme惯用法一起使用 - 包括宏。 (它通过类型检查扩展结果来工作。)
答案 2 :(得分:4)
F#有Quotation expressions。从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
复杂得多。
然而,使用quote
的“代码作为数据”的90%可以通过闭包来完成,因为它们也会延迟评估。许多语言都有一个方便的语法来制作闭包(C#,Clojure,Scala和Ruby特别想到)并且不需要quote
那么多。即使在Scheme中,它是一个明确的Lisp,流行的风格也倾向于将函数传递给写宏。
答案 3 :(得分:4)
Template Haskell是静态类型的,但允许您将代码操作为数据,即元编程。相关语言包括MetaML和MetaOCaml。查看Tim Sheard的工作。
答案 4 :(得分:0)
如果您只是在寻找以静态类型语言动态执行代码的能力,那么Java本身就可以做到:
http://www.javaworld.com/javaworld/jw-06-2006/jw-0612-dynamic.html
如果您需要更多(希望方法和类作为第一类对象等),那么您将需要使用Haskell或C#之类的东西(如其他答案中所述)。
答案 5 :(得分:0)
可能Strongtalk或Zero是反射系统 a la Smalltalk,但是是静态类型的。