17

你能命名具有静态类型检查的语言(如 Java)以及代码在哪里(如 LISP 中的数据)吗?我指的是一种语言中的两件事。

4

6 回答 6

14

Qi 是一种静态类型的 Lisp 方言。此外,许多其他 Lisp 方言具有(可选的)静态类型。

Java 本身的这种能力非常有限。

有趣的问题不是你是否可以拥有元编程和静态类型,而是你是否可以让动态元编程成为静态类型安全的

有 Template Haskell 进行元编程并且类型安全的,但它是静态编程。

目前,我想不出我所知道的任何语言都允许动态元编程并且动态元编程是静态类型安全的。齐可能会这样做,但我不确定。

于 2010-06-18T14:35:38.843 回答
11

Racket(以前称为 PLT Scheme)有一个静态类型的方言,旨在与 Scheme 惯用语(包括宏)很好地配合使用。(它通过类型检查扩展结果来工作。)

于 2010-06-18T18:39:18.380 回答
4

模板 Haskell是静态类型的,但允许您将代码作为数据进行操作,也就是元编程。相关语言包括 MetaML 和 MetaOCaml。查看 Tim Sheard 的作品。

于 2010-06-18T16:28:19.080 回答
4

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那么多。即使在作为最终 Lisp 的 Scheme 中,流行的风格也倾向于传递函数而不是编写宏。

于 2010-06-18T14:32:40.107 回答
0

如果您只是在寻找以静态类型语言动态执行代码的能力,那么 Java 本身可以做到这一点:

http://www.javaworld.com/javaworld/jw-06-2006/jw-0612-dynamic.html

如果您需要更多(希望方法和类作为一流的对象等),那么您将需要使用 Haskell 或 C# 之类的东西(如其他答案中所述)。

于 2010-06-18T14:31:28.873 回答
0

也许StrongtalkZero是Smalltalk一样的反射系统,但是是静态类型的。

于 2010-06-22T16:42:42.550 回答