macros - 向 Clojure 的 defrecord 构造函数添加功能的推荐宏?

标签 macros constructor clojure record

clojure 中的 defrecord 允许使用自定义字段定义简单的数据容器。

例如

user=> (defrecord Book [author title ISBN])
user.Book

结果的最小构造函数仅采用位置参数,没有附加功能,例如默认字段、字段验证等。
user=> (Book. "J.R.R Tolkien" "The Lord of the Rings" 9780618517657)
#:user.Book{:author "J.R.R Tolkien", :title "The Lord of the Rings", :ISBN 9780618517657}

总是可以编写包装默认构造函数的函数以获得更复杂的构造语义 - 使用关键字参数,提供默认值等。

这似乎是宏提供扩展语义的理想场景。人们为更丰富的 defrecord 结构编写和/或推荐了哪些宏?

最佳答案

支持完整和部分记录构造函数以及支持可评估打印和 pprint 表单的示例:

  • http://david-mcneil.com/post/765563763/enhanced-clojure-records
  • http://github.com/david-mcneil/defrecord2

  • David 是我的一个同事,我们在我们的项目中广泛使用了这个 defrecord2。我认为这样的事情应该真正成为 Clojure 核心的一部分(当然,细节可能会有很大差异)。

    我们发现很重要的事情是:
  • 能够使用命名(可能是部分)参数构造记录:(new-foo {:a 1})
  • 能够通过复制现有记录并进行修改来构建记录:(new-foo old-foo {:a 10})
  • 字段验证 - 如果您传递声明的记录字段之外的字段,则会引发错误。当然,这实际上是合法的并且可能有用,所以有办法让它成为可选的。由于它在我们的使用中很少见,因此它更有可能是一个错误。
  • 默认值 - 这些非常有用,但我们还没有实现它。 Chas Emerick 在此处撰写了有关添加对默认值的支持的文章:http://cemerick.com/2010/08/02/defrecord-slot-defaults/
  • 打印和 pprint 支持 - 我们发现以一种可评估回原始记录的形式打印和 pprint 记录非常有用。例如,这允许您运行测试、滑动实际输出、验证它并将其用作预期输出。或者从调试跟踪中刷出输出并获得真正的可评估表单。
  • 关于macros - 向 Clojure 的 defrecord 构造函数添加功能的推荐宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3856704/

    相关文章:

    c - 在 C 中连接多个字符串的更好方法是什么

    visual-studio - 在 Visual Studio 2008 中构建特定解决方案后,有没有办法运行外部可执行文件?

    c++ - C++设计:基类构造函数和自定义字符串类的is-a或has-a关系

    c# - 强制仅从序列化中调用构造函数

    ios - block 中的宏捕获 self

    #define 可以在预处理中处理算术运算吗?

    多次调用的 C++ 静态成员析构函数

    java - 无法将 cookie 从 Selenium webdriver 传递到 clojure 中的 httpclient cookie 存储

    Clojure ^floats 与 #^floats?

    clojure - 为什么 conj 和 cons 的参数顺序不同