Clojure 条件映射参数作为 arglist 的元数据提供

标签 clojure assertions assertion design-by-contract

在特殊形式的 Clojure 文档中 ( http://clojure.org/special_forms )

条件映射参数描述如下:

The condition-map parameter may be used to specify pre- and postconditions for a function. It is of the following form:

{:pre [pre-expr*] :post [post-expr*]}

where either key is optional. The condition map may also be provided as metadata of the arglist.



我可以将条件映射作为一个块添加到 (defn [x] {:pre [] :post []}...) 就好了,但我不太明白关于能够提供条件的评论-map 作为 arglist 的元数据。

我对 Clojure 很陌生,刚刚开始学习元数据。有人可以举例说明如何做到这一点吗?

谢谢,

马特。

最佳答案

(defn foo ^{:pre [(even? x)] :post [(pos? %)]} [x]
  ;;      <-- metadata attached to arglist --> \ /
  ;;                                            |
  ;;                               arglist -----/
  (inc x))

调用上面的 REPL:
user=> (foo 0)
1
user=> (foo -2)
AssertionError Assert failed: (pos? %)  user/foo (NO_SOURCE_FILE:2)
user=> (foo 1)
AssertionError Assert failed: (even? x)  user/foo (NO_SOURCE_FILE:2)

关于Clojure 条件映射参数作为 arglist 的元数据提供,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28192674/

相关文章:

clojure - Clojure 1.3 中的记录将如何变化?

clojure - 在Clojure中,如何将结合了具有相同键的映射的多个映射合并到列表中?

java - Clojure data.xml 错误

java - 如何以相同的顺序在另一个列表中断言一个列表

audio - 为什么我的 Clojure 项目在 Raspberry Pi 上运行缓慢?

c# - 如何实现XUnit描述性Assert消息?

junit - jUnit中的ExpectedException?

javascript - map 功能js断言测试上的forEach未运行

asynchronous - 异步/等待函数中的 Expect.assertions

dictionary - 落在引用/指针上的类型断言