簡體   English   中英

推薦的宏為Clojure的defrecord構造函數添加功能?

[英]Recommended macros to add functionality to Clojure's defrecord constructor?

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表單的示例:

大衛是我的同事,我們在我們的項目中廣泛使用這個defrecord2。 我認為這樣的事情應該是Clojure核心的一部分(細節可能會有很大不同)。

我們發現重要的事情是:

  • 能夠使用命名(可能是部分)參數構造記錄:(new-foo {:a 1})
  • 能夠通過復制現有記錄並進行修改來構建記錄:(new-foo old-foo {:a 10})
  • 字段驗證 - 如果在聲明的記錄字段之外傳遞字段,則拋出錯誤。 當然,這實際上是合法的並且可能有用,因此有一些方法可以使它成為可選的。 由於它在我們的使用中很少見,因此更有可能是錯誤。
  • 默認值 - 這些非常有用,但我們還沒有實現它。 Chas Emerick撰寫了關於在此處添加對默認值的支持的文章: http//cemerick.com/2010/08/02/defrecord-slot-defaults/
  • 打印和打印支持 - 我們發現將記錄打印和打印以可以回復到原始記錄的形式非常有用。 例如,這允許您運行測試,滑動實際輸出,驗證它,並將其用作預期輸出。 或者從調試跟蹤中滑動輸出並獲得真正的可評估表單。

這是一個定義具有默認值和不變量的記錄的方法。 它創建了一個ctor,可以使用關鍵字args來設置字段的值。

(defconstrainedrecord Foo [a 1 b 2]
  [(every? number? [a b])])

(new-Foo)
;=> #user.Foo{:a 1, :b 2}

(new-Foo :a 42)
; #user.Foo{:a 42, :b 2}

就像我說的那樣......不變量:

(new-Foo :a "bad")
; AssertionError

但它們只在特拉梅爾的背景下才有意義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM