什么是Jepsen上下文中的Extend-protocol?

时间:2018-01-22 00:32:00

标签: syntax clojure jepsen

我是clojure的新手,我正在试图弄清楚Jepsen做了什么,这是一个用来检查分布式系统一致性的软件。

  • 我的问题是:
    1. extend-protocol有什么作用?
    2. 更具体地说,在Jepsen.Generator中,op中的Protocol是什么。
    3. mix在上下文中的含义

亲切的问候

1 个答案:

答案 0 :(得分:1)

  

extend-protocol有什么作用?

协议是一个抽象的东西,看起来像Java中的接口。它什么都不做,但其他一些实体可能会实现它。在Java中,您声明了一个实现接口的类。在Clojure中,你扩展了一个 具有自定义类型的特定协议,其中deftypedefrecord在其上调用extend-protocol

使用类型扩展协议时,需要指定该协议中提到的签名的实现。

一个很好的例子可能是JSON序列化。说,协议如下所示:

(defprotocol JSON
  (to-json [obj]))

如果您对任何值调用(to-json ...),则会发出错误消息,指出该类型没有to-json实施。你需要扩展它:

(extend-protocol JSON

  Integer
  (to-json [obj] (str obj))

  Boolean
  (to-json [obj]
    (if obj "true" "false")))

现在,调用(to-json 42)(to-json false)即可。您可以为其余类型扩展该协议:浮点数,数组,映射等。

  

协议中的操作是什么

协议没有实现,只有签名。 os是某个函数的签名,只需要三个参数:[gen test process]。它取决于它应该返回什么。例如,您可以引用line #46clojure.lang.AFunction类型实现其行为的位置。由于我对jepsen不熟悉,所以我不能多说。

  

混合在上下文中意味着什么

我认为它的文档字符串非常清晰,代码也是如此。我收集了一群人。如果它为空,则结果将是名为void的特殊Generator实例。它是一种匿名类型,在没有任何计算的情况下调用nil时,扩展了Generator协议只返回op

gens不为空,代码返回一个Generator类型的实例,其中op实现在执行gen时采用随机op

希望这会有所帮助。

相关问题