问题标签 [multimethod]

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 投票
3 回答
319 浏览

role - 为什么 Perl 6 Str 扮演 Positional 角色,如何更改 []?

我正在玩字符串的位置界面。我知道如何像 Python 在 Perl 6 中那样对字符串进行切片?,但我很好奇我是否可以让这件事只为傻笑而工作。

我想出了这个例子。阅读位置很好,但我不知道如何设置multi来处理作业:

最后一个不起作用:

不过,我不认为它会起作用。我不知道它应该有什么签名或特征来做我想做的事。

为什么[]操作员在Str上工作?

文档主要暗示了[]从事位置角色的事物的工作,并且这些事物在列表中,就像事物一样。从[]操作员的文档中

用于对@container 的零个或多个元素进行位置访问的通用接口,也称为“数组索引运算符”。

Str令人惊讶的是,即使它不是@container(据我所知),它也扮演了必要的角色:

有没有办法测试某事是一个@container

有没有办法让一些东西列出它的所有角色?

现在,知道一个字符串可以响应[],我怎样才能确定哪个签名会匹配呢?我想知道正确的签名用于定义我自己的版本以通过[].

0 投票
2 回答
817 浏览

clojure - What does retag parameter in s/multi-spec mean?

Can you explain with examples how does retag parameter impacts multi-spec creation? I find multi-spec documentation hard to digest.

0 投票
1 回答
232 浏览

java - java泛型的Clojure多方法调度

我需要的可能解决方案:

如何为类型的集合实现多方法Map<javaType, javaType>?像这样的东西:


我的问题的完整解释

也许上面的问题不是我需要解决我的问题的解决方案(只是我认为使用泛型的实现可以解决我的问题),所以我认为我需要提供我的问题的完整解释并询问社区我是什么需要做。

我在 Clojure 中使用 java 库。一些函数返回我想要转换为 clojure 映射的 java 类。我正在使用java.data库执行此操作。

在大多数情况下,这可以正常工作。出于某种原因,我需要为几个类实现 java.data 多方法:

但没关系,这很好用:

但是我遇到了一些由于某种原因无法“映射”的类。

映射一个AccountInfo实例后,我希望看到:

但是看到这个:

的返回值类型.getBalances()Map<Currency,Balance>,似乎 java.data 不知道如何使用地图。

所以,我的问题(目前)是如何为这种集合实现 java.data 多方法。像这样的东西:


以防万一,Java 库是 XChange。钱包类的问题。方法 getBalances()。

0 投票
1 回答
83 浏览

clojure - 如何绕过打印方法

我有一个包含很多大地图和其他东西的应用程序,打印时很难阅读,所以我为它们制作了一个自定义打印功能并设置print-method为调用它,如下所示:

在里面fstr1,如果我确定地图不是需要特殊处理的类型之一,我怎么能调用普通的打印方法?

这个答案建议将 a:type放入元数据中,因为print-method它会派发。我在这方面取得了一些成功,但我不能总是控制元数据,所以我希望有一种方法可以从内部“转发”到先前定义的打印方法fstr1


作为参考,这是我当前的实现fstr1

0 投票
2 回答
166 浏览

clojure - 命名空间映射命名空间上的多方法调度

是否可以基于命名空间映射命名空间进行调度,即#:<this-thing>{}?没有像打印或检查键前缀这样的黑客攻击?

我认为最后一个很hacky,因为可以覆盖键前缀:

0 投票
3 回答
335 浏览

clojure - 在不同格式的地图上调度函数调用

我正在写一个 agar.io 克隆。我最近看到了很多限制使用记录的建议(比如这里),所以我试图只使用基本地图来完成整个项目。*

我最终为不同“类型”的细菌创建了构造函数,比如

“定向细菌”添加了一个新条目。该:direction条目将用于记住它前进的方向。

问题是:我想要一个函数take-turn来接受细菌和世界的当前状态,并返回一个向量,[x, y]指示从当前位置移动细菌到的偏移量。我想要一个被调用的函数,因为我现在可以想到至少三种我想要拥有的细菌,并且希望以后能够添加新的类型,每种类型都定义了自己的take-turn.

Can-Take-Turn协议不在窗口,因为我只是使用普通地图。

多方法一take-turn开始似乎可以工作,但后来我意识到在我当前的可扩展设置中我没有可使用的调度值。我可能:direction是调度功能,然后调度nil使用“定向细菌” take-turn,或者默认获得基本的漫无目的的行为,但这并没有给我提供第三种“玩家细菌”类型的方法.

我能想到的唯一解决方案是要求所有细菌都有一个:type领域,并对其进行调度,例如:

但现在我又回到了基本的类型调度,使用比协议更慢的方法。这是使用记录和协议的合法案例,还是我缺少关于多种方法的东西?我和他们没有太多的练习。


*我也决定尝试这个,因为我有一个Bacterium记录并且想要创建一个新的“定向”版本的记录,其中direction添加了一个字段(基本上是继承)。虽然原始记录实现了协议,但我不想做一些事情,比如将原始记录嵌套在新记录中,并将所有行为路由到嵌套实例。每次创建新类型或更改协议时,我都必须更改所有路由,这是很多工作。

0 投票
2 回答
168 浏览

oop - Perl 6 多方法从不匹配预期的签名

我有一个有两个多方法(multi submit)的类。

我这样称呼我的多:

哪个被运到我的班级:

但是我总是得到以下回复:

尽管我的命名参数 ( :message) 是Str必需的并且@models声明了默认值。

0 投票
1 回答
93 浏览

clojure - “ISA”是怎样的?基于多方法而不是 instanceof 的语法糖?

我从clojure 网站举个例子。

这个功能很酷。我试图了解为什么这优于(例如)java 中基于 instanceof 的实现的技术原因。在我看来,它在功能上基本上等同于更好的语法。

为什么 multimethods 被认为是基于访问者模式的双重调度的一个很好的替代方案,而 instanceof 在它们看起来基本上在做同样的事情时却不是?

0 投票
0 回答
80 浏览

python - 多方法联合类型不支持正确重载

我正在使用multimethod包(1.4)来重载方法。我需要有联合类型(或 TypeVar)作为输入类型;但是,这会导致问题。例子:

这工作正常,并输出

正如预期的那样。但是,此代码崩溃:

输出:

有没有办法拥有联合类型不同数量的参数?谢谢!

0 投票
2 回答
206 浏览

python - Python中基于关键字参数名称的多方法/调度函数

编辑#1:我已经按照建议使用“手动”基于 if/else 的解决方案更新了示例,以证明需要进一步自动化。


在基于关键字参数名称而不是类型选择目标函数的情况下,如何有效地调度函数(即实现类似multimethods的函数)?

我的用例是为数据类实现多个工厂方法,这些数据类的字段相互依赖,并且可以根据这些字段的不同子集进行初始化,例如

下面是一个使用递归的示例,它可以正常工作,但需要大量手写的容易出错的代码,并且不能真正扩展到更复杂的情况。

我正在寻找一种解决方案,该解决方案可以扩展到具有许多字段和复杂初始化路径的数据类,而另一方面需要更少的手写代码,并且有很多重复和错误来源.. 上面代码中的模式非常明显并且可以是自动化的,但我想确保在这里使用正确的工具。