gpt4 book ai didi

clojure - 为什么 Clojure 有 5 种定义类的方法而不是只有一种?

转载 作者:行者123 更新时间:2023-12-02 05:35:12 26 4
gpt4 key购买 nike

Clojure 具有 gen-class、reify、proxy 以及 deftype 和 defrecord 来定义新的类数据类型。对于一种重视语法简单性并厌恶不必要的复杂性的语言来说,这似乎是一种畸变。有人可以解释为什么会这样吗? Common Lisp 风格的 defclass 就足够了吗?

最佳答案

这是三个不同因素的混合:

  1. jvm 的特定类型系统
  2. 定义类型时,不同用例需要稍微不同的语义
  3. 事实上,随着语言的发展,其中一些是较早开发的,有些是较晚开发的。

首先,让我们考虑一下它们的作用。 deftypegen-class 的相似之处在于,它们都为提前编译定义了一个命名类。在 clojure 1.2 中,Gen-class 排在第一位,其次是 deftype。 Deftype 是首选,并且具有更好的性能特征,但限制更多。 deftype 类可以符合接口(interface),但不能从另一个类继承。

Reifyproxy都用于在运行时动态创建匿名类的实例。 Proxy 首先出现,reify 在 clojure 1.2 中与 deftype 和 defrecord 一起出现。 Reify 是首选,就像 deftype 一样,语义没有太大限制。

这就留下了一个问题:为什么 deftype 和 defrecord 是同时出现的,并且具有相似的作用。对于大多数目的,我们会想要使用 defrecord:它具有我们所了解和喜爱的所有 clojure 优点、可排序性等等。 Deftype 旨在用作实现其他数据结构的低级构建 block 。它不包括常规的 clojure 接口(interface),但它确实具有可变字段的选项(尽管这不是默认设置)。

如需进一步阅读,请查看:

The clojure.org datatypes page

The google group thread where deftype and reify were introduced

关于clojure - 为什么 Clojure 有 5 种定义类的方法而不是只有一种?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7142495/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com