Clojure记录构造函数不是一流的?

时间:2011-02-16 12:01:16

标签: clojure clojureclr

显然,你不能使用记录构造函数调用apply:

(defrecord Foo. [id field])

(apply Foo. my-list)

在读取时失败,因为它不期待Foo。在那个地方。

我能想到的唯一明显的解决方法是添加工厂功能:

(make-foo [id field] (Foo. id field))

当然可以应用。

我错过了什么吗?我期待这个来自C#/ Java,但只是觉得它在Clojure中有点令人失望......

3 个答案:

答案 0 :(得分:10)

重新回到1.3后......

在Clojure 1.3中,defrecord创建了两个生成的构造函数。给出:

(defrecord Person [first last]) 

这将创建一个位置构造函数->Person

(->Person "alex" "miller")

和地图构造函数map->Person

(map->Person {:first "string"})

因为这是一个映射,所有键都是可选的,并在构造的对象中取nil值。

您应该在声明记录的ns中要求/使用这些函数,但不需要像使用Java类构造函数那样导入记录类。

更多详情:

答案 1 :(得分:6)

Foo.是一个Java类构造函数,因此它具有典型的Java互操作约束以及您如何调用它。创建构造函数是一种常见的解决方案(这也意味着您不必在不同的命名空间中导入Foo)。

答案 2 :(得分:3)

问题是众所周知的,在Clojure邮件列表上有很多关于它的讨论。未来的Clojure版本可能会增加更多的支持。

现在您必须使用自己的功能或使用支持某些功能的https://github.com/david-mcneil/defrecord2

  • 以可评估的形式打印
  • 提供clojure函数作为构造函数
  • 在构造函数
  • 中接受命名参数(maps)
  • 参与前/后步行多方法