问题标签 [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.
loops - 循环遍历宏的参数
我正在尝试在 Clojure 中编写一个宏,它允许评估一系列简单的“def”表达式。在宏方面,我是一个 n00b。这个想法是
应该扩大到
以下代码针对两个 def 的特殊情况完成此操作
这很好,但我无法概括这一点。我尝试了一些简单的事情,涉及循环遍历元素的绑定,(partition 2 args)
但我总是得到垃圾(我知道这不是很具体,但垃圾的多样性和范围似乎有点太多,无法在这里报告)。我如何遍历这些并评估我的 defs?
PS宏my-defs
是一个玩具。最后我真正想要完成的是一个小助手宏来实例化一堆多方法实例。目前我有大块的代码看起来像
这有点难看。如果我能做类似的事情就好了
反而。
clojure - 方案-> Clojure:方法中带有谓词的多方法?
我正在将一些 Scheme 代码转换为 Clojure。最初使用的调度模式与多方法非常相似,但对匹配谓词采用了倒置的方法。例如,有一个通用函数“assign-operations”。目前,精确的实现细节并不太重要,但请注意它可以采用参数谓词列表。
分派的函数提供这些谓词,函数的元数中的每个参数一个。
稍后,当调用通用函数“merge”时,会询问每个处理程序是否适用于操作数。
据我了解多方法,调度函数是在一组实现中定义的,根据 dispatch-fn 的返回值调度到特定方法。在上面的 Scheme 中,新的赋值操作函数可以任意定义谓词。
Clojure 中的等价的惯用构造是什么?
编辑:上面的代码来自Alexey Radul 和 Gerald Sussman的“传播者的艺术” 。
clojure - Clojure 多方法与协议
我是 Clojure 新手,正在寻找一些关于何时使用协议以及何时使用多方法的具体示例。我知道协议通常旨在创建类型层次结构和典型的 OOP 事物,它们是在多方法之后添加到语言中的,并且协议通常具有更好的性能,所以我的问题是:
协议是否旨在取代多方法?如果没有,你能给我一个例子,我会使用多方法而不是协议吗?
emacs - 通过 Slime 重新加载多方法
在使用 Slime repl 在 Emacs 中开发时,我无法重新加载多方法。
重新定义defmethod
表单可以正常工作,但如果我更改调度功能,我似乎无法重新加载defmulti
表单。我想我专门添加或删除了调度函数参数。
作为一种解决方法,我已经能够ns-unmap
使用多方法 var,重新加载defmulti
表单,然后重新加载所有defmethod
表单。
大概这是 Clojure 实现多方法的方式的“限制”,即我们为执行速度牺牲了一些活力,但是有没有任何习惯用法或开发实践可以帮助解决这个问题?
clojure - defmethod 包罗万象
我有一个专门处理两个参数的多方法:
拥有类型允许我将不同的 defmethod 调用分组:
但是,有时,我想要一个组的全部或默认值,如果其他组都不匹配,则会调用它:
tag
但是,除非is 实际上,否则这是行不通的:default
。
有什么好方法可以做到这一点?
c# - C# 中的静态(编译时/严格类型)多调度支持
我最近发现自己在我的代码中一遍又一遍地使用相同的模式。基本上,它是访问者模式的一种变体,我使用它来将对基类实例的引用解析为派生实例。这种方法需要大量样板代码。
问题:
- 如何在不编写大量访问者代码的情况下以静态/严格类型的方式在 C# 中多分派一个方法?
- 是否有生成此代码的工具/扩展?
- 为什么 C# 语言中没有解决多分派的问题?我不相信我是唯一一个觉得这很烦人的人。我可能大错特错,问题不存在,所以我想知道你是如何处理它的。
clojure - 多方法如何解决命名空间问题?
我正在研究编程语言设计,我对如何用多方法泛型函数范式替换流行的单调度消息传递 OO 范式感兴趣。在大多数情况下,这似乎很简单,但我最近陷入困境并希望得到一些帮助。
在我看来,消息传递 OO 是一种解决两个不同问题的解决方案。我在下面的伪代码中详细解释了我的意思。
(1) 解决调度问题:
=== 在文件 animal.code ===
=== 在文件 myprogram.code ===
在这个问题中,“bark”是一种具有多个“分支”的方法,这些“分支”的操作取决于参数类型。我们为每个我们感兴趣的参数类型(狗和猫)实现一次“吠叫”。在运行时,我们能够遍历动物列表并动态选择要采用的适当分支。
(2) 解决命名空间问题:
=== 在文件 animal.code ===
=== 在文件 tree.code ===
=== 在文件 myprogram.code ===
在这个问题中,“bark”实际上是两个概念上不同的函数,它们恰好具有相同的名称。参数的类型(无论是狗还是树)决定了我们实际指的是哪个函数。
多方法优雅地解决了问题 1。但我不明白他们如何解决问题 2。例如,上面两个示例中的第一个可以直接转换为多方法:
(1) Dogs and Cats 使用多方法
=== 在文件 animal.code ===
=== 在文件 myprogram.code ===
关键是方法 bark(Dog) 在概念上与 bark(Cat) 相关。第二个例子没有这个属性,这就是为什么我不明白多方法是如何解决命名空间问题的。
(2) 为什么多方法对动物和树木不起作用
=== 在文件 animal.code ===
=== 在文件 tree.code ===
=== 在文件 myprogram.code ===
在这种情况下,应该在哪里定义泛型函数?它应该在动物和树之上的顶层定义吗?将 bark for animal 和 tree 视为相同泛型函数的两种方法是没有意义的,因为这两个函数在概念上是不同的。
据我所知,我还没有找到解决这个问题的任何过去的工作。我看过 Clojure 多方法和 CLOS 多方法,它们有同样的问题。我正在祈祷,希望能找到一个优雅的解决方案,或者一个有说服力的论据,说明为什么它在实际编程中实际上不是问题。
如果问题需要澄清,请告诉我。我认为这是一个相当微妙(但很重要)的观点。
感谢理智、Rainer、Marcin 和 Matthias 的回复。我理解您的回复并完全同意动态调度和命名空间解析是两件不同的事情。CLOS 不会将这两个想法混为一谈,而传统的消息传递 OO 则可以。这也允许将多方法直接扩展到多继承。
我的问题具体是在合意的情况下。
以下是我的意思的一个例子。
=== 文件:XYZ.code ===
=== 文件:POINT.code ===
=== 文件:GENE.code ===
==== 文件:my_program.code ===
由于命名空间解析与分派的混合,程序员可以天真地对所有三个对象调用 get-x()。这也是完全明确的。每个对象都“拥有”自己的一组方法,因此程序员的意思不会混淆。
将此与多方法版本进行对比:
=== 文件:XYZ.code ===
=== 文件:POINT.code ===
=== 文件:GENE.code ===
==== 文件:my_program.code ===
因为 XYZ 的 get-x() 与 GENE 的 get-x() 没有概念上的关系,所以它们被实现为单独的通用函数。因此,最终程序员(在 my_program.code 中)必须明确限定 get-x() 并告诉系统他实际上要调用哪个get-x()。
确实,这种显式方法更清晰,更容易推广到多重分派和多重继承。但是使用(滥用)调度来解决命名空间问题是消息传递 OO 的一个非常方便的特性。
我个人觉得我自己的 98% 的代码都使用单调度和单继承来充分表达。与使用多重分派相比,我更倾向于使用分派来进行命名空间解析,因此我不愿意放弃它。
有没有办法让我两全其美?如何避免在多方法设置中明确限定我的函数调用?
似乎共识是
- 多方法解决了调度问题,但不攻击命名空间问题。
- 概念上不同的函数应该有不同的名称,并且应该期望用户手动限定它们。
然后我相信,在单继承单调度就足够的情况下,消息传递 OO 比泛型函数更方便。
这听起来像是开放研究。如果一种语言要为多方法提供一种也可用于命名空间解析的机制,那会是一个理想的特性吗?
我喜欢泛型函数的概念,但目前觉得它们经过优化,可以让“非常难的事情变得不那么难”,而牺牲了“琐碎的事情有点烦人”。由于大多数代码都是微不足道的,我仍然认为这是一个值得解决的问题。
clojure - 为什么 Clojure 的多方法优于 'if' 或 'case' 语句
我花了一些时间,试图了解 Clojure 多方法。据我所知,主要的“专业”多方法论点是它们的灵活性,但是,我对为什么多方法比简单的 if 或 case 语句更好的论点感到困惑。请有人解释一下,多态性和过分夸大的案例陈述之间的界限在哪里?
编辑:我应该在这个问题上更清楚,与“if”语句相比,我更感兴趣。非常感谢您的回答!
perl - 如何扩展 Class::Multimethods::Pure 以识别 Moose 角色?
我需要使用 Moose 对象进行多方法调度。我正在使用Class::Multimethods::Pure进行此操作。我选择了这个而不是MooseX::MultiMethods,因为它依赖于MooseX::Method::Signatures,它无法安装在我的系统上,因为它没有通过测试。我不介意您是否有其他建议方法。
以下适用于类型和子类型:
但是我现在需要处理的场景是声明的类型实际上是 Moose 角色:
但这无法识别角色:
文档说它可以通过各种方式进行扩展,包括添加 Perl 6-ish 角色。但这对我来说有点粗略,我正在寻找一个更详细的例子。有没有人试过这个?
clojure - 多方法的一般语法
如果这个问题是微不足道的,我很抱歉,但是一些谷歌搜索并没有把我带到任何地方。defmulti
和的一般语法是defmethod
什么?我可以编写简单的多方法,但我不确定我可以将文档字符串、前后条件、元数据等放在哪里。
我实际上对 ClojureScript 比对 Clojure 更感兴趣,所以如果两者之间存在差异,请告诉我。