问题标签 [clojure-protocol]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
701 浏览

haskell - Clojure - 按返回类型分派?(与 Haskell 类型类一样富有表现力)

这是关于 Clojure 与 Haskell 等其他语言的表达能力的问题。更广泛的问题是表达问题的解决方案

这个问题得出的结论是,通常 Clojure 协议(和多方法)不如 Haskell 类型类具有表达力,因为协议在第一个参数上分派,而 Haskell 类型类可以在返回类型上分派。(现在我觉得这个推理真的很有趣,对发动语言战争没有兴趣。我只对思路清晰感兴趣)。

作为打破这个推理的一部分——我的问题是——我们不能创建一个在返回类型(或类型提示)上调度的 Clojure 多方法。我认为我们可以将以下表达式放入 Clojure 多方法中:

函数是:


编辑:关键是我可以运行:

并在没有函数评估的情况下得到以下结果:

即我有一些关于我的函数的预期类型的​​信息,但没有对其进行评估。


编辑 3(2014 年 4 月 24 日):

假设我有以下类型:(deftype string-type [])

然后我根据这些类型定义了以下函数:

现在我编写一个函数来调度它们的返回类型,如下所示:

然后我写一个宏在编译时运行它

然后我像这样测试它:

这给出了以下结果:

所以我似乎是在返回类型上进行调度。

0 投票
1 回答
320 浏览

clojure - Clojure deftype 和协议

我的(ns 处理程序)中有这个 Clojure 代码

在我的 core.clj 中,我得到了这段代码(省略了几行和命名空间的东西):

the-action-handler是 deftype 处理程序之一的有效实例。当我尝试编译时,出现此错误:

当将无效数量的参数传递给协议函数时,我确实读过有关误导性错误消息的信息,但是,如您所见,情况并非如此。

可能是什么问题?有什么建议么?格雷格

0 投票
1 回答
185 浏览

clojure - Clojure 编译器是否检查记录和类型是否实现协议?

Clojure 编译器是否旨在检查表明它实例化协议的记录或类型是否实际上实现了其中列出的方法?

我现在正在尝试这个,到目前为止,它似乎没有。

0 投票
1 回答
492 浏览

clojure - 是否有 Clojure 编译时工具来检查记录或类型是否实际实现了它声称的协议?

似乎 Clojure 编译器默认不这样做:Clojure 编译器是否检查记录和类型是否实现协议?

有没有可以做到这一点的 Lein 插件?

0 投票
1 回答
594 浏览

clojure - 创建用于 Java 的协议和 defrecords 库

目前,我有一个从 Java 调用的功能齐全的 Clojure 库。

我这样做的方式:我有一个文件,它使用 gen-class 将整个 API 包装为单个类的静态方法,并以 IPersistentVector 和 IPersistentMap 的形式传入和传出数据。

然而,现在我正在重构库并将功能置于各种协议后面。

我有四个协议,我们称它们为 A、B、C 和 D。还有两个定义记录 X 和 Y。X 和 Y 都实现了协议 A、B 和 C。而 Y 也实现了 D。

我需要做什么才能使这些对 Java 可用?这些是否可以作为接口和类自动使用?还是我仍然需要做相当于 gen-class 的操作才能将它们公开?

如果不是,那么 gen-class :methods 子句的等价物是什么,我在其中为方法的参数定义 Java 类型?

有没有人有一个简单的例子让 Java 可以使用协议和记录?

0 投票
0 回答
173 浏览

clojure - 如何通过协议实现接口?

使用extend-protocol,协议P可以为任何实现接口的东西提供默认实现I。这实质上是在教导I人们做新事物。如果我们想要一个类型或记录来提供I我们仍然需要扩展它们的功能I

有没有办法根据 的行为来指定I行为(它的方法)P

实际上想要完成什么

我的协议P(就像一个流)必须(seq [this] [this timeout-value])提供序列访问。第二个参数是在流过期时返回一个特殊值。(结束序列会有混乱。)

P也有(close [this])

我希望扩展P的对象可以在clojure.core/seq(作为 a Sequable)中使用并且还可以实现java.io.Closeable. 实现此目的的一种方法是从类型/记录中删除这些方法并仅在类型/记录中P实现Sequable& 。Closeable但是当有人递给我时,我P不确定它是否可以关闭或seq编辑。叫我面向对象,但是P extends I.

寻找

  • 这是不可能的(目前)。
  • 可以使用此代码完成...
  • 它可以重新设计以达到类似的效果......

如果P'seq是多重性是一个问题,seq&seq'也会这样做。

0 投票
1 回答
357 浏览

clojure - 另一个命名空间中 clojure 协议的优先级

clojure.java.jmx在一个Destract使用objects->data.

当我完成单个数据结构时,应该可以做一个(walk/prewalk jmx/objects->data (jmx/operations "java.lang:type=Threading")).

然而,在Destract协议中有一个函数的实现,这意味着地图将被错误地处理。我可以在我的命名空间中添加一个实现,但因为它也是地图的接口,所以这不起作用。objects->dataclojure.lang.Associativeclojure.lang.IPersistentMapclojure.lang.Associative

因为它,我最终不得不分叉clojure.java.jmx。如果有办法改变偏好,或者收回另一个命名空间中的类型的协议,我就不必这样做了。

有没有办法防止在协议中clojure.lang.Associative优先 clojure.lang.IPersistentMap

如果没有,是否可以为另一个命名空间中的类型撤回协议?关于将协议编译成 Java 接口的方式,甚至有可能实现它吗?