你能命名具有静态类型检查的语言(如 Java)以及代码在哪里(如 LISP 中的数据)吗?我指的是一种语言中的两件事。
6 回答
Qi 是一种静态类型的 Lisp 方言。此外,许多其他 Lisp 方言具有(可选的)静态类型。
Java 本身的这种能力非常有限。
有趣的问题不是你是否可以拥有元编程和静态类型,而是你是否可以让动态元编程成为静态类型安全的。
有 Template Haskell 进行元编程并且是类型安全的,但它是静态元编程。
目前,我想不出我所知道的任何语言都允许动态元编程并且动态元编程是静态类型安全的。齐可能会这样做,但我不确定。
模板 Haskell是静态类型的,但允许您将代码作为数据进行操作,也就是元编程。相关语言包括 MetaML 和 MetaOCaml。查看 Tim Sheard 的作品。
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 宏:
- Haskell 有模板 Haskell。
- Boo 有宏。
- O'Caml 有camlp5,它是一个复杂的预处理器。
免责声明:我还没有真正使用过这些。据我所知,它们都比 Lisp 的复杂得多quote
。
然而,90% 的“代码即数据”使用quote
可以通过闭包来完成,因为它们也会延迟评估。许多语言都有一种方便的语法来制作闭包(尤其是 C#、Clojure、Scala 和 Ruby),并且不需要quote
那么多。即使在作为最终 Lisp 的 Scheme 中,流行的风格也倾向于传递函数而不是编写宏。
如果您只是在寻找以静态类型语言动态执行代码的能力,那么 Java 本身可以做到这一点:
http://www.javaworld.com/javaworld/jw-06-2006/jw-0612-dynamic.html
如果您需要更多(希望方法和类作为一流的对象等),那么您将需要使用 Haskell 或 C# 之类的东西(如其他答案中所述)。
也许Strongtalk或Zero是像Smalltalk一样的反射系统,但是是静态类型的。